hadoop安裝教程

hadoop安裝集合教程

1、僞分佈式系統搭建

hadoop-2.7
jdk-1.8node

jdk安裝 配置在環境變量配置/etc/profileweb

$vim /etc/profile
#add JAVA_HOME
export JAVA_HOME....

配置免密登陸:apache

在作免密登陸的時候須要集羣中的全部節點之間互相之間進行免密,同時還須要自身和自身進行免密登陸(master)節點bootstrap

$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
 $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
 $ chmod 0600 ~/.ssh/authorized_keys

解壓hadoop 壓縮包vim

$ tar -zxvf hadoop-xx-xx-xx.tar.gz

配置hadoop環境變量centos

$vim /etc/profile
#add hadoop bin sbin

export HADOOP_HOME=xxxx
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin

配置etc/hadoop/hadoop-env.sh 文件中的 JAVA_HOMEbash

$ export JAVA_HOME=/....

進行hadoop相關配置網絡

hostname配置,主機名配置,根據節點名稱進行配置hostname每一臺機器都須要進行相關配置架構

集羣中有多少個節點就配置多少個主機名,這樣能夠經過主機名進行機器之間的訪問app

master 192.168.56.100

修改主機名vim /etc/sysconfig/network

master

重啓網絡服務

$ systemctl restart network

檢查是不是maste

$ hostname

如上就是主機名稱修改,針對centos7其餘節點也須要進行相應的修改

配置hadoop/etc/core.site.xml

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/hadoop-2.7.7/tmp</value>
    </property>
</configuration>

配置hadoop/etc/hdfs.site.xml

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>1</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>master:50090</value>
    </property>
</configuration>

上面的配置完成以後須要進行關閉防火牆操做才能訪問到http://192.168.56.100:50070

關閉防火牆命令

$ systemctl stop firewalld.service  #root
$ systemctl disable firewalld.service #root

格式化並啓動單節點僞分佈式

$ hadoop namenode -format
$ start-hdfs.sh

上面進行的是單節點的僞分佈式的部署,下面經過修改master節點中的數據內容進行徹底分佈式的搭建,這裏還不是HA的模式,而且也只是單個namenode的模式

2、徹底分佈式-單namenode

節點名稱 節點ip 節點功能
master 192.168.56.100 namenode 節點
worker1 192.168.56.101 datanode 節點
worker2 192.168.56.102 datanode 和 secondarynamenode 節點
worker3 192.168.56.103 datanode 節點

集羣規劃如上:

集羣中須要配置後面的worker1 worker2 worker3節點的主機名和ip映射關係,配置方式如僞分佈式中修改主主機名相同,同時須要在個節點中增長主機名和ip映射

/etc/hosts文件中添加以下內容:

192.168.56.100 master
192.168.56.101 worker1
192.168.56.102 worker2
192.168.56.103 worker3

如第一步,配置完成僞分佈式的單節點以後,只須要在此基礎之上修改咱們的配置文件,而後將咱們的master節點上的內容複製到後面的其餘節點就能夠實現徹底分佈式

下面來進行修改配置

etc/hadoop/core.site.xml

在該文件中指定好咱們的namenode節點,這裏依然放在master節點,不作任何修改,臨時目錄也再也不進行修改

<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://master:9000</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/home/hadoop/hadoop-2.7.7/tmp</value>
    </property>
</configuration>

etc/hadoop/hdfs.site.xml

修改副本數爲2,而且將secondarynamenode節點放在了worker2節點啓動

<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.namenode.secondary.http-address</name>
        <value>worker2:50090</value>
    </property>
</configuration>

slaves文件
修改slaves文件以下,下面就是datanode節點

worker1
worker2
worker3

修改完成以後須要進行免密登陸相關配置,在集羣中,須要經過某一臺機器進行腳本化管理,因此這臺機器須要可以免密登陸其餘機器,通常在master節點上進行設置,後面的心跳機制也須要用到

須要將master節點的公鑰發送到其餘節點,並進行配置

master節點 .ssh

master
 $ scp id_rsa.pub hadoop@worker3:`pwd`/master.pub
 worker3
 $ cat master.pub >> authorized_keys
 $chmod 600 authorized_keys

如上是例子,其餘的節點也須要進行配置,同時master自身也須要給自身配置免密登陸

如上配置完成以後,須要將master中的hadoop安裝包發送到其餘節點

$ scp -r ~/hadoop-2.7.7 hadoop@worker1:`pwd`

