1. 程式人生 > >Hadoop 高可用

Hadoop 高可用

fence 服務 fig client zook bsp 組成 機器 prop

NameNode 高可用


?為什麽 NameNode 需要高可用 – NameNode 是 HDFS 的核心配置,HDFS 又是 Hadoop 的核心組件,NameNode 在 Hadoop 集群中至關重要,NameNode機器宕機,將導致集群不可用,如果NameNode 數據丟失將導致整個集群的數據丟失,而 NameNode 的數據的更新又比較頻繁,實現 NameNode 高可用勢在必行 ? 為什麽 NameNode 需要高可用 – 官方提供了兩種解決方案 – HDFS with NFS – HDFS with QJM – 兩種翻案異同 ===============================
NFS QJM =============================== NN NN ZK ZK ZKFailoverController ZKFailoverController NFS JournalNode =============================== ? HA 方案對比
  1. 都能實現熱備
  2. 都是一個active NN 和一個 standby NN
  3. 都使用Zookeeper 和 ZKFC 來實現自勱失效恢復
  4. 失效切換都使用 fencing 配置的方法來 active NN
  5. NFS 數據數據共享變更方案把數據存儲在共享存儲裏面,我們還需要考慮 NFS 的高可用設計
  6. QJM 不需要共享存儲,但需要讓每一個 DN 都知道兩個 NN 的位置,並把塊信息和心跳包 發送給active和 standby這兩個 NN
