關於NameNode高可靠須要配置的文件有core-site.xml和hdfs-site.xml
關於ResourceManager高可靠須要配置的文件有yarn-site.xml
邏輯結構:
NameNode-HA工做原理:
在一個典型的HA集羣中,最好有2臺獨立的機器的來配置NameNode角色,不管在任什麼時候候,集羣中只能有一個NameNode做爲Active狀態,而另外一個是Standby狀態,Active狀態的NameNode負責集羣中全部的客戶端操做,這麼設置的目的,其實HDFS底層的機制是有關係的,同一時刻一個文件,只容許一個寫入方佔用,若是出現多個,那麼文件偏移量便會混亂,從而致使數據格式不可用,固然狀態爲Standby的NameNode這時候僅僅扮演一個Slave的角色,以便於在任什麼時候候Active的NameNode掛掉時,可以第一時間,接替它的任務,成爲主NameNode,達到一個熱備份的效果,在HA架構裏面SecondaryNameNode這個冷備角色已經不存在了,爲了保持從NameNode時時的與主NameNode的元數據保持一致,他們之間交互經過一系列守護的輕量級進程JournalNode,當任何修改操做在主NameNode上執行時,它同時也會記錄修改log到至少半數以上的JornalNode中,這時狀態爲Standby的NameNode監測到JournalNode裏面的同步log發生變化了會讀取JornalNode裏面的修改log,而後同步到本身的的目錄鏡像樹裏面,當發生故障時,Active的NameNode掛掉後,Standby的NameNode會在它成爲Active NameNode前,讀取全部的JournalNode裏面的修改日誌,這樣就能高可靠的保證與掛掉的NameNode的目錄鏡像樹一致,而後無縫的接替它的職責,維護來自客戶端請求,從而達到一個高可用的目的。
爲了達到快速容錯的掌握全局的目的,Standby角色也會接受來自DataNode角色彙報的塊信息,前面只是介紹了NameNode容錯的工做原理,下面介紹下,當引入Zookeeper以後,爲啥能夠NameNode-HA能夠達到無人值守,自動切換的容錯。
在主備切換上Zookeeper能夠乾的事:
(1)失敗探測 在每一個NameNode啓動時,會在Zookeeper上註冊一個持久化的節點,當這個NameNode宕機時,它的會話就會終止,Zookeeper發現以後,就會通知備用的NameNode,Hi,老兄,你該上崗了。
(2)選舉機制, Zookeeper提供了一個簡單的獨佔鎖,獲取Master的功能,若是那個NameNode發現本身獲得這個鎖,那就預示着,這個NameNode將被激活爲Active狀態
固然,實際工做中Hadoop提供了ZKFailoverController角色,在每一個NameNode的節點上,簡稱zkfc,它的主要職責以下:
(1)健康監測,zkfc會週期性的向它監控的NameNode發送健康探測命令,從而來肯定某個NameNode是否處於健康狀態,若是機器宕機,心跳失敗,那麼zkfc就會標記它處於一個不健康的狀態
(2)會話管理, 若是NameNode是健康的,zkfc就會在zookeeper中保持一個打開的會話,若是NameNode同時仍是Active狀態的,那麼zkfc還會在Zookeeper中佔有一個類型爲短暫類型的znode,當這個NameNode掛掉時,
這個znode將會被刪除,而後備用的NameNode,將會獲得這把鎖,升級爲主NameNode,同時標記狀態爲Active,當宕機的NameNode,從新啓動時,它會再次註冊zookeper,發現已經有znode鎖了,便會自動變爲Standby狀態,如此往復循環,保證高可靠,須要注意,目前僅僅支持最多配置2個NameNode。
(3)master選舉,如上所述,經過在zookeeper中維持一個短暫類型的znode,來實現搶佔式的鎖機制,從而判斷那個NameNode爲Active狀態。
node
hdfs-site.xml裏面
web
xml version="1.0" encoding="UTF-8"?> bootstrap
xml-stylesheet type="text/xsl" href="configuration.xsl"?> 架構
<< span="">configuration> app
<< span="">property> ssh
<< span="">name>dfs.replicationname> webapp
<< span="">value>1value> ide
property> oop
<< span="">property>
<< span="">name>yarn.resourcemanager.ha.enabledname>
<< span="">value>truevalue>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.cluster-idname>
<< span="">value>ns1value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.ha.rm-idsname>
<< span="">value>h1,h2value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.ha.automatic-failover.recover.enabledname>
<< span="">value>truevalue>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.recovery.enabledname>
<< span="">value>truevalue>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.hostname.h1name>
<< span="">value>h1value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.hostname.h2name>
<< span="">value>h2value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.store.classname>
<< span="">value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStorevalue>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.zk-addressname>
<< span="">value>h1:2181,h2:2181,h3:2181value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.scheduler.address.h1name>
<< span="">value>h1:8030value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.scheduler.address.h2name>
<< span="">value>h2:8030value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.resource-tracker.address.h1name>
<< span="">value>h1:8031value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.resource-tracker.address.h2name>
<< span="">value>h2:8031value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.address.h1name>
<< span="">value>h1:8032value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.address.h2name>
<< span="">value>h2:8032value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.admin.address.h1name>
<< span="">value>h1:8033value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.admin.address.h2name>
<< span="">value>h2:8033value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.webapp.address.h1name>
<< span="">value>h1:8088value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.webapp.address.h2name>
<< span="">value>h2:8088value>
property>
<< span="">property>
<< span="">name>yarn.resourcemanager.scheduler.classname>
<< span="">value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulervalue>
property>
<< span="">property>
<< span="">name>yarn.nodemanager.aux-servicesname>
<< span="">value>mapreduce_shufflevalue>
property>
<< span="">property>
<< span="">name>yarn.nodemanager.aux-services.mapreduce.shuffle.classname>
<< span="">value>org.apache.hadoop.mapred.ShuffleHandlervalue>
property>
<< span="">property>
<< span="">description>Classpath for typical applications.description>
<< span="">name>yarn.application.classpathname>
<< span="">value>$HADOOP_CONF_DIR
,$HADOOP_COMMON_HOME/share/hadoop/common/*
,$HADOOP_COMMON_HOME/share/hadoop/common/lib/*
,$HADOOP_HDFS_HOME/share/hadoop/hdfs/*
,$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*
,$YARN_HOME/share/hadoop/yarn/*value>
property>
<< span="">property>
<< span="">name>yarn.nodemanager.resource.memory-mbname>
<< span="">value>5632value>
property>
<< span="">property>
<< span="">name>yarn.scheduler.minimum-allocation-mbname>
<< span="">value>1408value>
property>
<< span="">property>
<< span="">name>yarn.scheduler.maximum-allocation-mbname>
<< span="">value>5632value>
property>
configuration>
啓動方式:假設你是新的集羣,若是不是,請參考文末的官網url連接 1,先在集羣中啓動N/2+1個JornalNode進程,寫ssh腳本執行命令:hadoop-daemon.sh start journalnode 2 ,而後在第一臺NameNode上應執行hdfs namenode -format格式化集羣 3,而後在第二臺NameNode上執行hdfs namenode -bootstrapStandby同步第一臺NameNode元數據 4,在第一臺NameNode上執行命令hdfs zkfc -formatZK格式化zookeeper 5,第一臺NameNode上啓動zkfc執行命令:hadoop-daemon.sh start zkfc 6,在第二臺NameNode上啓動zkfc執行命令:hadoop-daemon.sh start zkfc 7,執行start-dfs.sh啓動全部的NameNode,DataNode,JournalNode(注意若是已經啓動就會跳過) 8,執分別訪問兩臺機器的50070端口,查看NameNode狀態,其中一個爲Active,一個爲Standby即爲正常 9,測試容錯,找到狀態爲Active的NameNode的pid進程,並kill掉,查看standby是否會自動晉級爲active,若是 一切安裝完畢,則會自動切換,若是沒切換,注意查看zkfc和namenode的log