標籤:

HADOOP高可用機制

1 Hadoop的HA機制

前言:正式引入HA機制是從hadoop2.0開始,之前的版本中沒有HA機制

1.1 HA的運作機制

(1)hadoop-HA集群運作機制介紹

所謂HA,即高可用(7*24小時不中斷服務)

實現高可用最關鍵的是消除單點故障

hadoop-ha嚴格來說應該分成各個組件的HA機制——HDFS的HA、YARN的HA

(2)HDFS的HA機制詳解

通過雙namenode消除單點故障

雙namenode協調工作的要點:

A、元數據管理方式需要改變:

內存中各自保存一份元數據

Edits日誌只能有一份,只有Active狀態的namenode節點可以做寫操作

兩個namenode都可以讀取edits

共享的edits放在一個共享存儲中管理(qjournal和NFS兩個主流實現)

B、需要一個狀態管理功能模塊

實現了一個zkfailover,常駐在每一個namenode所在的節點

每一個zkfailover負責監控自己所在namenode節點,利用zk進行狀態標識

當需要進行狀態切換時,由zkfailover來負責切換

切換時需要防止brain split現象的發生

1.2 HDFS-HA圖解:

1.2 HA集群的安裝部署

1.2.1 集群節點規劃

集群部署節點角色的規劃(10節點):

server01 namenode zkfc > start-dfs.sh

server02 namenode zkfc

server03 resourcemanager > start-yarn.sh

server04 resourcemanager

server05 datanode nodemanager

server06 datanode nodemanager

server07 datanode nodemanager

server08 journal node zookeeper

server09 journal node zookeeper

server10 journal node zookeeper

集群部署節點角色的規劃(3節點)

server01 namenode resourcemanager zkfc nodemanager datanode zookeeper journal node

server02 namenode resourcemanager zkfc nodemanager datanode zookeeper journal node

server05 datanode nodemanager zookeeper journal node

1.2.2 環境準備

1、環境準備

a/linux系統準備

ip地址配置

hostname配置

hosts映射配置

防火牆關閉

init啟動級別修改

sudoers加入hadoop用戶

ssh免密登陸配置

b/java環境的配置

上傳jdk,解壓,修改/etc/profile

c/zookeeper集群的部署

1.2.3 配置文件

core-site.xml

<configuration>

<!-- 指定hdfs的nameservice為ns1 -->

<property>

<name>fs.defaultFS</name>

<value>hdfs://ns1/</value>

</property>

<!-- 指定hadoop臨時目錄 -->

<property>

<name>hadoop.tmp.dir</name>

<value>/home/hadoop/app/hadoop-2.4.1/tmp</value>

</property>

<!-- 指定zookeeper地址 -->

<property>

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

<value>weekend05:2181,weekend06:2181,weekend07:2181</value>

</property>

</configuration>

hdfs-site.xml

configuration>

<!--指定hdfs的nameservice為ns1,需要和core-site.xml中的保持一致 -->

<property>

<name>dfs.nameservices</name>

<value>ns1</value>

</property>

<!--

ns1下面有兩個NameNode,分別是nn1,nn2 -->

<property>

<name>dfs.ha.namenodes.ns1</name>

<value>nn1,nn2</value>

</property>

<!--

nn1的RPC通信地址 -->

<property>

<name>dfs.namenode.rpc-address.ns1.nn1</name>

<value>weekend01:9000</value>

</property>

<!--

nn1的http通信地址 -->

<property>

<name>dfs.namenode.http-address.ns1.nn1</name>

<value>weekend01:50070</value>

</property>

<!--

nn2的RPC通信地址 -->

<property>

<name>dfs.namenode.rpc-address.ns1.nn2</name>

<value>weekend02:9000</value>

</property>

<!--

nn2的http通信地址 -->

<property>

<name>dfs.namenode.http-address.ns1.nn2</name>

<value>weekend02:50070</value>

</property>

<!--

指定NameNode的edits元數據在JournalNode上的存放位置 -->

<property>

<name>dfs.namenode.shared.edits.dir</name>

<value>qjournal://weekend05:8485;weekend06:8485;weekend07:8485/ns1</value>

