hadoop2 比 hadoop1的一些新的功能:
其中HA解決了hadoop1的單點故障問題
1) 各節點:
namenode:master slave3
datanode:slave1 slave2 slave3
journalnode:master slave1 slave3
zookeeper: master slave1 slave3
2)hadoop2 搭建在手工切換ha的叢集基礎上:
a) 關閉所有啟動角色
b) 删除所有機器/usr/local/hadoop/tmp 和 /usr/local/hadoop/logs的内容
3) zookeeper叢集安裝:
- a) master上安裝zookeeper
- a.1)把conf/zoo_sample.cfg重命名為conf/zoo.cfg mv zoo_sample.cfg zoo.cfg
- a.2)修改檔案conf/zoo.cfg
- 1)dataDir=/usr/local/zookeeper/data
- 2)增加以下内容
- server.1=master:2888:3888
- ---> 辨別1 是master對應在zookeeper叢集的編号 2888:3888是資料通信端口
- server.2=slave1:2888:3888
- ---> 辨別2 是slave1對應在zookeeper叢集的編号 2888:3888是資料通信端口
- server.3=slave3:2888:3888
- ---> 辨別3 是slave3對應在zookeeper叢集的編号 2888:3888是資料通信端口
- a.3) mkdir zookeeper/data
- [root@master zookeeper]# mkdir data
- a.4) 寫入檔案echo 1到 zookeeper/data/myid 這樣在本機master内寫上辨別1 兩者關聯起來
- [root@master zookeeper]# echo 1 > data/myid
- b) 複制zookeeper檔案夾到slave1、slave3上
- scp -rq zookeeper slave1:/usr/local
- scp -rq zookeeper slave3:/usr/local
- c) 其餘節點寫辨別
- 在slave1上執行指令echo 2 zookeeper/data/myid
- 在slave3上執行指令echo 3 zookeeper/data/myid
- d) 啟動和驗證
- 在master slave1 slave3上,分别執行指令zookeeper/bin/zkServer.sh start
- 執行指令zookeeper/bin/zkServer.sh status 可以看到三個節點的狀态 哪個是leader 哪個是follower
- 直接開啟
4) hdfs配置檔案:(hadoop-env.sh、core-site.xml、hdfs-site.xml、slaves)
- 2.1 配置檔案(hadoop-env.sh、core-site.xml、hdfs-site.xml、slaves)
- 2.1.1 hadoop-env.sh
- export JAVA_HOME=/usr/local/jdk
- 2.1.2 core-site.xml
- <property>
- <name>fs.default.name</name>
- <value>hdfs://cluster1</value>
- </property>
- <property>
- <name>hadoop.tmp.dir</name>
- <value>/usr/local/hadoop/tmp</value>
- </property>
- <property>
- <name>ha.zookeeper.quorum</name> ------ 配置zk叢集
- <value>master:2181,slave1:2181, slave3:2181</value>
- </property>
- 2.1.3 hdfs-site.xml
- <property>
- <name>dfs.replication</name>
- <value>3</value>
- </property>
- <property>
- <name>dfs.nameservices</name> ----每個nameservice對應一個hdfs叢集
- <value>cluster1</value>
- </property>
- <property>
- <name>dfs.ha.namenodes.cluster1</name>
- <value>master,slave3</value>
- </property>
- <property>
- <name>dfs.namenode.rpc-address.cluster1.master</name>
- <value>master:9000</value>
- </property>
- <property>
- <name>dfs.namenode.http-address.cluster1.master</name>
- <value>master:50070</value>
- </property>
- <property>
- <name>dfs.namenode.rpc-address.cluster1.slave3</name>
- <value>slave3:9000</value>
- </property>
- <property>
- <name>dfs.namenode.http-address.cluster1.slave3</name>
- <value>slave3:50070</value>
- </property>
- <property>
- <name>dfs.ha.automatic-failover.enabled.cluster1</name>
- <value>true</value>
- </property>
- <property>
- <name>dfs.namenode.shared.edits.dir</name>
- <value>qjournal://master:8485;slave1:8485;slave3:8485/cluster1</value>
- </property>
- <property>
- <name>dfs.journalnode.edits.dir</name>
- <value>/usr/local/hadoop/tmp/journal</value>
- </property>
- <property>
- <name>dfs.ha.fencing.methods</name>
- <value>
- sshfence
- shell(/bin/true)
- </value>
- </property>
- <property>
- <name>dfs.ha.fencing.ssh.private-key-files</name>
- <value>/root/.ssh/id_rsa</value>
- </property>
- <property>
- <name>dfs.client.failover.proxy.provider.cluster1</name>
- <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
- </property>
- 2.1.6 slaves -----> 指定NodeManager 和 datanode
- slave1
- slave2
- slave3
5) 删除其他節點的hadoop檔案夾,修改好後拷貝到其餘節點
scp -r /usr/local/hadoop 其他:/usr/local/
6) 啟動hadoop2 hdfs叢集
- 6.1) 格式化zk叢集
- 在master上執行hadoop2.5/bin/hdfs zkfc -formatZK 此操作僅僅表示和zk叢集發生關聯
- 15/01/11 18:14:20 INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/cluster1 in ZK.
- 3在zookeeper中初始化
- $HADOOP_HOME/bin/hdfs zkfc -formatZK
- 運作這個指令後,會在zookeeper上建立一個/hadoop-ha/mycluster/的znode,用來存放automatic failover的資料
- 4 啟動zkfc(zookeeper failover controller)
- 需要在namenode1和namenode2上都啟動zkfc daemon程序。
- $HADOOP_HOME/sbin/hadoop-daemon.sh start zkfc
- 6.2) 啟動journalnode叢集
- 在master、slave1、slave3上分别執行hadoop/sbin/hadoop-daemon.sh start journalnode
- 6.3) 格式化namenode、啟動namenode
- 在[nn1]上,對其進行格式化,并啟動:
- 在h2master上執行bin/hdfs namenode -format
- 在h2master上執行sbin/hadoop-daemon.sh start namenode
- 在[nn2]上,同步nn1的中繼資料資訊:
- 在h2master2上執行bin/hdfs namenode -bootstrapStandby
- 在h2master2上執行sbin/hadoop-daemon.sh start namenode
- 6.4) 啟動datanode
- 在h2master上執行hadoop/sbin/hadoop-daemons.sh start datanode 啟動所有datanode節點
- 此時通路如下連結
- http://master:50070/ http://slave3:50070/
- 兩個namenode都是standby狀态
- 6.5) 啟動ZKFC (FailoverController) 必須是在namenode節點上啟動 讓zk來決定用哪個namenode作為active
- 在master、slave3上 啟動zkfc,執行指令sbin/hadoop-daemon.sh start zkfc
- 此時通路 http://master:50070/ http://slave3:50070/ 結果如下:
- Overview 'master:9000' (active)
- Overview 'slave3:9000' (standby)
7) 驗證自動切換:
關閉master的namenode程序:
再次重新整理
http://h2master:50070/ http://slave3:50070/ 結果如下:
Overview 'slave3:9000' (active) ----> zk自動切換節點slave3為active狀态
master無法連接配接
8) 總結:自動切換比手工切換多出來的步驟
(1)配置上core-site.xml增加了配置項ha.zookeeper.quorum(zk叢集的配置);
hdfs-site.xml中把dfs.ha.automatic-failover.enabled.cluster1改為true
(3)操作上格式化zk,執行指令bin/hdfs zkfc -formatZK;
啟動zkfc,執行指令sbin/hadoop-daemon.sh start zkfc
轉載于:https://blog.51cto.com/01wang/1656899