如上,須要copy到集羣中的其餘節點,省略了其餘copy內容

配置jdk和上面相同,不進行示例了

關閉相關節點防火牆配置

關閉集羣中全部節點防火牆

$systemctl stop firewalld.service

後面就能夠在master中格式化而且啓動了,可是若是上面僞分佈式中存在咱們配置的臨時目錄tmp的話,須要進行刪除,格式化的時候讓他從新建立,這樣避免和以前你啓動的時候遺留的內容衝突

$ hadoop namenode -format
$ start.dfs.sh

3、QJM-HA模式高可用

節點名稱 節點ip NN-1 NN-2 DN ZK ZKFC JNN
master 192.168.56.100 * * *
worker1 192.168.56.101 * * * * *
worker2 192.168.56.102 * * *
worker3 192.168.56.103 * *

如上就是高可用下的集羣規劃

使用高可用模式中須要用到zookeeper集羣

一、安裝zookeeper集羣

這裏使用的是zookeeper-3.4.13版本的zookeeper

配置ZK的環境變量

須要安裝的節點都須要進行環境變量的設置

export ZOOKEEPER_HOME=/home/hadoop/zookeeper-3.4.13
export PATH=$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH:$ZOOKEEPER_HOME/bin

配置zookeeper-3.4.13/conf/zoo.cfg配置文件

將以下配置換成本身指定的目錄,防止系統將臨時目錄進行刪除

dataDir=/tmp/zookeeper

修改成

dataDir=/home/hadoop/zookeeper-3.4.13/tmp/zookeeper

修改完成以後須要建立這個目錄

$ mkdir -p /home/hadoop/zookeeper-3.4.13/tmp/zookeeper

增長zk節點信息

這裏,server後面的數字表示的是在選舉的時候的參考值,誰的數字大誰就能被選舉爲leader節點,在選舉的時候還有一個持久化id該id表示的是持久化的數據越多id值越大,那個節點的元數據越多就越容易當選,當這個id相同的時候,那麼咱們配置的這個數字就能幫助集羣更快的進行選舉成功

server.1=worker1:2888:3888
server.2=worker2:2888:3888
server.3=worker3:2888:3888

客戶端同行端口號:2181
主從模式:2888
選舉端口號:3888

上面講臨時目錄替換成本身建立的目錄,須要將上面配置選舉的server.1數字分別寫入到每一個節點上的本身建立的臨時目錄下面的myid文件中

在作這步操做以前將配置好的zookeeper安裝包發送到各個節點上

$ scp -r zookeeper-3.4.13 hadoop@worker1:`pwd`
$ scp -r zookeeper-3.4.13 hadoop@worker2:`pwd`
$ scp -r zookeeper-3.4.13 hadoop@worker3:`pwd`

分別寫入數字到文件/home/hadoop/zookeeper-3.4.13/tmp/zookeeper/myid

$ echo 1 > tmp/zookeeper/myid  #worker1
$ echo 2 > tmp/zookeeper/myid  #worker2
$ echo 3 > tmp/zookeeper/myid  #worker3

如上都配置完成以後就能夠啓動zookeeper集羣了

$ zkServer.sh start     #啓動
$ zkServer.sh status    #狀態
$ zkServer.sh stop      #關閉

zookeeper集羣只有在過半的狀況下才可以提供服務,因此在啓動集羣過半以前集羣都是不可用的狀態,角色也沒有進行劃分,只有啓動過半機器以後纔會劃分leaderfloower角色

二、配置hadoop集羣高可用相關配置

根據上面給出的集羣規劃化進行配置

etc/hadoop/hdfs-site.xml增長以下配置

<property>
  <name>dfs.nameservices</name>
  <value>mycluster</value>
</property>
<property>
  <name>dfs.ha.namenodes.mycluster</name>
  <value>nn1,nn2</value>
</property>

<property>
  <name>dfs.namenode.rpc-address.mycluster.nn1</name>
  <value>master:8020</value>
</property>
<property>
  <name>dfs.namenode.rpc-address.mycluster.nn2</name>
  <value>worker1:8020</value>
</property>

<property>
  <name>dfs.namenode.http-address.mycluster.nn1</name>
  <value>master:50070</value>
</property>
<property>
  <name>dfs.namenode.http-address.mycluster.nn2</name>
  <value>worker1:50070</value>
</property>

