HA運做機制java |
什麼是HAnode |
HADOOP如何實現HAlinux |
|
HDFS-HA詳解shell |
|
HA集羣搭建apache |
目標:api
掌握分佈式系統中HA機制的思想服務器
掌握HADOOP內置HA的運做機制app
掌握HADOOP2.x的HA集羣機制配置運維
前言:正式引入HA機制是從hadoop2.0開始,以前的版本中沒有HA機制eclipse
(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現象的發生
集羣部署節點角色的規劃(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 |
一、環境準備
a/linux系統準備
ip地址配置
hostname配置
hosts映射配置
防火牆關閉
init啓動級別修改
sudoers加入hadoop用戶
ssh免密登錄配置
b/java環境的配置
上傳jdk,解壓,修改/etc/profile
c/zookeeper集羣的部署
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> |
Datanode動態上下線很簡單,步驟以下:
a) 準備一臺服務器,設置好環境
b) 部署hadoop的安裝包,並同步集羣配置
c) 聯網上線,新datanode會自動加入集羣
d) 若是是一次增長大批datanode,還應該作集羣負載重均衡
使用的命令上hdfs haadmin
可用 hdfs haadmin –help查看全部幫助信息
能夠看到,狀態操做的命令示例:
查看namenode工做狀態
hdfs haadmin -getServiceState nn1 |
將standby狀態namenode切換到active
hdfs haadmin –transitionToActive nn1 |
將active狀態namenode切換到standby
hdfs haadmin –transitionToStandby nn2 |
啓動balancer的命令:
start-balancer.sh -threshold 8
運行以後,會有Balancer進程出現:
上述命令設置了Threshold爲8%,那麼執行balancer命令的時候,首先統計全部DataNode的磁盤利用率的均值,而後判斷若是某一個DataNode的磁盤利用率超過這個均值Threshold,那麼將會把這個DataNode的block轉移到磁盤利用率低的DataNode,這對於新節點的加入來講十分有用。Threshold的值爲1到100之間,不顯示的進行參數設置的話,默認是10。
客戶端須要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>