大數據集羣環境搭建——HDFS HA篇

本次咱們迎來了《大數據集羣環境搭建》的第三篇——HDFS HA篇。HDFS想必你們都不陌生,中文全稱是「Hadoop分佈式文件系統」(什麼,你說中文全稱裏面爲何會有英語單詞?反正Hadoop我是不知道怎麼翻譯)。那麼HA是什麼呢?HA就是High Availability,中文名「高可用」。那麼什麼才叫作「高可用」呢,這就要從Hadoop的歷史來講起了。
long long ago,那時候的Hadoop集羣中還只有一個NameNode節點。咱們知道,HDFS中全部的文件的元數據是存儲在NameNode上的,而真正的文件數據是存儲在DataNode上的。DataNode有不少個,而NameNode卻只有一個,至關於NameNode是全部Node的「帶頭大哥」。在頻繁而大量的讀寫操做下,某一個節點掛掉並非什麼新鮮事。小弟(DataNode)掛了一個兩個的沒關係,畢竟只有一部分數據在裏面,並且還有冗餘備份機制。可是「帶頭大哥」掛掉了可就不妙了,由於全部數據的元數據全都在大哥那裏,大哥一掛掉全部的數據就都無法訪問了。這就是集羣中很是著名的一個問題——單點故障問題。那麼如何避免這個問題呢,曾經有過CheckPoint,BackUp Node等等方案,可是都存在必定問題,最後咱們的HA機制橫空出世,一舉解決了這個單點故障的問題(啪啪啪,此處應有掌聲)。那麼HA機制究竟是幹了什麼呢,簡單的來講,就是在集羣中選出一個「二當家」。這時集羣中就有了兩個NameNode,一個是帶頭大哥(Active狀態),另外一個是「二當家」(Standby狀態)。這個「二當家」平時都幹什麼呢?除了同步「帶頭大哥」的數據外,全部小弟的狀況也都要跟「二當家」彙報(文件塊位置信息,心跳包等)。也就是,他一樣也存儲了全部數據的元數據!這樣一來,當「大哥」有個三長兩短,「二當家」就能迅速接手原來「大哥」的工做,帶領小弟們一如既往的工做(即failover)。這樣集羣就避免了單點故障問題,實現了「高可用」。目前HDFS只支持兩個NameNode的HA機制,但官方的消息是之後可能會推出多個NameNode的HA機制,也就是說在將來,集羣中可能出現「三當家」、「四當家」......咱們的集羣將會愈來愈健壯。
那麼說完了什麼是HA,就要說說HDFS如何是如何實現HA的機制的。爲了在兩個NameNode之間進行數據同步,HDFS支持QJM和NFS。咱們這裏主要講解QJM。
QJM全稱是 Quorum Journal Manager,抱歉這個我又不知道怎麼翻譯。你們只須要理解,當目前處於Active的NameNode發生故障之後,目前處於Standby狀態的NameNode會在把本身的狀態提高爲Active以前,會經過QJM同步全部的以前Active狀態的NameNode的數據。具體的原理你們能夠自行研究。
那麼,對於咱們來說,如何實現HA機制呢?那固然是經過配置文件了。下面我就來和你們一塊兒一步一步的把HDFS HA集羣搭建起來(整個過程可能略長)。部署HDFS HA以前須要配置服務器和ZooKeeper,不太會配置的同窗們能夠參考我以前的文章大數據集羣環境搭建——服務器篇大數據集羣環境搭建——ZooKeeper篇node

一、下載並解壓軟件包

軟件包你們能夠從官網下載本身想要的版本,我這裏用到的是2.7.3。接下來解壓:shell

tar -xzvf hadoop-2.7.3.tar.gz -C /home/hadoop/deploy

你們能夠根據本身實際的目錄狀況自行調整。apache

二、配置Hadoop系統環境變量

建立文件/etc/profile.d/hadoop2.7.3.sh,寫入以下環境變量:bootstrap

export HADOOP_HOME=/home/hadoop/deploy/hadoop-2.7.3
export HADOOP_CONF_DIR=/home/hadoop/deploy/hadoop-2.7.3/etc/hadoop