<!--配置jnode節點-->
<property>
  <name>dfs.namenode.shared.edits.dir</name>
  <value>qjournal://master:8485;worker1:8485;worker2:8485/mycluster</value>
</property>

<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>


<property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence</value>
</property>

<property>
  <name>dfs.ha.fencing.ssh.private-key-files</name>
  <value>/home/hadoop/.ssh/id_rsa</value>
</property>


 <property>
   <name>dfs.ha.automatic-failover.enabled</name>
   <value>true</value>
 </property>

<!--這裏不須要進行配置-->
<!--<property>
  <name>dfs.ha.fencing.methods</name>
  <value>sshfence([[username][:port]])</value>
</property>
<property>
  <name>dfs.ha.fencing.ssh.connect-timeout</name>
  <value>30000</value>
</property>
-->

以上爲新增長內容,同時須要將secondaryNamenode的配置項進行刪除

刪除以下內容

<property>
   <name>dfs.namenode.secondary.http-address</name>
   <value>worker2:50090</value>
</property>

由於在HA模式下是不須要使用到該進程角色

etc/hadoop/core-site.xml配置

增長修改以下配置

<property>
  <name>fs.defaultFS</name>
  <value>hdfs://mycluster</value>
</property>
<!--下面是journalnode 存放Namenode元數據信息目錄,須要本身指定-->
<property>
  <name>dfs.journalnode.edits.dir</name>
  <value>/home/hadoop/tmp/journalnode/data</value>
</property>

 <property>
   <name>ha.zookeeper.quorum</name>
   <value>worker1:2181,worker2:2181,worker3:2181</value>
 </property>

配置文件完成了

下面進行配置的是免密登陸,上面在僞分佈式中,master節點做爲namenode啓動節點,已經作了相關的免密登陸,可是如今是主從的形式,增長了一個新的namenode節點,那麼須要將其也進行免密登陸配置,同時masterworker1兩個namenode節點之間也須要進行免密配置,這裏由於須要兩個節點之間ZKFC進程可以互相訪問

ZKFC進程是個能夠在非NameNode節點部署的,可是由於網絡的問題,不這樣作,會形成網絡延遲,因此ZKFC節點NameNode就部署在同一個節點上

下面進行免密配置:

主要配置的是,其餘節點和worker1節點worker1自身免密,masterworker1節點之間的免密

$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa #worker1節點生成祕鑰和公鑰

分別將公鑰copy到其餘須要進行免密登陸的節點

$ scp ~/.ssh/id_rsa.pub master:~/.ssh/worker1.pub #worker1
$ cat worker1.pub >> authorized_keys #master

如上分別進行操做,實現免密登陸

配置完成以後須要作好驗證,看是否可以進行免密登陸

修改完成以後,將master節點修改的hdfs-site.xml、core-site.xml文件copy到其餘節點並進行替換

$ scp hdfs-site.xml core-site.xml worker1:`pwd`  #etc/hadoop目錄下執行
$ scp hdfs-site.xml core-site.xml worker2:`pwd`  #etc/hadoop目錄下執行
$ scp hdfs-site.xml core-site.xml worker3:`pwd`  #etc/hadoop目錄下執行

如上都配置完成以後須要將以前的hadoop/tmp目錄刪除,或者在配置文件中從新指定新的目錄也行,主要是避免新的集羣和以前的集羣衝突

以上呢也都配置完成了,後面呢須要將hadoop環境環境變量配置給其餘節點,尤爲是namenode、journalnode的節點須要設置,其餘節點不設置也行

由於在僞分佈式集羣中咱們只設置了master節點的環境變量

三、進行格式化和啓動

在作格式化以前須要將journalnode進程啓動起來

journalnode配置分別是在masterworker1worker2節點上

$ hadoop-daemon.sh start journalnode #master worker1 worker2節點上執行,啓動journalnod進程

namenode節點格式化

namenode節點有兩個,masterworker1,先在master節點上格式化,而且啓動namenode,而後再倒worker1節點進行格式化而且啓動,格式化的時候只須要在一臺namenode機器上進行格式化一次,其餘節點進行同步操做就行

master節點操做

$ hadoop namenode -fromat           #master節點
$ hadoop-daemon.sh start namenode

worker1節點操做

$ hdfs namenode -h          #查看同步命令
$ hfds namenode -bootstrapStandby #進行同步

ZKFC格式化

隨便找一個namenode節點進行格式化操做,由於ZKFC進程是依賴zookeeper集羣的,格式化會在zookeeper中建立一個目錄樹,提供給ZKFC進行鎖爭搶,以控制主從節點切換

