配置NameNode HA
阿新 • • 發佈:2018-12-26
1. 安裝zookeeper
請見http://blog.csdn.net/kiwi_kid/article/details/53496992
2,修改相關配置檔案
core-site.xml 檔案
hdfs-site.xml
yarn-site.xml
mapred-site.xml
3, 啟動相關服務
(1)首先啟動zookeeper叢集
由於我的節點是5個,所以我是將所有的節點都用來作為zookeeper來作為zookeeper的叢集。因此在各節點上執行如下命令即可。
zkServer.sh start
所有的節點都啟動zookeeper服務之後,zookeeper叢集就已經啟動了。
(2)對zookeeper叢集進行格式化
hdfs zkfc -formatZK
(3)啟動JournalNode程序,注意這個在第一次的時候必須要按照這個順序執行。否則後面hdfs格式化不了。
同樣,我也是將所有的節點都作為了journalnode的節點,於是在所有的節點上執行下面的命令來啟動journalnode。
hadoop-daemon.sh start journalnode
(4)格式化hadoop的叢集,注意,第一次格式化必須首先啟動上面的journalnode程序。並且,hadoop格式化的執行在某一個namenode節點上進行,在這裡我選擇的是hadoop1上執行。
hdfs namenode -format mycluster
(5)啟動第(4)步格式化之後的namenode。
也就是說在第(4)步上面格式化後的namenode節點上啟動namenode程序。
hadoop-daemon.sh start namenode
(6)在另外一個namenode節點上按順序執行如下兩個命令來啟動namenode程序。(本文中是hadoop5上執行)
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
(7)在一個namenode節點上執行一下兩個命令啟動所有的程序:
start-dfs.sh
start-yarn.sh
(8)此時啟動完之後,我們可以通過下面的命令來檢視兩個namenode的狀態是否是standby或者是active
4、檢驗自動切換,通過kill active的namenode來驗證namenode是否能自動切換。
(1)通過上面步驟(8)檢視到對應的那個namenode的狀態是active,在該namenode節點上檢視所有的程序。如下所示:
(2)在active的namenode節點上,執行 kill -9 7048 。實際上這一步可以直接將該節點重啟也可以。
(3)在standby的namenode節點上檢視其狀態的改變。
hdfs haadmin -getServiceState nn1
我們可以看到其對應的狀態從standby的狀態轉變為active的狀態了。
5、通過上傳檔案來檢測HDFS的健康狀態
執行 :hadoop fs -put /hadoop-2.6.0/etc/hadoop/hdfs-site.xml /
然後可以通過web檢視hdfs-site.xml
6、測試在作業執行時,namendoe掛掉了是否能自動切換,並且還能正常執行作業?
準備一個2G的檔案,我準備了一不電影zr.MP4,2.13G準備上傳上HDFS中,在上傳的過程中kill 掉active的namenode 檢視最終的執行結果。
通過在在standby的namenode節點上執行:hadoop fs -put zr.mp4 / 。
在它執行的過程中,在active的namenode節點上執行:kill -9 7048 (這裡的7048就是namenode程序ID)。在執行過程中,我們可以看到如下圖所示:
通過上圖可以看出,最終zr.mp4上傳成功了。至此HDFS的HA方案已經完成。完全可以投入使用。
請見http://blog.csdn.net/kiwi_kid/article/details/53496992
2,修改相關配置檔案
core-site.xml 檔案
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>rdb01:2181,rdb02:2181,rdb03:2181</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</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/root/.ssh/id_rsa</value> </property> <property> <name>ha.zookeeper.session-timeout.ms</name> <value>60000</value> </property> <property> <name>ha.failover-controller.cli-check.rpc-timeout.ms</name> <value>60000</value> </property> <property> <name>ipc.client.connect.timeout</name> <value>20000</value> </property> </configuration>
hdfs-site.xml
<configuration> <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>rdb01:9000</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>rdb02:9000</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>rdb01:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>rdb02:50070</value> </property> <property> <name>dfs.namenode.servicerpc-address.mycluster.nn1</name> <value>rdb01:53310</value> </property> <property> <name>dfs.namenode.servicerpc-address.mycluster.nn2</name> <value>rdb02:53310</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://rdb9¥01:8485;rdb02:8485;rdb03:8485/mycluster</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/hadoop/journal/data</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.replication</name> <value>2</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file:///hadoop/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:///hadoop/data</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <property> <name>dfs.permissions.enable</name> <value>false</value> </property> <property> <name>dfs.permissions</name> <value>false</value> </property> <property> <name>dfs.image.transfer.bandwidthPerSec</name> <value>1048576</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/root/.ssh/id_rsa</value> </property>
yarn-site.xml
<property> <name>yarn.resourcemanager.connect.retry-interval.ms</name> <value>60000</value> </property> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.cluster-id</name> <value>rm-cluster</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.ha.id</name> <value>rm1</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>rdb01</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>rdb02</value> </property> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> <property> <name>yarn.resourcemanager.zk-address</name> <value>rdb01:2181,rdb02:2181,rdb03:2181</value> </property> <property> <name>yarn.resourcemanager.address.rm1</name> <value>${yarn.resourcemanager.hostname.rm1}:23140</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.rm1</name> <value>${yarn.resourcemanager.hostname.rm1}:23130</value> </property> <property> <name>yarn.resourcemanager.webapp.https.address.rm1</name> <value>${yarn.resourcemanager.hostname.rm1}:23189</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>${yarn.resourcemanager.hostname.rm1}:23188</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.rm1</name> <value>${yarn.resourcemanager.hostname.rm1}:23125</value> </property> <property> <name>yarn.resourcemanager.admin.address.rm1</name> <value>${yarn.resourcemanager.hostname.rm1}:23141</value> </property> <property> <name>yarn.resourcemanager.address.rm2</name> <value>${yarn.resourcemanager.hostname.rm2}:23140</value> </property> <property> <name>yarn.resourcemanager.scheduler.address.rm2</name> <value>${yarn.resourcemanager.hostname.rm2}:23130</value> </property> <property> <name>yarn.resourcemanager.webapp.https.address.rm2</name> <value>${yarn.resourcemanager.hostname.rm2}:23189</value> </property> <property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>${yarn.resourcemanager.hostname.rm2}:23188</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address.rm2</name> <value>${yarn.resourcemanager.hostname.rm2}:23125</value> </property> <property> <name>yarn.resourcemanager.admin.address.rm2</name> <value>${yarn.resourcemanager.hostname.rm2}:23141</value> </property> <property> <name>yarn.nodemanager.local-dirs</name> <value>/home/hadoop/logs/yarn_local</value> </property> <property> <name>yarn.nodemanager.log-dirs</name> <value>/home/hadoop/logs/yarn_log</value> </property> <property> <name>yarn.nodemanager.remote-app-log-dir</name> <value>/home/hadoop/logs/yarn_remotelog</value> </property> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property> <property> <name>yarn.nodemanager.resource.memory-mb</name> <value>2048</value> </property> <property> <name>yarn.nodemanager.vmem-pmem-ratio</name> <value>4.2</value> </property> <property> <name>yarn.nodemanager.resource.cpu-vcores</name> <value>2</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> </configuration>
mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>rdb01:10020,rdb02:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>rdb01:19888,rdb02:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/tmp/hadoop-yarn/staging</value>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>${yarn.app.mapreduce.am.staging-dir}/history/done</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate</value>
</property>
<property>
<name>mapreduce.task.io.sort.factor</name>
<value>100</value>
</property>
<property>
<name>mapreduce.reduce.shuffle.parallelcopies</name>
<value>10</value>
</property>
</configuration>
3, 啟動相關服務
(1)首先啟動zookeeper叢集
由於我的節點是5個,所以我是將所有的節點都用來作為zookeeper來作為zookeeper的叢集。因此在各節點上執行如下命令即可。
zkServer.sh start
所有的節點都啟動zookeeper服務之後,zookeeper叢集就已經啟動了。
(2)對zookeeper叢集進行格式化
hdfs zkfc -formatZK
(3)啟動JournalNode程序,注意這個在第一次的時候必須要按照這個順序執行。否則後面hdfs格式化不了。
同樣,我也是將所有的節點都作為了journalnode的節點,於是在所有的節點上執行下面的命令來啟動journalnode。
hadoop-daemon.sh start journalnode
(4)格式化hadoop的叢集,注意,第一次格式化必須首先啟動上面的journalnode程序。並且,hadoop格式化的執行在某一個namenode節點上進行,在這裡我選擇的是hadoop1上執行。
hdfs namenode -format mycluster
(5)啟動第(4)步格式化之後的namenode。
也就是說在第(4)步上面格式化後的namenode節點上啟動namenode程序。
hadoop-daemon.sh start namenode
(6)在另外一個namenode節點上按順序執行如下兩個命令來啟動namenode程序。(本文中是hadoop5上執行)
hdfs namenode -bootstrapStandby
hadoop-daemon.sh start namenode
(7)在一個namenode節點上執行一下兩個命令啟動所有的程序:
start-dfs.sh
start-yarn.sh
(8)此時啟動完之後,我們可以通過下面的命令來檢視兩個namenode的狀態是否是standby或者是active
[[email protected] data]# hdfs haadmin -getServiceState nn1
active
[[email protected] data]# hdfs haadmin -getServiceState nn2
standby
這裡的nn1和nn2就是上面的配置檔案中所設定的。nn1對應的就是hadoop1,nn2對應的就是hadoop5。4、檢驗自動切換,通過kill active的namenode來驗證namenode是否能自動切換。
(1)通過上面步驟(8)檢視到對應的那個namenode的狀態是active,在該namenode節點上檢視所有的程序。如下所示:
(2)在active的namenode節點上,執行 kill -9 7048 。實際上這一步可以直接將該節點重啟也可以。
(3)在standby的namenode節點上檢視其狀態的改變。
hdfs haadmin -getServiceState nn1
我們可以看到其對應的狀態從standby的狀態轉變為active的狀態了。
5、通過上傳檔案來檢測HDFS的健康狀態
執行 :hadoop fs -put /hadoop-2.6.0/etc/hadoop/hdfs-site.xml /
然後可以通過web檢視hdfs-site.xml
6、測試在作業執行時,namendoe掛掉了是否能自動切換,並且還能正常執行作業?
準備一個2G的檔案,我準備了一不電影zr.MP4,2.13G準備上傳上HDFS中,在上傳的過程中kill 掉active的namenode 檢視最終的執行結果。
通過在在standby的namenode節點上執行:hadoop fs -put zr.mp4 / 。
在它執行的過程中,在active的namenode節點上執行:kill -9 7048 (這裡的7048就是namenode程序ID)。在執行過程中,我們可以看到如下圖所示:
通過上圖可以看出,最終zr.mp4上傳成功了。至此HDFS的HA方案已經完成。完全可以投入使用。