1. 程式人生 > >流式大資料計算實踐(3)----高可用的Hadoop叢集

流式大資料計算實踐(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