$ hdfs zkfc -formatZK

上面格式化完成以後,能夠到zookeeper集羣中查看,查看到多出了hadoop-ha的目錄,查看命令以下

$ zkCli.sh #進入zookeeper終端
$ ls /      #終端輸入

如上都正確配置以後,那麼能夠啓動集羣其餘進程

$ start-dfs.sh

四、問題

既然是高可用,那麼也就是說咱們集羣中的任意一臺namenode掛掉,另一臺的namenode都會從standby切換成active,在測試過程當中,發現沒有切換成功,在zkfc日誌中出現錯誤,缺乏命令

錯誤以下

WARN org.apache.hadoop.ha.SshFenceByTcpPort: PATH=$PATH:/sbin:/usr/sbin fuser -v -k -n tcp 8020 via ssh: bash: fuser: 未找到命令

安裝以下程序包

$ sudo yum install -y psmisc

如上高可用就完了,在namenodeZKFC進程掛了,另一臺機器就會自動切成active繼續提供服務

如上就解決了namenode單點故障集羣下線的問題

4、yarn-HA 集羣搭建

集羣規劃以下所示:

節點名稱 節點ip NN-1 NN-2 DN ZK ZKFC JNN RSM NM
master 192.168.56.100 * * *
worker1 192.168.56.101 * * * * * *
worker2 192.168.56.102 * * * * *
worker3 192.168.56.103 * * * *

在以前的環境中,hdfs高可用已經可以進行工做了,這個時候直接上其餘的計算平臺也是能夠的,好比spark覺得他本身有資源調度的相關實現,可是在hadoop2.x版本以後移除了hadoop1.x中的資源調度相關的角色進程jobTrackertaskTracker,由於這兩個進程會有資源過載單點故障問題,因此若是須要使用hadoop MapReduce分佈式計算框架須要使用到yarn做爲資源調度任務分發的總作!固然spark也能夠在yarn之上進行計算

etc/hadoop/yarn-site.xml配置

添加以下內容,以下內容中使用到的信息,zookeeperResourceManager角色的地址根據本身的配置進行修改

<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
</property>

<property>
  <name>yarn.resourcemanager.ha.enabled</name>
  <value>true</value>
</property>
<property>
  <name>yarn.resourcemanager.cluster-id</name>
  <value>cluster1</value>
</property>
<property>
  <name>yarn.resourcemanager.ha.rm-ids</name>
  <value>rm1,rm2</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm1</name>
  <value>worker2</value>
</property>
<property>
  <name>yarn.resourcemanager.hostname.rm2</name>
  <value>worker3</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address.rm1</name>
  <value>worker2:8088</value>
</property>
<property>
  <name>yarn.resourcemanager.webapp.address.rm2</name>
  <value>worker3:8088</value>
</property>
<property>
  <name>yarn.resourcemanager.zk-address</name>
  <value>worker1:2181,worker2:2181,worker3:2181</value>
</property>

etc/hadoop/mapred-site.xml配置

添加以下內容

<property>
   <name>mapreduce.framework.name</name>
   <value>yarn</value>
</property>

上面在master節點上設置完成以後,將如上的配置分發到其餘節點進行替換

$ scp yarn-site.xml mapred-site.xml worker1:`pwd`
$ scp yarn-site.xml mapred-site.xml worker2:`pwd`
$ scp yarn-site.xml mapred-site.xml worker3:`pwd`

上面若是集羣是啓動的也能夠不進行關閉,下面啓動yarn集羣

yarn,主要是有兩角色進程ResourceManagerNodeManager

NodeManager:該角色主要是在數據節點,經過slaves中的配置進行啓動,主要用來支持計算向數據遷移
ResourceManager:該角色能夠在集羣中的任意幾點,主要用來進行資源調度和任務分發

如上配置完成以後進行啓動yarn

$ start-yarn.sh

上面的啓動腳本只能啓動nodemanager,這個腳本問題,那麼須要本身去ResourceManager節點手動啓動

分別到worker2worker3節點執行下面命令

$ yarn-daemon.sh start resourcemanager

關閉也是如此

$ stop-yarn.sh
$ yarn-daemon.sh stop resourcemanager

如上操做完成以後能夠經過http://worker2:8088http://worker3:8088訪問yarn集羣,也可嘗試讓一臺的ResourceManager進程掛掉,天然另一臺就會自動切換成active模式

