NameNode:node
NameNode 在整個HDFS中處於關鍵的位置,它保存了全部文件系統的元數據信息用來監控每一個DataNode的健康狀態。只有NameNode知道數據從那裏來,將要分配到哪裏去,最後返回給誰。安全
DataNode會每3秒鐘一次經過TCP 9000端口發送心跳給NameNode。每10次心跳生成一個健康報告,心跳數據都會包含相關該DataNode所擁有的數據塊信息。該報告讓NameNode知道不一樣的機架上不一樣的DataNode上存在的數據塊副本,併爲此創建元數據信息。服務器
支持CPU和內存兩種資源調度方式,容許配置每一個節點、 每一個任務可用的CPU和內存資源總量
• 能夠根據實際須要和CPU性能將每一個物理CPU劃分紅若干個 虛擬CPU。管理員可爲每一個節點單獨配置可用的虛擬CPU個數,用戶程序也可指定每一個任務須要的虛擬CPU個數
• 可爲每一個節點單獨配置可用內存,採用線程監控的方案控制內存使用,發現任務超過約定的資源量會將其殺死
• Mesos等資源管理軟件
基於zookeeper的HA原理和相關知識框架
非HA弊端 HDFS集羣的分佈式存儲是靠namenode節點(namenode負責響應客戶端請求)來實現。在非HA集羣中一旦namenode宕機,雖然元數據不會丟失,但整個集羣將沒法對外提供服務,致使HDFS服務的可靠性不高,這在實際應用場景中顯然是不可行的。 HA機制 已知致使服務可靠性不高的緣由是namenode節點宕機,那麼怎麼才能避免這個namenode節點宕機呢?一個容易想到的解決方案是部署兩臺namenode節點,造成主備模式(active/standby模式),這樣一旦active節點宕機,standby節點當即切換到active模式。事實上HA機制就是採起的這種方案。要想實現該機制,須要解決如下問題: 1.爲何選擇主備模式,而不是主主模式(active/active模式),也即讓兩個namenode節點都響應客戶端的請求 一個顯然的前提是,兩臺namenode節點須要保存一致的元數據。 咱們知道namenode節點是用來管理這些元數據的,響應客戶端請求時(上傳)須要增長元數據信息,若是使用主主模式,那麼兩個節點都將對元數據進行寫操做,怎麼同步是個很困難的問題。所以,只能有一臺機器響應請求,也即處在active狀態的節點(可稱爲主節點),而另外一臺namenode在主節點正常工做狀況下僅用來同步active節點的元數據信息,這個namenode稱爲備用節點(處在standby狀態),可見,要解決的問題主要是怎麼同步active節點的元數據信息。 2.怎麼同步兩個namenode節點的元數據 響應客戶端請求的是active節點,所以只有active節點保存了最新的元數據。元數據分爲兩部分,一部分是剛寫入新的元數據(edits),另外一部分是合併後的較舊的(fsimage)。HA機制解決同步問題的方法是將active節點新寫入的edits元數據放在zookeeper集羣上(zookeeper集羣主要功能是實現少許數據的分佈式同步管理),standby節點在active節點正常狀況下只須要將zookeeper集羣上edits文件同步到本身的fsimage中就能夠。 Hadoop框架爲這個集羣專門寫了個分佈式應用qjournal(依賴zookeeper實現),實現qjournal的節點稱爲journalnode。 3.怎麼感知active節點是否宕機,並將standby節點快速切換到active狀態? 解決方案是專門在namenode節點上啓動一個監控進程,時刻監控namenode的狀態。對於處在active狀態的namenode,若是發現不正常就向zookeeper集羣中寫入一些數據。對於處在standby狀態的namenode,監控進程從zookeeper集羣中讀數據,從而感知到active節點是否正常。若是發現異常,監控進程負責將standby狀態切換到active狀態。這個監控進程在hadoop中叫作zkfc(依賴zookeeper實現)。 4.如何在狀態切換時避免brain split(腦裂)? 腦裂:active namenode工做不正常後,zkfc在zookeeper中寫入一些數據,代表異常,這時standby namenode中的zkfc讀到異常信息,並將standby節點置爲active。可是,若是以前的active namenode並無真的死掉,出現了假死(死了一下子後又正常了,哈哈,是否是很搞笑),這樣,就有兩臺namenode同時工做了。這種現象稱爲腦裂。 解決方案:standby namenode感知到主用節點出現異常後並不會當即切換狀態,zkfc會首先經過ssh遠程殺死active節點的 namenode進程(kill -9 進程號)。可是(這樣還不行,驚訝),若是kill指令沒有執行成功咋辦??若是在一段時間內沒有收到執行成功的回執,standby節點會執行一個自定義腳本,儘可能保證不會出現腦裂問題!這個機制在hadoop中稱爲fencing(包括ssh發送kill指令,執行自定義腳本兩道保障)