-
部署規(guī)劃
zookeeper集群需要奇數(shù)臺(tái)機(jī)器,至少需要三臺(tái)機(jī)器。hadoop集群至少需要2臺(tái)機(jī)器逼蒙。因此至少準(zhǔn)備三臺(tái)虛擬機(jī)。
規(guī)劃每臺(tái)機(jī)器的主機(jī)名访忿,IP瞧栗,和扮演的角色斯稳,如下圖。
Hadoop HA 規(guī)劃.png -
修改Linux主機(jī)名和IP
根據(jù)規(guī)劃
1)將網(wǎng)卡IP獲取方式修改為Manuel迹恐,并配置每臺(tái)機(jī)器的IP挣惰。
2)修改/etc/hosts內(nèi)容將三臺(tái)機(jī)器的主機(jī)名和IP填寫進(jìn)去。 -
配置ssh免密登錄并關(guān)閉防火墻
根據(jù)規(guī)劃殴边,master需要免密登錄到slave0憎茂、slave1,以啟動(dòng)hadoop集群锤岸;同時(shí)slave1上啟動(dòng)resourcemanager竖幔,所以需要slave1免密登錄到master和slave0;master和slave0同為namenode是偷,一個(gè)宕機(jī)就啟動(dòng)另一個(gè)拳氢,所以要互相能免密登錄。
綜上蛋铆,將master公鑰發(fā)送到slave0馋评、slave1;將slave1公鑰發(fā)送到master刺啦、slave0留特;將salve0公鑰發(fā)送到master。其中主要使用到的Linux命令有:
ssh-keygen -t rsa
cat ./id_rsa.pub >> ./authorized_keys
scp ~/.ssh/id_rsa.pub user@hostname:/home/hadoop/
chmod 700 ./authorized_keys //權(quán)限不夠會(huì)導(dǎo)致配置失敗
service iptables close
chkconfig iptables off ```
- **配置環(huán)境變量并部署集群**
在master節(jié)點(diǎn)上安裝JDK玛瘸,Hadoop蜕青,Zookeeper并配置環(huán)境變量,然后scp到其他節(jié)點(diǎn)上(JDK就不寫了)糊渊。
1)安裝zookeeper集群
主要修改配置文件conf/zoo.cfg
dataDir=/weekend/zookeeper-3.4.5/tmp
server.1=master:2888:3888server.2=slave0:2888:3888
server.3=slave1:2888:3888
2)安裝hadoop集群
主要修改5個(gè)配置文件:
**core.xml**
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://ns</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/home/hadoop/workspace/hdfs/temp</value>
</property>
<property>
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave0:2181,slave1:2181</value>
</property>
</configuration>
**hdfs-site.xml**
<configuration>
<property>
<name>dfs.nameservices</name>
<value>ns</value>
</property>
<property>
<name>dfs.ha.namenodes.ns</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns.nn1</name>
<value>master:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.ns.nn1</name>
<value>master:50070</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns.nn2</name>
<value>slave0:9000</value>
</property>
<property>
<name>dfs.namenode.http-address.ns.nn2</name>
<value>slave0:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave0:8485;slave1:8485/ns</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/hadoop/workspace/journal</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.ns</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.namenode.name.dir</name>
<value>file:///home/hadoop/workspace/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///home/hadoop/workspace/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<!-- 在NN和DN上開啟WebHDFS (REST API)功能,不是必須 -->
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
</configuration>
**mapred-site.xml**
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
**yarn-site.xml**
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>slave1</value>
</property>
</configuration>
**slaves**
master
slave0
slave1
- **啟動(dòng)zookeeper集群**
一市咆、首次啟動(dòng):
**01**
啟動(dòng)zookeeper集群:分別在三個(gè)節(jié)點(diǎn)上啟動(dòng)zookeeper
zkServer.sh start```
啟動(dòng)后用如下命令驗(yàn)證,集群?jiǎn)?dòng)成功再来,有兩個(gè)follower節(jié)點(diǎn)跟一個(gè)leader節(jié)點(diǎn)蒙兰;
[hadoop@master bin]$ zkServer.sh status
JMX enabled by default
Using config: /home/hadoop/zookeeper/zookeeper-3.4.9/bin/../conf/zoo.cfg
Mode: follower
02
啟動(dòng)journalnode集群(在master的hadoop目錄下執(zhí)行以下命令):
sbin/hadoop-daemons.sh start journalnode
03
格式化hdfs(在master上執(zhí)行以下命令):
hadoop namenode –format
04
格式化zkfc,讓在zookeeper中生成ha節(jié)點(diǎn)(在master上執(zhí)行以下命令):
hdfs zkfc –formatZK
05
啟動(dòng)HDFS(在master上執(zhí)行以下命令):
sbin/start-dfs.sh
06
啟動(dòng)YARN(在slave1上執(zhí)行以下命令):
sbin/start-yarn.sh
二磷瘤、再次啟動(dòng)
01
啟動(dòng)zookeeper(分別啟動(dòng)):
zkServer.sh start
02
啟動(dòng)hdfs(master的hadoop目錄下):
sbin/start-dfs.sh
03
啟動(dòng)yarn(在slave1的hadoop目錄下):
sbin/start-yarn.sh
三、啟動(dòng)成功后的進(jìn)程
#master上的java PID進(jìn)程
[hadoop@master hadoop-2.7.3]$ jps
2837 NodeManager
3054 DFSZKFailoverController
4309 Jps
2692 DataNode
2173 QuorumPeerMain
2551 NameNode
2288 JournalNode
#slave0上的java PID進(jìn)程
[hadoop@salve0 ~]$ jps
2869 DFSZKFailoverController
2353 DataNode
2235 JournalNode
4522 Jps
2713 NodeManager
2591 NameNode
2168 QuorumPeerMain
#slave1上的java PID進(jìn)程
[hadoop@slave1 ~]$ jps
2167 QuorumPeerMain
2337 JournalNode
3506 Jps
2457 DataNode
2694 NodeManager
2590 ResourceManager
-
可能遇到的錯(cuò)誤
01
運(yùn)行zookeeperd的啟動(dòng)腳本顯示啟動(dòng)成功搜变,但用zkServer.sh status查看采缚,反饋如下:
JMX enabled by default
Using config: /data/programfiles/zookeeper-3.4.9/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
原因:在/data里面查找zookeeper_server.pid這個(gè)文件,里面保存的是zookeeper的啟動(dòng)id挠他,當(dāng)服務(wù)器重啟時(shí)zookeeper非正常退出扳抽,這個(gè)zookeeper_server.pid的值沒有被清除,當(dāng)執(zhí)行zookeeper啟動(dòng)腳本時(shí)發(fā)現(xiàn)這個(gè)文件的值殖侵,就以為zookeeper已經(jīng)啟動(dòng)贸呢。
解決方案:把zookeeper_server.pid里面的內(nèi)容清空,zookeeper就能正常啟動(dòng)拢军。
02
節(jié)點(diǎn)啟動(dòng)失敗
原因:hadoop集群所有的用戶名要一樣楞陷,因?yàn)殡m然可以用ssh hadoop@hadoop1代替ssh hadoop1,這讓我們覺得沒有必要讓hadoop每臺(tái)自己的用戶名一樣茉唉。這樣想是不對(duì)的固蛾。因?yàn)閟sh遠(yuǎn)程無(wú)密碼登入可以用ssh hadoop@hadoop1。但是hadoop內(nèi)部是不會(huì)這樣智能處理的度陆。
解決方案:在配置hadoop集群時(shí)艾凯,要把所有機(jī)子的用戶名設(shè)置一樣。