保存並退出,而後以管理員權限執行:segmentfault

source /etc/profile

三、配置hadoop-env.sh文件

這個文件在$HADOOP_CONF_DIR中,此文件中配置一個JAVA_HOME便可,注意此處填寫絕對路徑,若是填寫$JAVA_HOME可能會存在問題。其餘環境變量請參考官方文檔。服務器

四、配置core-site.xml文件

這個文件在$HADOOP_CONF_DIR中,本文中配置以下變量,其餘變量請參考官方文檔。ssh

(1)fs.defaultFS——HDFS服務發佈地址:

這裏沒有使用master1,而是使用了nameservices特性,配置了命名服務mycluster,至於這個nameservices是個什麼東西,後面將會說明。分佈式

<property>
    <name>fs.defaultFS</name>
    <value>hdfs://mycluster:8020</value>
</property>

(2)hadoop.tmp.dir——hadoop文件父目錄

這個變量將用做其餘一些須要配置本地文件系統路徑的base directory,當這類變量沒有顯式配置時,將使用這個值做爲base directory。ide

<property>
    <name>hadoop.tmp.dir</name>
    <value>file:///home/hadoop/bigdata/hadoop_tmp</value>
</property>

固然,具體路徑仍是要根據實際狀況來配置。oop

(3)ha.zookeeper.quorum——ZooKeeper服務集羣

ZooKeeper會用於兩個NameNode的Active節點選舉。由於以前配置了五臺服務器,因此此處把它們所有寫上。

<property>
    <name>ha.zookeeper.quorum</name>
    <value>master1,master2,slave1,slave2,slave3</value>
</property>

五、配置hdfs-site.xml文件

這個文件也是在$HADOOP_CONF_DIR中。

(1)dfs.replication——HDFS文件系統每一個block冗餘備份數。

<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>

(2)dfs.datanode.data.dir——DataNode中數據所存儲的本地文件系統路徑。

<property>
    <name>dfs.datanode.data.dir</name>
    <value>file:///home/hadoop/bigdata/hdfs_data_dir</value>
</property>

(3)dfs.namenode.name.dir——NameNode中數據所存儲的本地文件系統路徑。

<property>
    <name>dfs.namenode.name.dir</name>
    <value>file:///home/hadoop/bigdata/hdfs_name_dir</value>
</property>

(4)dfs.nameservices——自定義的HDFS服務名。

在但NameNode節點的集羣中,對HDFS集羣訪問的入口是NameNode所在的服務器。可是在兩個NameNode節點的HA集羣中,沒法配置單一服務器入口。因此須要指定一個邏輯上的服務名,這個服務名是自定義的。當外界訪問HDFS集羣時,入口就變爲這個服務。用戶沒必要關心當前具體是哪臺服務器在提供服務(Active狀態),只要訪問這個服務就能夠了。

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

(5)dfs.ha.namenodes.[nameservice ID]——每一個NameNode的惟一標識

此處爲兩個NameNode的惟一標識,也是能夠自定義的。在HDFS集羣管理中會用到

<property>
    <name>dfs.ha.namenodes.mycluster</name>
    <value>nn1,nn2</value>
</property>

(6)dfs.namenode.rpc-address.[nameservice ID].[name node ID]——分別指定每一個NameNode的RPC服務完整監聽地址(hostname+端口號)

<property>
    <name>dfs.namenode.rpc-address.mycluster.nn1</name>
    <value>master1:9000</value>
</property>
<property>
    <name>dfs.namenode.rpc-address.mycluster.nn2</name>
    <value>master2:9000</value>
</property>

(7)dfs.namenode.http-address.[nameservice ID].[name node ID]——指定兩個NameNode的http服務地址

<property>
    <name>dfs.namenode.http-address.mycluster.nn1</name>
    <value>master1:50070</value>
</property>
<property>
    <name>dfs.namenode.http-address.mycluster.nn2</name>
    <value>master2:50070</value>
</property>

