前言
我們使用hadoop2.6.0版本配置Hadoop集群,同時配置NameNode+HA、ResourceManager+HA,並使用zookeeper來管理Hadoop集群。
(一)HDFS概述
基礎架構
1、NameNode(Master)
1)命名空間管理:命名空間支持對HDFS中的目錄、文件和塊做類似文件系統的創建、修改、刪除、列表文件和目錄等基本操作。
2)塊存儲管理。
HA架構
從上面的架構圖可以看出,使用Active NameNode,Standby NameNode 兩個節點可以解決單點問題,兩個節點通過JounalNode共享狀態,通過ZKFC 選舉Active ,監控狀態,自動備份。
1、Active NameNode
接受client的RPC請求並處理,同時寫自己的Editlog和共享存儲上的Editlog,接收DataNode的Block report, block location updates和heartbeat。
2、Standby NameNode
同樣會接到來自DataNode的Block report, block location updates和heartbeat,同時會從共享存儲的Editlog上讀取並執行這些log操作,保持自己NameNode中的元數據(Namespcae information + Block locations map)和Active NameNode中的元數據是同步的。所以說Standby模式的NameNode是一個熱備(Hot Standby NameNode),一旦切換成Active模式,馬上就可以提供NameNode服務。
3、JounalNode
用於Active NameNode , Standby NameNode 同步數據,本身由一組JounnalNode節點組成,該組節點奇數個。
4、ZKFC
監控NameNode進程,自動備份。
(二)YARN概述
基礎架構
1、ResourceManager(RM)
接收客戶端任務請求,接收和監控NodeManager(NM)的資源情況匯報,負責資源的分配與調度,啟動和監控ApplicationMaster(AM)。
2、NodeManager
節點上的資源管理,啟動Container運行task計算,上報資源、container情況匯報給RM和任務處理情況匯報給AM。
3、ApplicationMaster
單個Application(Job)的task管理和調度,向RM進行資源的申請,向NM發出launch Container指令,接收NM的task處理狀態信息。
4、Web Application Proxy
用於防止Yarn遭受Web攻擊,本身是ResourceManager的一部分,可通過配置獨立進程。ResourceManager Web的訪問基於守信用戶,當Application Master運行於一個非受信用戶,其提供給ResourceManager的可能是非受信連接,Web Application Proxy可以阻止這種連接提供給RM。
5、Job History Server
NodeManager在啟動的時候會初始化LogAggregationService服務, 該服務會在把本機執行的container log (在container結束的時候)收集並存放到hdfs指定的目錄下. ApplicationMaster會把jobhistory信息寫到hdfs的jobhistory臨時目錄下, 並在結束的時候把jobhisoty移動到最終目錄, 這樣就同時支持了job的recovery.History會啟動web和RPC服務, 用戶可以通過網頁或RPC方式獲取作業的信息。
HA架構
ResourceManager HA 由一對Active,Standby結點構成,通過RMStateStore存儲內部數據和主要應用的數據及標記。目前支持的可替代的RMStateStore實現有:基於內存的MemoryRMStateStore,基於文件系統的FileSystemRMStateStore,及基於zookeeper的ZKRMStateStore。 ResourceManager HA的架構模式同NameNode HA的架構模式基本一致,數據共享由RMStateStore,而ZKFC成為 ResourceManager進程的一個服務,非獨立存在。
(三)規划
主機規划
這里我們使用5 台主機來配置Hadoop集群。
master |
slave1 |
slave2 |
|
---|---|---|---|
namenode |
是 |
是 |
否 |
datanode |
是 |
是 |
是 |
resourcemanager |
是 |
是 |
否 |
journalnode |
是 |
是 |
是 |
zookeeper |
是 |
是 |
是 |
Journalnode和ZooKeeper保持奇數個,這點大家要有個概念,最少不少於 3 個節點。
軟件規划
軟件 |
版本 |
位數 |
說明 |
---|---|---|---|
jdk |
jdk1.7 |
64位 |
最新穩定版本 |
centos |
centos6.5 |
64位 |
|
zookeeper |
Apache zookeeper3.4.6 |
穩定版本 |
|
hadoop |
Apache hadoop2.6.0 |
穩定版本 |
用戶規划
每個節點的hadoop用戶組和用戶需要大家自己創建
(四)集群安裝前的環境檢查
時鍾同步
所有節點的系統時間要與當前時間保持一致。
查看當前系統時間
date Tue Nov 3 06:06:04 CST 2015
如果系統時間與當前時間不一致,進行以下操作。
1 [root@master~]# cd /usr/share/zoneinfo/ 2 [root@master zoneinfo]# ls //找到Asia 3 [root@master zoneinfo]# cd Asia/ //進入Asia目錄 4 [root@master Asia]# ls //找到Shanghai 5 [root@master Asia]# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime //當前時區替換為上海
我們可以同步當前系統時間和日期與NTP(網絡時間協議)一致。
host文件檢查
禁用防火牆
所有節點的防火牆都要關閉
(五)配置SSH免密碼通信
使用命令:
ssh-keygen -t rsa
cat id_rsa.pub >> authorized_keys
所有節點都要執行以上操作
將所有節點的authorized_keys合並
大家通過ssh 相互訪問,如果都能無密碼訪問,代表ssh配置成功。
(六)腳本工具的使用
runRemoteCmd.sh 用於統一執行命令
deploy.sh遠程復制文件腳本
(七)jdk安裝
略 ,每個節點都要安裝
(八)Zookeeper安裝
修改Zookeeper中的配置文件。
[hadoop@master app]$ cd /home/hadoop/app/zookeeper/conf/ [hadoop@master conf]$ ls configuration.xsl log4j.properties zoo_sample.cfg [hadoop@master conf]$ cp zoo_sample.cfg zoo.cfg //復制一個zoo.cfg文件 [hadoop@master conf]$ vi zoo.cfg dataDir=/home/hadoop/data/zookeeper/zkdata //數據文件目錄 dataLogDir=/home/hadoop/data/zookeeper/zkdatalog //日志目錄 # the port at which the clients will connect clientPort=2181 //默認端口號 #server.服務編號=主機名稱:Zookeeper不同節點之間同步和通信的端口:選舉端口(選舉leader) server.1=master:2888:3888 server.2=slave1:2888:3888 server.3=slave2:2888:3888
通過遠程命令deploy.sh將Zookeeper安裝目錄拷貝到其他節點上面。
在所有節點上創建目錄
/home/hadoop/data/zookeeper/zkdata
/home/hadoop/data/zookeeper/zkdatalog
分別在所有節點上創建myid
進入zkdata目錄下,創建文件myid,里面的內容分別填充為:1、2、3
配置zookeeper環境變量
檢查是否安裝成功
/home/hadoop/app/zookeeper/bin/zkServer.sh start
(九)hadoop集群環境搭建
解壓
修改配置文件 切換到/home/hadoop/app/hadoop/etc/hadoop/目錄下。
配置HDFS
配置hadoop-env.sh
export JAVA_HOME=/home/hadoop/app/jdk1.7.0_79
配置core-site.xml
<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://cluster1</value> </property> < 這里的值指的是默認的HDFS路徑 ,取名為cluster1> <property> <name>hadoop.tmp.dir</name> <value>/home/hadoop/data/tmp</value> </property> < hadoop的臨時目錄,如果需要配置多個目錄,需要逗號隔開,data目錄需要我們自己創建> <property> <name>ha.zookeeper.quorum</name> <value>master:2181,slave1:2181,slave2:2181</value> </property> < 配置Zookeeper 管理HDFS> </configuration>
配置hdfs-site.xml
<configuration> <property> <name>dfs.replication</name> <value>3</value> </property> < 數據塊副本數為3> <property> <name>dfs.permissions</name> <value>false</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> < 權限默認配置為false> <property> <name>dfs.nameservices</name> <value>cluster1</value> </property> < 命名空間,它的值與fs.defaultFS的值要對應,namenode高可用之后有兩個namenode,cluster1是對外提供的統一入口> <property> <name>dfs.ha.namenodes.cluster1</name> <value>djt11,djt12</value> </property> < 指定 nameService 是 cluster1 時的nameNode有哪些,這里的值也是邏輯名稱,名字隨便起,相互不重復即可> <property> <name>dfs.namenode.rpc-address.cluster1.master</name> <value>master:9000</value> </property> < djt11 rpc地址> <property> <name>dfs.namenode.http-address.cluster1.master</name> <value>master:50070</value> </property> < djt11 http地址> <property> <name>dfs.namenode.rpc-address.cluster1.slave1</name> <value>slave1:9000</value> </property> < djt12 rpc地址> <property> <name>dfs.namenode.http-address.cluster1.slave1</name> <value>slave1:50070</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> < 啟動故障自動恢復> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;slave1:8485;slave2:8485/cluster1</value> </property> < 指定journal> <property> <name>dfs.client.failover.proxy.provider.cluster1</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> < 指定 cluster1 出故障時,哪個實現類負責執行故障切換> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/hadoop/data/journaldata/jn</value> </property> < 指定JournalNode集群在對nameNode的目錄進行共享時,自己存儲數據的磁盤路徑 > <property> <name>dfs.ha.fencing.methods</name> <value>shell(/bin/true)</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/hadoop/.ssh/id_rsa</value> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>10000</value> </property> < 腦裂默認配置> <property> <name>dfs.namenode.handler.count</name> <value>100</value> </property> </configuration>
配置 slave
[hadoop@masterhadoop]$ vi slaves master
slave1 slave2
然后將配置好的hadoop分發到所有節點
hdfs配置完畢后啟動順序
1、啟動所有節點上面的Zookeeper進程
/home/hadoop/app/zookeeper/bin/zkServer.sh start
2、啟動所有節點上面的journalnode進程
"/home/hadoop/app/hadoop/sbin/hadoop-daemon.sh start journalnode" all
與此同時,需要在備節點(比如,slave1)上執行數據同步
bin/hdfs namenode -bootstrapStandby //同步主節點和備節點之間的元數據
如果上面操作沒有問題,我們可以一鍵啟動hdfs所有相關進程
[hadoop@masterhadoop]$ sbin/start-dfs.sh
7、驗證是否啟動成功
通過web界面查看namenode啟動情況。
http://master:50070
YARN安裝配置
配置mapred-site.xml
配置yarn-site.xml
啟動YARN
1、在master節點上執行。
[hadoop@masterhadoop]$ sbin/start-yarn.sh
2、在slave1節點上面執行。
[hadoop@slave1 hadoop]$ sbin/yarn-daemon.sh start resourcemanager
如果上面執行沒有異常,說明YARN安裝成功。
至此,hadoop 分布式集群搭建完畢。