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 nn23、數據塊的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 |