NEIL's_學而時習之x不學無術~私藏IT技術經驗分享部落

關於部落格
NEIL. Cheng....寫作只是為了日後工作之備忘操作參考

本部落格文章撰寫前進邁向第五年(since 2009 ~至今)仍繼續推進分享IT學習!!About Windows/Linux Server,Virtualization


分享網誌: 由於,本人預先完成LAB後,才補上撰寫文章與截圖,若發現文圖對照說明有誤..本人將盡快校正,也請不吝指教! Thanks!

  • 138195

    累積人氣

  • 60

    今日人氣

    0

    訂閱人氣

雲端運算: Hadoop 2.x 以Journalnode+Zookeeper(zkfc)建構HDFS高可性by Navier




 
Hadoop 2.x 版本後,提供了"journalnode"(Quorum Journal Node QJM)集群,

複數Namnanode(nn1,nn2)成員可相互存取與數據共享(edit)log,此時可以實現複數

NamNode(Active/Standy)高可性架構願景.NameNode容錯自動轉移另需倚靠Zookeeper元件

安裝與相關配置就緒,最後搭配Hadoop啟用
ZKFailoverController(zkfc)調度可達成HA設計),避免

NameNode Single Point of Failure(單點故障)造成的杯具..

參考引用圖片:


延續前一Lab篇架構做微調整: 參考Navier Lab設計架構

下圖中共有五個節點: 
      
以下節點皆啟用"JournalNode role"與安裝Zookeeper配置 


nn1(主要namenode) , nn2(備援namenode),rm1(Resource manager)

*共計 3 個JournalNode,3個Zookeper節點數, 2 NameNode配置數,2個

 Datanode(dn01,dn02)


OS: Ubuntu 14.04: 14.04.4 LTS x 5

{

Java ver.  Oracle jdk 1.8.0_66 ;                 *安裝路徑: “/cdh/java8u66”

Hadoop ver. 2.7.2(upgrade):  hadoop-2.7.2.tar.gz  ;  *安裝路徑: “/cdh/hadoop272”

Zookeeper ver. 3.4.8(stable): zookeeper-3.4.8.tar.gz   #至官網預先下載並安裝至以下路徑

*程式安裝路徑: “/home/navier/zookeeper”

 dataDir=/cdh/zoo-data”                              #存放zookeeper data資料目錄定義

“dataLogDir=/cdh/zookeeper-logs”          #存放 zookeeper log目錄路徑

}

*預先配置好本Lab環境變數如下:  "/etc/profile"  同步配置到Hadoop每一台節點

export JAVA_HOME=/cdh/java8u66

export HADOOP_HOME=/cdh/hadoop-272    

export PATH=$PATH:$JAVA_HOME/bin

export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin

export PATH=${JAVA_HOME}/bin:${PATH}

export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar

 export ZOOKEEPER_HOME=/home/navier/zookeeper      #about zookeeper

 

 

export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf


-----
sudo source /etc/profile  

 *Notice:  SSH 節點登入無須輸入密碼在各節點間配置(必須),前幾章節介紹過,在此不贅述

*Hadoop 2.7.2 Lab環境全節點/etc/hosts檔案配置參考如下,請先配置好(以nn1為例)

 *Lab安裝過程中避免運行Zookeeper錯誤訊息,Navier將 localhost與IPV6對應紀錄註解


(1).第一步: 安裝配置"Zookeeper"服務在"nn1,nn2,rm1"三節點上並啟動該服務      

     
 *"nn1"為例
 
 
 
cd  ~/        #navier家目錄
     
  tar zxvf zookeeper-3.4.8.tar.gz
     
  mv   zookeeper-3.4.8  zookeeper
     
  cd  zookeeper/conf

 
-------

   vi  zoo.cfg      #編輯zoo.cfg組態配置存檔
     

 tickTime=2000    #服務器之間或客戶端與服務器之間維持心跳的時間間隔  (毫秒計)

 initLimit=10      #集群中的follower端與leader端之間開始連接時能容忍的最多心跳數
 
  syncLimit=5      #Follower端與Leader端之間請求與回應間可容忍的最多心跳數

 dataDir=/cdh/zoo-data                 #Zookeeper保存數據的目錄

 dataLogDir=/cdh/zookeeper-logs   #Zookeeper日誌紀錄

 clientPort=2181      
 #Client端連接埠


  #zookeeper集群 nn1,nn2.rm1 Port: 2388 follower 連接 Leader 間通訊埠
   
                     
 nn1,nn2.rm1 Port: 3388 做為Leader選舉端口通訊埠
   

    server.1=nn1:2888:3888           
       
    server.2=nn2:2888:3888
         
    server.3=rm1:2888:3888


