流式大資料計算實踐(3)----高可用的Hadoop叢集
流式大資料計算實踐(3)----高可用的Hadoop叢集
一、前言
1、上文中我們已經搭建好了Hadoop和Zookeeper的叢集,這一文來將Hadoop叢集變得高可用
2、由於Hadoop叢集是主從節點的模式,如果叢集中的namenode主節點掛掉,那麼叢集就會癱瘓,所以我們要改造成HA模式(High Avaliable,高可用性)的叢集,說白了就是設定一個備用的namenode節點,當線上使用的namenode掛掉後,會切換備用節點,讓叢集可以繼續執行
二、HA模式配置
HA模式原理:比如設定兩個namenode節點,一個active,一個standby(同時只能active一個namenode),叢集執行中通過JournalNode來同步兩個namenode節點的資料,通過Zookeeper來做節點維護,Zookeeper與節點之間存在一個心跳機制,當Zookeeper檢測不到某個節點的心跳時,則認為節點掛掉了,就會啟動切換機制
1、首先配置journalnode叢集 通訊的超時時間,如果機器配置不好的情況下,連線時間會比較長,所以加大超時時間,生產環境儘量設定越小越好,這樣檢測故障也會更加及時
vim /work/soft/hadoop-2.6.4/etc/hadoop/hdfs-site.xml <property> <name>dfs.qjournal.start-segment.timeout.ms</name> <value>60000</value> </property>
2、failover配置----hdfs-site.xml配置
(1)配置叢集id
(2)配置nodenode組的節點
(3、4)配置每個namenode節點的rpc地址
(5、6)配置每個namenode節點的控制檯地址
(7)配置journalnode叢集的訪問地址,由於我這裡只有兩臺虛擬機器,所以都加上去了,生產環境下,儘量將journalnode和namenode分開在不同的機器,因為一般namenode節點掛了,很可能是因為namenode所在的物理機本身存在一些問題導致,放在一起又會導致journalnode節點也掛掉
(8)配置dfs客戶端,用來判斷哪個namenode是active的
(9、10)配置結束namenode的方式:當檢測到namenode掛掉並進行備用節點切換時,要將之前的namenode徹底幹掉,因為要防止namenode的“假死”,比如namenode所在的機器可能由於網路不好被認為掛掉而切換了備用節點,當原namenode機器網路恢復,就會造成兩個namenode同時工作,導致資料混亂,這就是所謂的“腦裂現象”。為了防止這個現象,當檢測到namenode掛掉,那麼就直接SSH連線到這臺機器上,並將namenode直接kill掉,第10條配置就要指定當初配置SSH生成的私鑰目錄
(11)配置journalnode的資料存放的資料夾(要記得去建立資料夾)
vim /work/soft/hadoop-2.6.4/etc/hadoop/hdfs-site.xml <property> <name>dfs.nameservices</name> <value>stormcluster</value> </property> <property> <name>dfs.ha.namenodes.stormcluster</name> <value>storm1,storm2</value> </property> <property> <name>dfs.namenode.rpc-address.stormcluster.storm1</name> <value>storm1:8020</value> </property> <property> <name>dfs.namenode.rpc-address.stormcluster.storm2</name> <value>storm2:8020</value> </property> <property> <name>dfs.namenode.http-address.stormcluster.storm1</name> <value>storm1:50070</value> </property> <property> <name>dfs.namenode.http-address.stormcluster.storm2</name> <value>storm2:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://storm1:8485;storm2:8485/stormcluster</value> </property> <property> <name>dfs.client.failover.proxy.provider.stormcluster</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>/root/.ssh/id_rsa</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/work/hadoop/jn</value> </property>
3、failover配置----core-site.xml配置
(1)將之前設定的defaultFS修改成我們剛剛配置的叢集id
vim /work/soft/hadoop-2.6.4/etc/hadoop/core-site.xml <property> <name>fs.defaultFS</name> <value>hdfs://stormcluster</value> </property>
4、啟動/停止journalnode
$HADOOP_PREFIX/sbin/hadoop-daemon.sh start journalnode
$HADOOP_PREFIX/sbin/hadoop-daemon.sh stop journalnode
5、啟動後用jps命令看看journalnode節點是否存在
6、將第一個namenode進行格式化
hdfs namenode -format
7、將第二個namenode初始化作為備份
hdfs namenode -bootstrapStandby
8、將第一個namenode的journode進行初始化
hdfs namenode -initializeSharedEdits
9、將兩臺機器的namenode啟動
$HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs start namenode
10、通過50070埠訪問兩臺機的控制檯,可以發現兩個namenode都處於standby狀態
11、執行命令手動切換active節點,將storm1啟用,storm2變成備份,重新整理控制檯,可以發現storm1變成了active,storm2依然是standby
hdfs haadmin -failover storm2 storm1
12、配置zkfc自動化切換
(1)首先配置Zookeeper的超時時間,生產環境儘量設定小一些,及時判斷是否宕機
vim /work/soft/hadoop-2.6.4/etc/hadoop/core-site.xml <property> <name>ha.zookeeper.session-timeout.ms</name> <value>30000</value> </property>
(2)啟動Zookeeper叢集
$ZOOKEEPER_HOME/bin/zkServer.sh start
(3)配置自動化切換和Zookeeper叢集的地址
vim /work/soft/hadoop-2.6.4/etc/hadoop/hdfs-site.xml <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>storm1:2181,storm2:2181</value> </property>
(4)初始化Zookeeper叢集
$HADOOP_PREFIX/bin/hdfs zkfc -formatZK
(5)進入Zookeeper命令列檢視目錄,可以看到多了一個hadoop-ha,說明配置正確
$ZOOKEEPER_HOME/bin/zkCli.sh ls /
(6)我們把兩臺機的namenode都重啟一下
$HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs stop namenode $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs start namenode
(7)通過50070控制檯可以看到兩臺都處於standby狀態(如果namenode起不來,就格式化一下)
(8)啟動zkfc
$HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs start zkfc
(9)用jps命令可以看到新的程序
(10)重新整理50070控制檯,可以發現有一臺namenode已經變成了active
三、總結
1、到此我們的Hadoop叢集已經搭建完畢,終於可以開始使用HBash了,要注意當前叢集節點的啟動順序
zookeeper-->journalnode-->namenode-->zkfc-->datanode
2、以下是按照啟動順序的啟動命令總結
$ZOOKEEPER_HOME/bin/zkServer.sh start $HADOOP_PREFIX/sbin/hadoop-daemon.sh start journalnode $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs start namenode $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs start zkfc $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs start datanode
3、以下是按照啟動順序的停止命令總結
$ZOOKEEPER_HOME/bin/zkServer.sh stop $HADOOP_PREFIX/sbin/hadoop-daemon.sh stop journalnode $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs stop namenode $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script $HADOOP_PREFIX/bin/hdfs stop zkfc $HADOOP_PREFIX/sbin/hadoop-daemon.sh --script hdfs stop datanode
4、經常遇到namenode或者datanode起不來,可以刪除資料目錄,再執行格式化命令
rm -rf /work/hadoop/nn/* rm -rf /work/hadoop/dn/* hdfs namenode -format