</property>

<!--

指定JournalNode在本地磁碟存放數據的位置 -->

<property>

<name>dfs.journalnode.edits.dir</name>

<value>/home/hadoop/app/hadoop-2.4.1/journaldata</value>

</property>

<!--

開啟NameNode失敗自動切換 -->

<property>

<name>dfs.ha.automatic-failover.enabled</name>

<value>true</value>

</property>

<!--

配置失敗自動切換實現方式 -->

<property>

<name>dfs.client.failover.proxy.provider.ns1</name>

<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>

</property>

<!--

配置隔離機制方法,多個機制用換行分割,即每個機制暫用一行-->

<property>

<name>dfs.ha.fencing.methods</name>

<value>

sshfence

shell(/bin/true)

</value>

</property>

<!--

使用sshfence隔離機制時需要ssh免登陸 -->

<property>

<name>dfs.ha.fencing.ssh.private-key-files</name>

<value>/home/hadoop/.ssh/id_rsa</value>

</property>

<!--

配置sshfence隔離機制超時時間 -->

<property>

<name>dfs.ha.fencing.ssh.connect-timeout</name>

<value>30000</value>

</property>

/configuration>

1.2.4 集群運維測試

1、Datanode動態上下線

Datanode動態上下線很簡單,步驟如下:

a) 準備一台伺服器,設置好環境

b) 部署hadoop的安裝包,並同步集群配置

c) 聯網上線,新datanode會自動加入集群

d) 如果是一次增加大批datanode,還應該做集群負載重均衡

2、Namenode狀態切換管理

使用的命令上hdfs haadmin

可用 hdfs haadmin –help查看所有幫助信息

可以看到,狀態操作的命令示例:

查看namenode工作狀態

hdfs

haadmin -getServiceState nn1

將standby狀態namenode切換到active

hdfs

haadmin –transitionToActive nn1

將active狀態namenode切換到standby

hdfs

haadmin –transitionToStandby nn2

3、數據塊的balance

啟動balancer的命令:

start-balancer.sh

-threshold 8

運行之後,會有Balancer進程出現:

上述命令設置了Threshold為8%,那麼執行balancer命令的時候,首先統計所有DataNode的磁碟利用率的均值,然後判斷如果某一個DataNode的磁碟利用率超過這個均值Threshold,那麼將會把這個DataNode的block轉移到磁碟利用率低的DataNode,這對於新節點的加入來說十分有用。Threshold的值為1到100之間,不顯示的進行參數設置的話,默認是10。

1.2.5 HA下hdfs-api變化

客戶端需要nameservice的配置信息,其他不變

/**

* 如果訪問的是一個ha機制的集群

* 則一定要把core-site.xml和hdfs-site.xml配置文件放在客戶端程序的classpath下

* 以讓客戶端能夠理解hdfs://ns1/中 「ns1」是一個ha機制中的namenode對——nameservice

* 以及知道ns1下具體的namenode通信地址

* @author

*

*/

public

class UploadFile {

public static void main(String[]

args) throws Exception {

Configuration conf = new

Configuration();

conf.set("fs.defaultFS",

"hdfs://ns1/");

FileSystem fs =

FileSystem.get(new URI("hdfs://ns1/"),conf,"hadoop");

fs.copyFromLocalFile(new

Path("g:/eclipse-jee-luna-SR1-linux-gtk.tar.gz"), new

Path("hdfs://ns1/"));

fs.close();

}

}

Federation下 mr程序運行的staging提交目錄問題

<property>

<name>yarn.app.mapreduce.am.staging-dir</name>

<value>/bi/tmp/hadoop-yarn/staging</value>

<description>The staging dir used while

submitting jobs.

</description>

</property>


推薦閱讀:

hadoop和大數據的關係?和spark的關係?互補?並行?
為什麼有的hadoop課程會講授python?
既然Spark比Hadoop性能好很多,Hadoop未來發展方向是什麼?
Azkaban入門篇
eclipse中,如何導入hadoop2.6.0的源碼?請大神給出詳細步驟?

TAG:Hadoop |