------


Then 於 nn1,nn2,rm1節點上建立 dataDir,dataLogDir 資料夾


mkdir -p  /cdh/zoo-data   

mkdir -p  /cdh/zookeeper-logs

chown -R  navier.navier  /cdh/zoo-data

chown -R  navier.navier  /cdh/zookeeper-logs

chmod -R 755    /cdh/zookeeper-logs

chmod -R 755   /cdh/zoo-data*


echo   "1"   >  /cdh/zoo-data/myid    #nn1
echo   "2"  >   /cdh/zoo-data/myid #nn2
echo   "3" >   /cdh/zoo-data/myid  
#rm1


Then 拷貝 /home/navier/zookeeper  到 nn2,rm1 節點路徑"/home/navier/zookeeper"

scp    zookeeper    nn2:~/  
scp    zookeeper     rm1:~/


Then一切就緒後依序啟動 nn1,nn2,rm1 3節點Zookeeper集群

zkServer.sg.sh  start  

#下圖中nn1主機,已經將Zookeeper Service Run 起來 服務Port:2181,

鍵入"jps"檢視得"QuorumPeerMain"


 *Zookeeper集群服務已啟動後可檢視rm1,nn2,nn1 Leader,Follower 分配狀況    
     
     
  "zkServer.sh status"
     

        rm1: follower  (ResourceManager)


           nn2: leader  (Namenode)   

          nn1:follower (Namenode)          

  #zookeeper建議配置奇數節點,最少為3個,然而在3個節點(奇數)集群下,可容錯一個節點故障,
 
  當Leader  Role失效時另從nn1,rm1 擇一進行新Leader選舉,再次選出新Leader.


(2).第二步: 修改Hadoop core-site.xml, hdfs-site.xml  配置(Journal node , Zookeeper) 支援組態

 vi  core-site  #以nn1為範例,配置完成請自行拷貝至Hadoop其他節點(nn2,rm1,dn01,dn02)
-------
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://nnx</value>        <!-- 建立一個邏輯Namespace名稱 hdfs://nnx -->
 
</property>

<property>
  <name>fs.trash.interval</name>
  <value>1440</value>
</property>

<property>
  <name>hadoop.tmp.dir</name>
  <value>/cdh/tmp</value>
</property>

<property>

 
<name>ha.zookeeper.quorum</name>

<value>nn1:2181,nn2:2181,rm1:2181</value>

 
<!-- 啟用zookeepr.quorum,成員包含nn1:2181,nn2:2181,rm1:2181  -->                                                             
</property>

</configuration>
-------

 vi  hdfs-site.xml 

-------


<configuration>

<property>
<name>dfs.nameservices</name>
<value>nnx</value>
</property>

<property>
<name>dfs.ha.namenodes.nnx</name>
<value>nn1,nn2</value>     <!-- 將高可用性namenode"nn1,nn2"節點加入-->
 
</property>

<property>
<name>dfs.namenode.rpc-address.nnx.nn1</name>
<value>nn1:8020</value>    <!-- nnx.nn1 rpc-address 與nn2通訊管道定義-->
</property>

<property>
<name>dfs.namenode.http-address.nnx.nn1</name>
<value>nn1:50070</value>  
<!--
nnx.nn1的http-address連線位置,我們可連入後台檢視hdfs/namenode資訊-->
 
</property>

<property>
<name>dfs.namenode.rpc-address.nnx.nn2</name>
<value>nn2:8020</value>    <--! 同樣nn2 意另需配置http.address 與rpc-address位置-->
</property>

<property>
<name>dfs.namenode.http-address.nnx.nn2</name>
<value>nn2:50070</value>
</property>

<property>
<name>dfs.namenode.shared.edits.dir</name>   <!--jaournalnode 成員組成配置啟用-->
<value>qjournal://nn1:8485;nn2:8485;rm1:8485/nnx</value>
</property>
 
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/cdh/journal</value>   <!--指定journalnode data(nn1,nn2)共享"edits,logs"存儲位置-->
</property>
 
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>   #HA高可用性容錯轉移啟用
</property>
 
 
<property>
<name>dfs.client.failover.proxy.provider.nnx</name>  <!--client的failover代理配置-->
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
 
 
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>  
<!--shfence 配置!  QJM僅允許單一namenode讀寫journalnode,須倚靠sshfence-->
<value>/home/navier/.ssh/id_dsa</value>
</property>
 
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>