? NameNode 高可用方案 (QJM) – 為了解決 NameNode 單點故障問題,Hadoop 給出了 HDFS 的高可用HA方案:HDFS 通常由 兩個NameNode組成,一個處於 active 狀態,另一個處於standby 狀態。Active
NameNode對外提供服務,比如處理來自客戶端的 RPC 請求,而 StandbyNameNode 則不 對外提供服務,僅同步 ActiveNameNode 的狀態,以便能夠在它失敗時迚行切換。 ? NameNode 高可用架構 1、 一個典型的HA集群,NameNode會被配置在兩臺獨立的機器上,在任何時間上,一個NameNode 處於活勱狀態,而另一個NameNode處於備份狀態,活勱狀態的NameNode會響應集群中所有的 客戶端,備份狀態的NameNode只是作為一個副本,保證在必要的時候提供一個快速的轉移。 2、為了讓Standby Node與Active Node保持同步,這兩個Node都與一組稱為JNS的互相獨立的進 程保持通信(Journal Nodes)。當Active Node上更新了namespace,它將記錄修改日誌發送給 JNS的多數派。Standby noes將會從JNS中讀取這些edits,並持續關註它們對日誌的變更。 Standby Node將日誌變更應用在自己的namespace中,當failover發生時,Standby將會在提升 自己為Active之前,確保能夠從JNS中讀取所有的edits,即在failover發生之前Standy持有的 namespace 應該不Active保持完全同步。 3、NameNode 更新是很頻繁的,為了的保持主備數據的一致性,為了支持快速failover, Standby node持有集群中blocks的最新位置是非常必要的。為了達到這一目的,DataNodes上需要同時 配置這兩個Namenode的地址,同時和它們都建立心跳鏈接,並把block位置發送給它們 4、還有一點非常重要,任何時刻,只能有一個ActiveNameNode,否則將會導致集群操作的混亂, 那麽兩個NameNode將會分別有兩種不同的數據狀態,可能會導致數據丟失,或者狀態異常, 這種情況通常稱為“split-brain”(腦裂,三節點通訊阻斷,即集群中不同的Datanode 看到了 不同的Active NameNodes)。對於JNS而言,任何時候只允講一個NameNode作為writer;在ailover期間, 原來的Standby Node將會接管Active的所有職能,並負責向JNS寫入日誌記錄, 這種機制阻止了其他NameNode基於處於Active狀態的問題。 技術分享圖片 Hadoop 高可用搭建配置 搭建hadoop高可用 是基於 zookeeper 環境下的 zookeeper 是在啟動的環境下的 首先集群都要配置 /etc/hosts 文件 10.211.55.10 nn01 10.211.55.20 nn02 10.211.55.11 node1 10.211.55.12 node2 10.211.55.13 node3 如果要從新做 所有節點 : 初始化 hdfs 集群,刪除 /var/hadoop/* NN2: 關閉 ssh key 驗證,部署公鑰私鑰 StrictHostKeyChecking no scp nn01:/root/.ssh/id_rsa /root/.ssh/ scp nn01:/root/.ssh/authorized_keys /root/.ssh/ 在一臺Namenode上配置 主 Namenode 配置文件 在NN01上配置
vim  /usr/local/hadoop/etc/hadoop/core-site.xml
<configuration>

    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://nsdcluster</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/hadoop</value>
    </property>
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>node1:2181,node2:2181,node3:2181</value>
    </property>
    <property>
        <name>hadoop.proxyuser.nsd1804.groups</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.nsd1804.hosts</name>
        <value>*</value>
    </property>
</configuration>

  

配置 hdfs-site.xml
vim  /usr/local/hadoop/etc/hadoop/hdfs-site.xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.nameservices</name>
        <value>nsdcluster</value>
    </property>
    <property>
        <name>dfs.ha.namenodes.nsdcluster</name>
        <value>nn1,nn2</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.nsdcluster.nn1</name>
        <value>nn01:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.nsdcluster.nn2</name>
        <value>nn02:8020</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.nsdcluster.nn1</name>
        <value>nn01:50070</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.nsdcluster.nn2</name>
        <value>nn02:50070</value>
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node1:8485;node2:8485;node3:8485/nsdcluster</value>
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/var/hadoop/journal</value>
    </property>
    <property>
        <name>dfs.client.failover.proxy.provider.nsdcluster</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.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
</configuration>

  

配置 mapred-site.xml
 vim   /hadoop/etc/hadoop/mapred-site.xml
<configuration>  
  <property>  
    <name>mapreduce.framework.name</name>  
    <value>yarn</value>  
  </property>  
  <property>  
    <name>mapreduce.jobhistory.address</name>  
    <value>master:10020</value>  
  </property>  
  <property>  
    <name>mapreduce.jobhistory.webapp.address</name>  
    <value>master:19888</value>  
  </property>  
</configuration>

  

配置文件 yarn-site.xml
vim  /usr/local/hadoop/etc/hadoop/yarn-site.xml 
<configuration>

<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property> 
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</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>node1:2181,node2:2181,node3:2181</value>
    </property>
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yarn-ha</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>nn01</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>nn02</value>
    </property>
</configuration>

  

#-----------------------------------------------------#

初始化啟動集群
ALL: 所有機器
nodeX: node1 node2 node3
NN1: nn01
NN2: nn02
#-----------------------------------------------------#


ALL: 同步配置文件到所有集群機器

把上面所有修改的文件同步到其他集群服務器上

NN1: 初始化ZK集群 ./bin/hdfs zkfc -formatZK

nodeX: 啟動 journalnode 服務

cd  /usr/local/hadoop/
./sbin/hadoop-daemon.sh start journalnode
出現下面的就成功了 Successfully created /hadoop-ha/nsdcluster in ZK

NN1: 格式化

./bin/hdfs namenode -format

NN2: 數據同步到本地 /var/hadoop/dfs

把NN1上 /var/hadoop/dfs 同步到 NN2上

NN1: 初始化 JNS
./bin/hdfs namenode -initializeSharedEdits

  

nodeX: 停止 journalnode 服務
./sbin/hadoop-daemon.sh stop journalnode 
#-----------------------------------------------------# 啟動集群 NN1:
./sbin/start-all.sh
NN2:
./sbin/yarn-daemon.sh start resourcemanager

查看集群狀態
./bin/hdfs haadmin -getServiceState nn1  
./bin/hdfs haadmin -getServiceState nn2
./bin/yarn rmadmin -getServiceState rm1
./bin/yarn rmadmin -getServiceState rm2

  

查看狀態
./bin/hdfs dfsadmin -report
./bin/yarn  node  -list

  

訪問集群:
./bin/hadoop  fs -ls  /
./bin/hadoop  fs -mkdir hdfs://nsdcluster/input

  

驗證高可用,關閉 active namenode
./sbin/hadoop-daemon.sh  stop  namenode
./sbin/yarn-daemon.sh  stop  resourcemanager

  

恢復節點
./sbin/hadoop-daemon.sh  start  namenode
./sbin/yarn-daemon.sh  start  resourcemanager

  

Hadoop 高可用