hadoop-2.7
jdk-1.8
node
jdk安裝 配置在環境變量配置/etc/profile
web
$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
的模式
節點名稱 | 節點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
節點名稱 | 節點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
集羣只有在過半的狀況下才可以提供服務,因此在啓動集羣過半以前集羣都是不可用的狀態,角色也沒有進行劃分,只有啓動過半機器以後纔會劃分leader
、floower
角色
根據上面給出的集羣規劃化進行配置
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
節點,那麼須要將其也進行免密登陸配置,同時master
和worker1
兩個namenode
節點之間也須要進行免密配置,這裏由於須要兩個節點之間ZKFC進程可以互相訪問
ZKFC
進程是個能夠在非NameNode
節點部署的,可是由於網絡的問題,不這樣作,會形成網絡延遲,因此ZKFC節點
和NameNode
就部署在同一個節點上
下面進行免密配置:
主要配置的是,其餘節點和worker1節點
,worker1
自身免密,master
和worker1
節點之間的免密
$ 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
配置分別是在master
、worker1
、worker2
節點上
$ hadoop-daemon.sh start journalnode #master worker1 worker2節點上執行,啓動journalnod進程
namenode節點
格式化
namenode節點有兩個,
master
、worker1
,先在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
如上高可用就完了,在namenode
或ZKFC
進程掛了,另一臺機器就會自動切成active
繼續提供服務
如上就解決了namenode
單點故障集羣下線的問題
集羣規劃以下所示:
節點名稱 | 節點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
中的資源調度相關的角色進程
,jobTracker
和taskTracker
,由於這兩個進程會有資源過載
和單點故障
問題,因此若是須要使用hadoop MapReduce分佈式計算框架
須要使用到yarn
做爲資源調度
和任務分發
的總作!固然spark
也能夠在yarn
之上進行計算
etc/hadoop/yarn-site.xml
配置
添加以下內容,以下內容中使用到的信息,zookeeper
和ResourceManager
角色的地址根據本身的配置進行修改
<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
,主要是有兩角色進程ResourceManager
、NodeManager
NodeManager:該角色主要是在數據節點,經過slaves中的配置進行啓動,主要用來支持計算向數據遷移
ResourceManager:該角色能夠在集羣中的任意幾點,主要用來進行資源調度和任務分發
如上配置完成以後進行啓動yarn
$ start-yarn.sh
上面的啓動腳本只能啓動nodemanager
,這個腳本問題,那麼須要本身去ResourceManager節點
手動啓動
分別到worker2
、worker3
節點執行下面命令
$ yarn-daemon.sh start resourcemanager
關閉也是如此
$ stop-yarn.sh $ yarn-daemon.sh stop resourcemanager
如上操做完成以後能夠經過http://worker2:8088
和http://worker3:8088
訪問yarn
集羣,也可嘗試讓一臺的ResourceManager進程
掛掉,天然另一臺就會自動切換成active
模式
如上的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官方配置列表中的,參數有三個,分別是
ZOOKEEPER
、NONE
、FILESYSTEM
,做用分別是,一、進行高可用配置,自動切換集羣的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:8080
或http://worker1:8080
查看他們的狀態,嘗試kill 一個active的master進程,看是否能自動切換!
配置到此結束,還有些自定義配置,好比pid這些均可以本身根據需求加配置就完了