如上的yarn高可用就作完了

5、spark on yarn HA(spark基於yarn高可用搭建)

集羣規劃以下:

節點名稱 節點ip NN-1 NN-2 DN ZK ZKFC JNN RSM NM Master Worker
master 192.168.56.100 * * * *
worker1 192.168.56.101 * * * * * * * *
worker2 192.168.56.102 * * * * * *
worker3 192.168.56.103 * * * * *

上面新增長了兩個角色進程,這兩個進程都是spark的進程,固然在搭建高可用的架構中都會是用到zookeeper,只須要搭建一套就能夠了,一套就能給咱們提供服務

Master:spark主節點,主要用來和計算節點進行溝通管理,創建心跳,監控集羣狀況等功能
Worker:主要用來提供計算,接收資源分配,接收計算任務等功能

spark內部有本身實現的資源調度框架,可是爲了未來更好的和其餘框架進行擴展,就是用yarn來作資源調度了

使用到的包,這裏使用最新版本的,spark2.4,scala使用的也是最新的發行版scala-2.12.7

scala的環境變量是能夠不進行配置的,若是本身沒有使用到的話,搭建過程當中也不會使用到,我只是順手將其進行配置

spark/conf/slaves文件配置

增長以下配置

worker1
worker2
worker3

上面配置須要注意,咱們spark是計算平臺,因此進行計算的時候須要將其配置在hadoop datanode所在的節點,計算和數據在一塊兒,這樣節省計算的時候數據傳輸的網絡開銷,上面配置的就是worker角色進程

spark/conf/spark-env.sh文件配置
這個文件中能夠配置不少環境變量,spark支持不少的不一樣的資源調度框架,不一樣的資源調度框架有不一樣的配置,這裏使用的是yarn

export JAVA_HOME=/home/hadoop/jdk1.8.0_181
export SCALA_HOME=/home/hadoop/scala-2.12.7
export HADOOP_CONF_DIR=/home/hadoop/hadoop-2.7.7/etc/hadoop
export HADOOP_HOME=/home/hadoop/hadoop-2.7.7
export SPARK_MASTER_PORT=7077
#正真作高可用的配置只有下面兩行
export SPARK_MASTER_HOST=worker1
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=worker1:2181,worker2:2181,worker3:2181 -Dspark.deploy.zookeeper.dir=/spark"

SPARK_MASTER_HOST:這個配置須要注意,這個配置只須要在你規劃的master角色進程的節點進行配置,配置成你所在節點的主機名或者ip都行,其餘節點不須要進行配置,固然,若是是圖方便,在一臺上修改了,copy到其餘節點,那麼只須要將master角色進程所在的那些節點修改就能夠了,其餘節點不修改也行!如上面規劃,個人master角色進程是在,master節點worker節點因此只須要修改這兩個節點,其餘的節點就這個配置而言,無所謂!

SPARK_DAEMON_JAVA_OPTS

spark.deploy.recoveryMode:該配置是spark官方配置列表中的,參數有三個,分別是ZOOKEEPERNONEFILESYSTEM,做用分別是,一、進行高可用配置,自動切換集羣的master active 和 standby,二、不作任何事情,三、在master角色進程下線的時候有任務再跑,任務狀態會被記錄,當重啓的時候會自動恢復,固然存在延時,會形成數據丟失,通常生產級別都用高可用了
spark.deploy.zookeeper.url:指定zk集羣的通訊地址,上面全部作高可用的配置都會配置到這個內容
spark.deploy.zookeeper.dir:下面這個就是在zookeeper中建立一個目錄樹,用來保存master角色進程的鎖文件,和一些集羣信息

我是在master節點進行修改的配置,因此下面將這些配置進行分發

$ scp spark-2.4 worker1:`pwd`
$ scp spark-2.4 worker2:`pwd`
$ scp spark-2.4 worker3:`pwd`

記住要修改master角色進程中的SPARK_MASTER_HOST配置

配置完成以後,就能夠進行啓動了

$ ./sbin/start-master.sh    #分別在master worker1節點啓動master進程
$ ./sbin/start-slaves.sh    #啓動worker進程

啓動完成以後,能夠訪問http://master:8080http://worker1:8080

查看他們的狀態,嘗試kill 一個active的master進程,看是否能自動切換!

配置到此結束,還有些自定義配置,好比pid這些均可以本身根據需求加配置就完了

相關文章
相關標籤/搜索