節點名稱 | IP | NN | DN | JNN | ZKFC | ZK | RM | NM | Master | Worker |
---|---|---|---|---|---|---|---|---|---|---|
master1 | 192.168.8.106 | * | * | * | * | * | * | |||
master2 | 192.168.8.236 | * | * | * | * | * | * | |||
worker1 | 192.168.8.107 | * | * | * | * | * | ||||
worker2 | 192.168.8.108 | * | * | * | ||||||
worker3 | 192.168.8.109 | * | * | * | ||||||
worker4 | 192.168.8.110 | * | * | * | ||||||
worker5 | 192.168.8.111 | * | * | * | ||||||
worker6 | 192.168.8.112 | * | * | * | ||||||
worker7 | 192.168.8.113 | * | * | * |
集羣規劃狀況如上圖所示:java
角色進程介紹:node
一、
NN(NameNode)
:hadoop
集羣中元數據管理的中心,對元數據信息,資源存儲信息等等內容進行管理(角色進程屬於hadoop)linux二、
DN(DataNode)
:負責hadoop
集羣數據存儲的角色進程
(角色進程屬於hadoop)web三、
JNN(journalNode)
:在高可用中會使用到的角色進程
,主要做用就是用來解決NameNode
數據同步問題,由於兩個NameNode
之間是存在數據延遲的,當一個節點掛了以後,數據就會形成丟失,因此引入JournalNode集羣
進行管理(角色進程屬於hadoop)shell四、
KFC(DFSZKFailoverController)
:hadoop
中用來進行監控兩個NameNode
是否健康,同事監視Zookeep集羣
中的鎖
狀況,當一個NameNode
掛了以後,他會將另外一個NameNode
從standrBy
置成active
狀態(角色進程屬於hadoop)apache五、
ZK(QuorumPeerMain)
:該進程是ZOOKEEP進程(
角色進程屬於ZOOKEEP)bootstrap六、
RM(ResourceManager)
:該進程主要負責的是集羣間的資源管理和資源調度(角色進程屬於yarn
)vim七、
NM(NodeManager)
:對計算資源進行彙報和申請,主要爲計算服務提供資源,因此該角色必須在DataNode
所在的節點 (角色進程屬於yarn
)centos八、
Master
:該進程是Spark
中的進程,主要是對計算任務進行管理,負責資源相關內容,負責監控spark
集羣中的健康 (角色進程屬於spark
)架構九、
worker
:該進程主要負責spark
計算任務(角色進程屬於spark
)
系統環境 :centos7
所需安裝包:
一、
hadoop-2.7.7.tar.gz
二、jdk-8u191-linux-x64.tar.gz
如上圖的集羣規劃先將Hadoop相關的基礎環境先進行搭建,在搭建以前須要首先完成的工做:
hadoop
用戶和用戶組jdk
環境變量hadoop
環境變量hadoop
相關配置文件免密登陸
$ useradd hadoop $ passwd hadoop $ su hadoop $ tar -zxvf hadoop-2.7.7.tar.gz $ tar -zxvf jdk-8u191-linux-x64.tar.gz
上面全部節點都須要建立hadoop用戶和用戶組
、配置jdk環境變量
/etc/profile
設置環境變量
$ vim /etc/profile #設置環境變量 export JAVA_HOME=/home/hadoop/jdk1.8.0_191 export HADOOP_HOME=/home/hadoop/hadoop-2.7.7 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin $ source /etc/profile
設置完成以後進行驗證,是否設置成功
關閉全部節點防火牆並設置自啓動關閉
$ systemctl stop firewalld.service $ systemctl disable firewalld.service
修改主機名和IP映射
/etc/hosts
192.168.8.236 master2 192.168.8.106 master1 192.168.8.107 worker1 192.168.8.108 worker2 192.168.8.109 worker3 192.168.8.110 worker4 192.168.8.111 worker5 192.168.8.112 worker6 192.168.8.113 worker7
/etc/sysconf/network
:分別在不一樣機器上修改不一樣的主機名,主機名一旦修改後面不須要再改變
hostname master1 #分別在不一樣機器上進行修改
$ systemctl restart network #重啓網卡
在搭建的過程中爲了不多種框架環境之間的影響形成很差驗證的狀況,儘可能仍是按照順序進行搭建,而且在完成一步以後就須要進行相關驗證,儘可能避免多環境錯誤相互影響!
在高可用的環境搭建過程當中將會使用到Zookeep
進行分佈式協調,下面對Zookeep集羣
進行搭建
$ tar -zxvf zookeeper-3.4.13.tar.gz $ vim /etc/profile #環境變量配置(master一、master二、worker1)都須要進行配置 export ZOOKEEP_HOME=/home/hadoop/zookeeper-3.4.13 export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEP_HOME/bin $ source /etc/profile
對Zookeep
配置文件進行修改
/home/hadoop/zookeeper-3.4.13/conf/zoo.cfg
,沒有該文件的換,複製./zoo_sample.cfg
改下名字
dataDir=/data/zookeep #給zk配置一個目錄用來存儲元數據,禁止使用/tmp server.1=master1:2888:3888 server.2=master2:2888:3888 server.3=worker1:2888:3888
完成上面配置以後,須要建立/data/zookeep
目錄,而且將server.x
中的x
分別寫入到不一樣節點的
$ mkdir -p /data/zookeep $ echo '1' > myid
上面配置須要再安裝了ZK
的不一樣節點進行寫入,根據具體本身的配置目錄和序列號進行寫入
配置文件介紹:
端口介紹:在
zk
中提供服務的端口是2181
,2888
、3888
這兩個端口分別是集羣間進行通信的端口和當集羣中leader節點
掛了的時候進行通信的端口
server.[數字]
配置介紹:在zk leader節點
掛了時候將進行選舉,數字是權重值,權重越大的被選爲leader
的可能性越大,可是在選舉過程當中還會參考另一個權重值,另外一個權重值主要記錄的是數據的多少,數據越多的節點選爲leader
的概率越大
將``zk的包
scp`到其餘節點
$ scp ./zookeeper-3.4.13 master2:`pwd` $ scp ./zookeeper-3.4.13 worker1:`pwd`
配置完成以後進行啓動並驗證
$ zkServer.sh start #啓動zk $ zkServer.sh stop #關閉zk $ zkServer.sh status #查看狀態 $ zkCli.sh #進入zk終端
啓動完成以後將看到QuorumPeerMain進程
,同時進入終端以後會看到zookeep目錄樹
,同時三個節點分別查看狀態會發現,有一個leader
和兩個fllower
$ jps #查看java進程,查看QuorumPeerMain是否存在 $ zkCli.sh #進入zk終端 $ ls / #查看zk中的目錄樹,會發現zookeeper目錄
如上圖中所示,說明安裝成功
zk
在安裝完成以後,須要啓動zk
集羣過半的數量以後才能向外提供服務,目前集羣規模只容許一臺節點掛掉在進行hadoop
配置以前須要進行集羣間的免密登陸
配置
主要是對master1
和master2
進行相關配置
#在master1和master2節點記性免密登陸配置 $ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa #生成祕鑰 $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #cp公鑰到驗證文件中 $ chmod 0600 ~/.ssh/authorized_keys
上面是對master1
和master2
進行了自身免密
配置
上面完成以後會在~
目錄生成.ssh/
的隱藏文件夾,須要分別將master1
和master2
的公鑰發送到其餘節點,同時master1
和master2
互相之間也須要進行免密配置
第一次在沒有生成祕鑰的狀況下是不會產生~/.ssh/
目錄的,使用本身登錄本身能夠建立,也能夠本身建立
$ ssh localhost #該操做會建立~/.ssh/目錄
如上在每一個節點都執行以後,就能夠將master1
和master2
中的公鑰文件id_rsa.pub
文件拷貝到其餘節點寫入authorized_keys
文件中
列如worker1節點
:
$ scp ./id_rsa.pub worker1:`pwd` #master1上執行 $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #worker1執行 $ chmod 0600 ~/.ssh/authorized_keys #worker1執行
依次對其餘節點進行免密配置,配置完成以後須要從新打開終端,而後能夠在master1
和master2
登陸其餘節點,此時不須要密碼就能登陸,這裏必定須要驗證,由於沒有免密登陸的狀況hadoop
之間的腳本管理將起不到做用,必須保證免密是配置正確的
下面如今Maser節點
配置hadoop
相關環境
/home/hadoop/hadoop-2.7.7/etc/hadoop/core.sitt.xml
文件配置
<!--修改hadoop tmp 目錄,禁止使用/tmp目錄,這裏使用的是掛在硬盤的目錄--> <property> <name>hadoop.tmp.dir</name> <value>/data/hadoop/tmp</value> </property> <!--配置集羣名稱(根據後面hdfs.site.xml中的配置進行修改的--> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!--設置journalNode元數據保存路徑,這裏保存的是曾經單節點NameNode中的edit.log元數據信息--> <property> <name>dfs.journalnode.edits.dir</name> <value>/data/journalnode</value> </property> <!-- 配置集羣使用的zookeep集羣節點名稱和端口號 --> <property> <name>ha.zookeeper.quorum</name> <value>master1:2181,master2:2181,worker1:2181</value> </property>
/home/hadoop/hadoop-2.7.7/etc/hadoop/hdfs.site.xml
文件配置
<!--設置副本數,通常最低三個副本--> <property> <name>dfs.replication</name> <value>3</value> </property> <!--設置集羣名稱--> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!--設置主節點別名--> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!--主節點別名和IP(主機名)端口映射--> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>master1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>master2:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>master1:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>master2:50070</value> </property> <!--JNN 集羣配置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master1:8485;master2:8485;worker1:8485/mycluster</value> </property> <!-- 這裏直接抄過去 --> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <!--配置ssh驗證--> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!--配置 rsa 祕鑰文件--> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <!--是否開啓 HA 模式--> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property>
/home/hadoop/hadoop-2.7.7/etc/hadoop/slaves
文件配置(該文件配置的是DataNode
所在節點的主機名或者IP
worker1 worker2 worker3 worker4 worker5 worker6 worker7
/home/hadoop/hadoop-2.7.7/etc/hadoop/hadoop-env.sh
文件配置
export JAVA_HOME=/home/hadoop/jdk1.8.0_191
在該文件中找到JAVA_HOME
環境變量並進行修改爲本身的JDK
路徑
如上配置完成以後將整個包發送到各個節點
$ scp -r ./hadoop-2.7.7/ worker1:`pwd` #列如worker1
完成包拷貝以後,能夠進行啓動看HA - Hadoop
是否成功
在對HDFS
進行格式化以前必定要先將journalNode集羣啓動
由於元數據將會保存在這個集羣中,
journalNode
根據集羣規劃分別實在master1
、master2
、worker1
$ hadoop-daemon.sh start journalnode #master一、master二、worker1節點上執行(啓動JNN)
NameNode格式化
在master1
或者master2
上對NameNode
進行格式化
$ hadoop namenode -format #格式化
一個節點進行了格式化,另一個節點只須要進行元數據同步
,不須要再進行一次格式化,若是有多個NameNode
也是同樣的
$ hdfs namenode -h #查看幫助命令 $ hdfs namenode -bootstrapstandby #進行數據同步
格式化完成以後分別在master
節點啓動NameNode
$ hadoop-daemon.sh start namenode
格式化完成以後須要進行ZKFC
的格式化,ZKFC
格式化主要是在zookeep集羣
中生成一個目錄樹
$ yum -y install psmisc #在格式化中須要依賴的包,有些老系統沒有這個包安裝一下 $ hdfs zkfc -formatZK
如上格式化完成以後會在ZK
中生成一個hadoop-ha目錄樹
$ zkCli.sh #進入終端 $ ls / #終端輸入
只要在這一步出現了hadoop-ha
說明配置成功
啓動HDFS
,隨便在一個master
節點上執行
$ start-dfs.sh #啓動 $ jps #在每個節點上檢查進程是否完整
在檢查進程的時候,能夠參考集羣規劃表中的進程數量,到這一步,除了spark
的兩個角色進程
和yarn
的兩個角色進程
之外,其餘的進程是否按照預期出現,若是沒有說明搭建過程當中是存在問題的,若果進程都沒有問題,那麼能夠訪問http://master1:50070
和http//master2:50070
,看是否能被訪問
下面是對hadoop-HA
進行驗證,經過訪問上面的兩個地址,將會看到以下兩個頁面:
master1
master2
這是正常的,那麼須要進行驗證的是高可用的可用性,也就是說他們中其中一臺掛了,服務都能繼續,能夠經過kill
進程來達到效果,這裏說下影響到集羣可用性
的進程
一、
NameNode
:進程結束服務就消失二、
ZKFC
:該進程結束,對應的NameNode
沒法和journalNode
創建關係,沒法作數據同步
,服務也將結束三、
journalNode
:journalNode
掛了,整個集羣歇菜,因此須要作高可用,這裏journalNode
也是高可用的最多容許一臺掛四、
zk
:zk
一旦掛了,那麼會影響到journalNode
集羣和KFC
,因此他掛了,其餘的也玩完,因此他也作了集羣,避免單點故障
,一樣的最多容許一臺掛,固然這些集羣均可以擴充,只是如今不必
因此驗證的方式就是,上面的這些進程,隨便找一個master,
一個一個kill
看他是否能自動從standby
切換到active
能切換,說明配置就沒有問題,是生效的!
上面的步驟確保正確的狀況下,下面進行配置yarn
/home/hadoop/hadoop-2.7.7/etc/hadoop/yarn.site.xml
文件配置
<!--mapreduce shuffle配置--> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!--開啓HA模式--> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!--設置yarn集羣名稱--> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster1</value> </property> <!--設置yarn集羣中resourcemanager別名,節點數量--> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <!--對yarn集羣中 resourcemanager 別名和集羣名稱進行相關映射--> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>master1</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>master2</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>master1:8088</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>master2:8088</value> </property> <!--設置zk集羣地址和端口號--> <property> <name>yarn.resourcemanager.zk-address</name> <value>master1:2181,master2:2181,worker1:2181</value> </property> <!--配置每一個節點每一個任務調度和使用最大能分配到的內存和CPU核心數--> <property> <name>yarn.scheduler.maximum-allocation-mb</name> <value>92160</value> </property> <property> <name>yarn.scheduler.maximum-allocation-vcores</name> <value>32</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>92160</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>32</value> </property>
/home/hadoop/hadoop-2.7.7/etc/hadoop/mapred.site.xml
文件配置
<!--mapreduce在yarn集羣中進行調度配置--> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>
如上配置完成以後yarn
的基本配置基本上就完了,將這兩個文件發送到其餘節點
$ scp -r ./mapred.site.xml yarn.site.xml worker1:`pwd` #如worker1
完成集羣間的上述文件替換以後啓動yarn集羣
$ ./start-yarn.sh #啓動yarn集羣 $ ./stop-yarn.sh #關閉yarn集羣
NodeManager角色進程
,同時這裏啓動的時候是根據slaves文件
中的配置進行啓動的 NodeManager
,須要手動去到ResourceManager
所在節點去啓動$ ./hadoop-daemon.sh start resourcemanager #啓動ResourceManager $ ./hadoop-daemon.sh stop resourcemanager #關閉ResourceManager
yarn服務地址
:http://master1:8088 OR http://master2:8088; http://worker1:8048(該地址是訪問node節點的)
如上訪問兩個地址,
master1
master2
如上出現了兩個訪問頁面,master1
是active
,master2
是standby
狀態,在訪問的時候,當訪問standby
狀態的節點的時候,他會自動重定向到active
節點,跳轉完成以後再修改主機名
或ip
就能進行訪問!
同時如今還須要查看zk
中的狀態,進入終端
$ zkCli.sh #進入終端 $ ls / #查看目錄樹
這個時候回多出一個目錄樹yarn-leader-election
說明配置也沒有問題,在zk
中也進行了相關注冊,下面就能夠進行測試集羣的可用性了,在yarn
集羣中,ResourceManager角色進程
是比較關鍵的角色,他掛了就意味着yarn集羣
沒法提供服務,因此,只須要模擬kill Resoucemanager
的狀態,而後看master1
和master2
狀態是否進行了相關切換,若是可以切換成功說明配置是沒有問題的
安裝到這裏須要查看各個節點的角色進程
啓動狀況,是否和上面的集羣架構表
中的同樣,若是正常說明搭建正常
這裏說一下,單獨把yarn
提出來,由於HDFS
能夠獨立於他進行運行,能夠當作不一樣組件,雖然他在hadoop
包中
spark安裝包
:spark-2.4.0-bin-hadoop2.7.tgz
$ tar -xvf spark-2.4.0-bin-hadoop2.7.tgz $ mv spark-2.4.0-bin-hadoop2.7 spark-2.4
/home/hadoop/spark-2.4.0/conf/slaves
文件配置
worker1 worker2 worker3 worker4 worker5 worker6 worker7
/home/hadoop/spark-2.4.0/conf/spark-env.sh
文件配置
export JAVA_HOME=/home/hadoop/jdk1.8.0_191 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=master1 export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=master1:2181,master2:2181,worker1:2181 -Dspark.deploy.zookeeper.dir=/spark"
在上述文件中進行設置相關的環境變量配置,最基礎的配置就是上述的這些內容:
SPARK_MASTER_HOST
:改配置只須要在MASTER角色進程
節點進行配置,同時在配置的時候要根據所在節點的真實地址進行設置,其餘節點能夠進行配置
SPARK_DAEMON_JAVA_OPTS
:改配置中的參數介紹-Dspark.deploy.recoveryMode=ZOOKEEPER
,該配置中有三個值,分別是ZOOKEEP
(做用,使用ZK
做爲服務發現)、NONE
(做用,不作任何操做)、FILESYSTEM
(做用,在不作高可用的狀況下,配置了以後,在計算過程當中宕機,再次啓動時他能盡力去根據記錄元數據信息恢復);-Dspark.deploy.zookeeper.url=master1:2181,master2:2181,worker1:2181
該配置主要是設置ZK
提供服務的節點和端口;-Dspark.deploy.zookeeper.dir=/spark
改配置是在進行服務發現的時候在ZK
中生成spark
的一個文件木樹,用於保存高可用的一些元數據信息
上述內容設置完成以後,就能夠將配置的文件發送到各個節點,同時針對一些須要進行修改的內容,分別在不一樣節點進行修改,修改完成以後進行啓動,驗證是否配置正確,相關啓動命令都在/home/hadoop/spark-2.4.0/sbin
目錄中,這裏不對spark
進行環境變量的設置,由於他的啓動命令和HDFS
的啓動命令部分重疊,避免發生衝突,固然也能夠去修改啓動命令文件名
$ ./start-master.sh #分別在master1和master2啓動Master進程 $ ./start-slaves.sh #在一個Master節點進行啓動全部slaves中配置的worker進程 $ ./stop-slaves.sh #中止worker進程 $ ./stop-master.sh #中止master進程
上述操做完成以後,啓動完成以後,就能夠查看各個節點角色進程
是否和集羣規劃中的相同了,相同以後能夠訪問http://master1:8080
、http://master2:8080
兩個地址
master1
master2
能夠從上圖中看出來,active
、standby
兩個狀態,對應的也能夠kill master
進程,看是否會進行自動切換狀態
到這裏能夠看下各個節點的進程:
master1
master2
worker1
worker2
(其餘節點和這個節點進程相同)
上述的安裝過程基本上是安裝完成,下面來跑個測試例子,查看是否可以正常的進行工做。
提交到yarn
集羣
$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \ --master yarn \ --deploy-mode cluster \ --driver-memory 2g \ --executor-memory 2g \ --executor-cores 3 \ --queue thequeue \ #這個參數不須要,這裏咱們沒有設置隊列相關的內容,因此會報錯,隊列是關閉的 examples/jars/spark-examples*.jar \ 1
提交到master
集羣
$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \ --master spark://master1:7077,master2:7077 \ --deploy-mode cluster \ --driver-memory 2g \ --executor-memory 2g \ --executor-cores 3 \ --name pi \ examples/jars/spark-examples*.jar \ 1
這兩種提交方式,一種是在yarn
集羣,能夠經過yarn
提供的webUI
進行查看任務進度,一種是經過是Spark
,能夠經過sparkUI
進行查看任務進度!
上面的例子是spark
提供的測試例子,這個例子能跑同說明集羣運行基本正常
在集羣開始正式工做以後,PID
、WORKER_DIR
、LOG_DIR
可能會由於這些內容影響到集羣的運行,默認集羣中全部的PID
都是在/tmp
目錄中的,這個目錄系統會根據心情進行刪除數據,這個時候可能會形成集羣沒法關閉
等等問題,日誌,工做日誌這些會產生很是大的數據量,因此將其配置到掛在磁盤
上
/home/hadoop/hadoop-2.7.7/etc/hadoop/hadoop-env.sh
文件配置
export HADOOP_PID_DIR=/data/hadoop/pid export HADOOP_LOG_DIR=/data/hadoop/logs
/home/hadoop/hadoop-2.7.7/etc/hadoop/yarn-env.sh
文件配置
export YARN_PID_DIR=/data/hadoop/pid
/home/hadoop/spark-2.4.0/conf/spark-env.sh
文件配置
export SPARK_PID_DIR=/data/spark/pid export SPARK_LOG_DIR=/data/spark/log export SPARK_WORKER_DIR=/data/spark/application
配置完成重啓,查看是否正常安裝指定路徑建立