(8)dfs.namenode.shared.edits.dir——QJM訪問地址

在沒有配置HA機制的Hadoop分佈式系統中,這個值應該置空。用來進行兩個NameNode節點的元數據同步。推薦將nameservice ID做爲最後的journal ID。配置的節點將會開啓journalnode進程。

<property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://master1:8485;master2:8485;slave1:8485/mycluster</value>
</property>

(9)dfs.journalnode.edits.dir——Journal Node文件存儲地址

<property>
    <name>dfs.journalnode.edits.dir</name>
    <value>/home/hadoop/bigdata/jnode_edits_dir</value>
</property>

(10)dfs.client.failover.proxy.provider.[nameservice ID]

HDFS客戶端用來鏈接集羣中Active狀態節點的Java類,ConfiguredFailoverProxyProvider是目前惟一能夠指定的類

<property>
  <name>dfs.client.failover.proxy.provider.mycluster</name>
  <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

(11)dfs.ha.fencing.methods

這是個值得好好說一下的配置。當配置了HDFS HA集羣時,會有兩個NameNode,爲了不兩個NN都爲Active狀態(這種狀況稱爲split-brain scenario),當發生failover時,Standby的節點要執行一系列方法把原來那個Active節點中不健康的NameNode服務給殺掉(這個過程就稱爲fence)。而下面這個配置就是配置了執行殺死原來Active NameNode服務的方法。這裏面配置的全部方法都會被順序的執行,最後返回結果即爲fence過程的結果。若是fence執行成功,就把原來爲Standby的NameNode的狀態提高爲Active。sshfence方法會經過ssh遠程調用fuser命令去找到NameNode服務並殺死它。咱們的目標是當發生failover時,不論如何,就算前面的sshfence執行失敗(好比服務器上不存在fuser命令),依然把Standby節點的狀態提高爲Active,因此最後不管如何要配置一個shell(/bin/true),保證不論前面的方法執行的狀況如何,最後fence過程返回的結果都爲true。dfs.ha.fencing.ssh.private-key-files配置了ssh命令所須要用到的私鑰。

<property>
    <name>dfs.ha.fencing.methods</name>
    <value>
        sshfence
        shell(/bin/true)
    </value>
</property>
<property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop/.ssh/id_rsa</value>
</property>

(12)dfs.ha.automatic-failover.enabled——是否開啓自動failover機制

由於咱們是要配置自動切換Active狀態的集羣,因此這項必須爲true

<property>
    <name>dfs.ha.automatic-failover.enabled</name>
    <value>true</value>
</property>

五、配置slaves文件

若$HADOOP_CONF_DIR下沒有這個文件,請自行建立。指定DataNode節點,每行一個hostname。這樣集羣中下面配置的每一個節點都將將開啓DataNode服務。

slave1
slave2
slave3

六、啓動HDFS集羣

(1)啓動JournalNode

當全部配置都完成之後,咱們須要先啓動JournalNode服務。在配置了JournalNode服務的每臺服務器上執行

hadoop-daemon.sh start journalnode

(2)格式化NameNode

啓動了JournalNode後(能夠經過jps命令查看),咱們須要格式化NameNode。在nn1(master1)上執行:

hdfs namenode -format

在另外一臺NN服務器nn2(master2)上執行:

hdfs namenode -bootstrapStandby

在每一個JournalNode上執行:

hdfs namenode -initializeSharedEdits

(3)格式化ZooKeeper

在任意一臺NN服務器上執行:

$HADOOP_HOME/bin/hdfs zkfc -formatZK

(4)啓動HDFS

在任意NN上執行

$HADOOP_HOME/sbin/start-dfs.sh

至此,所有部署完成。訪問master1:50070和master2:50070,查看集羣狀態,兩臺NN的狀態應該爲一臺Active,另外一臺一臺Standby。kill掉Active服務器上的NN進程,查看Standby服務器上的NN進程的狀態是否變爲Active,若是是,則部署成功。若是沒有成功,請檢查配置是否正確。

相關文章
相關標籤/搜索