--剩餘底下設置是前幾篇Lab介紹說明過參數配置本人在此略過描述--"hdfa-Site.xml"配置完成

<property>
<name>replication</name>
<value>2</value>
</property>

<property>
<name>dfs.namenode.name.dir</name>
<value>file:/cdh/nn1</value>
</property>


<property>
<name>dfs.datanode.data.dir</name>
<value>file:/cdh/dn</value>
</property>


<property>
<name>dfs.hosts</name>
<value>/home/navier/hadoop-2.7.1/whitelist</value>
</property>

<property>
<name>dfs.datanode.du.reserved</name>
<value>10240000</value>
</property>

<property>
<name>dfs.datanode.balance.bandwidthPerSec </name>
<value>1024000</value>
</property>

<property>
<name>dfs.permissions</name>
<value>false</value>
</property>

</configuration>

--------

yarn-site.xml   #底下設置是前幾篇Lab介紹說明過參數配置本人在此略過描述"未異動"

<configuration>
<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>


<property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>rm1:8025 </value>
</property>

<property>
<name>yarn.resourcemanager.resource.scheduler.address</name>
<value>rm1:8030</value>
</property>

<property>
<name>yarn.resourcemanager.address</name>
<value>rm1:8050 </value>
</property>

<property>
<name> yarn.resourcemanager.webapp.address</name>
<value>rm1:8088</value>
</property>

<property>
<name>yarn.nodemanager.local-dirs</name>
<value>/cdh/nmn</value>
</property>

<property>
<name>yarn.resourcemanager.nodes.include-path</name>
<value>/cdh/bigdata/yarnlist</value>
</property>

<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>

<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
</property>
 
<property>
  <name>yarn.resourcemanager.system-metrics-publisher.enabled</name>
  <value>true</value>
</property>
</configuration>

---------Then 依序啟動journalnode "nn1,nn2,rm1"
------

 hadoop-daemon.sh start journalnode  #確認三節點journalnode role皆啟用成功

--Name Node Format
--格式化NameNode後,立即啟動第一台NameNode--

hdfs namenode -format  #nn1

hadoop-daemon.sh start namenode  #確定namendoe(nn1)順利啟動"jps"

--登入"nn2"並手動同步"nn1"(NameNode)節點拷貝資料後啟動namnode role--

 hdfs namenode -bootstrapStandby   #nn2 拷貝資料成功

hadoop-daemon.sh start namenode  #確定namendoe(nn2)順利啟動"jps"

Then一切就緒後依序啟動 nn1,nn2,rm1 3節點Zookeeper集群

 zkServer.sh start  #以nn1為例,確認QourumPeerMain Role啟動成功 

Then我們將啟動DataNode,Nodemanager,yarn(Resource Manager)

#dn01,dn02 

hadoop-daemon.sh start datanode
#rm1 (Resource Manager)

start-yarn.sh

1654 Jps
1433 QuorumPeerMain
1578 ResourceManager
1291 JournalNode

Then  我們現在 格式化  
Zookeeper Fail Over controller(zkfs),並啟用zkfc服務

  hdfs  zkfc -formatZK   #nn1,格式化成功

 hadoop-daemon.sh start zkfc  #nn1,nn2,rm1皆須啟用,啟用後可見"DFSZKFailoverController"


最終話: 驗收測試NameNode 自動容錯移轉,模擬"nn1"故障失聯情境

模擬Automatic-Failover情境前先檢視nn1,nn2 namenode (active/standby)資訊

http://nn1:50070  #active正常運作中


http://nn2:50070  # nn2 standby (待命中)

hadoop-daemon.sh stop namenode #nn1手動停用namenode service(模擬故障失聯)


http://nn2:50070  # nn2 active (從原有"standby轉換為active")已成功完成自動容錯移轉

手動調度NameNode Failover Role (Active/Standby)

#首先恢復nn1上線狀態

hadoop-daemon.sh start namenode  #nn1

Then 利用以下指令獲取namenode 目前是處於"active/standby"?

hdfs haadmin -getServiceState nn1
   #得知復原上線後處"standby" 

hdfs haadmin -getServiceState nn2


此時若想將"active" role 轉移回"nn1",我們可以利用以下指令達成即可

 hdfs haadmin -DFSHAAdmin -failover nn2 nn1  
# nn2 => nn1 移轉成功,本Lab結束
相簿設定
標籤設定
相簿狀態