hadoophdfs、mapreduce、yarn三大元件 Hadoop-ha
Hadoop叢集具體來說包含兩個叢集:HDFS叢集和YARN叢集,兩者邏輯上分離,但物理上常在一起。
(1)HDFS叢集:負責海量資料的儲存,叢集中的角色主要有NameNode/DataNode/SecondaryNameNode。
(2)YARN叢集:負責海量資料運算時的資源排程,叢集中的角色主要有ResourceManager/NodeManager
(3)MapReduce:它其實是一個應用程式開發包。
一、HDFS
HDFS是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS採用master/slave架構。一個HDFS叢集是由一個Namenode和一定數目的Datanodes組成。Namenode是一箇中心伺服器,負責管理檔案系統的名字空間(namespace)以及客戶端對檔案的訪問。叢集中的Datanode一般是一個節點一個,負責管理它所在節點上的儲存。架構如下圖:
A、NameNode
一般情況下,單namenode叢集的最大叢集規模為4000臺
NameNode負責:檔案元資料資訊的操作以及處理客戶端的請求
NameNode管理:HDFS檔案系統的名稱空間NameSpace。
NameNode維護:檔案系統樹(FileSystem)以及檔案樹中所有的檔案和資料夾的元資料資訊(matedata)
維護檔案到塊的對應關係和塊到節點的對應關係
NameNode檔案:namespace映象檔案(fsimage),操作日誌檔案(edit log)
這些資訊被Cache在RAM中,當然這兩個檔案也會被持久化儲存在本地硬碟。
NameNode記錄:每個檔案中各個塊所在的資料節點的位置資訊。
但它並不永久儲存塊的位置資訊,因為這些資訊在系統啟動時由資料節點重建。
從資料節點重建:在nameNode啟動時,DataNode向NameNode進行註冊時傳送給NameNode
1、NameNode元資料資訊
檔名,檔案目錄結構,檔案屬性(生成時間,副本數,許可權)每個檔案的塊列表。
以及列表中的塊與塊所在的DataNode之間的地址對映關係
在記憶體中載入檔案系統中每個檔案和每個資料塊的引用關係(檔案、block、datanode之間的對映資訊)
資料會定期儲存到本地磁碟,但不儲存block的位置資訊而是由DataNode註冊時上報和在執行時維護
2、NameNode檔案操作
NameNode負責檔案元資料的操作
DataNode負責處理檔案內容的讀寫請求,資料流不經過NameNode,會詢問它跟那個DataNode聯絡
3、NameNode職責
全權管理資料塊的複製,週期性的接受心跳和塊的狀態報告資訊(包含該DataNode上所有資料塊的列表)
這時候NN準備要把DN上的資料塊進行重新的複製。
塊的狀態報告包含了一個DN上所有資料塊的列表,blocks report 每個1小時傳送一次
4、NameNode容錯機制
沒有Namenode,HDFS就不能工作。事實上,如果執行namenode的機器壞掉的話,系統中的檔案將會完全丟失,因為沒有其他方法能夠將位於不同datanode上的檔案塊(blocks)重建檔案。因此,namenode的容錯機制非常重要,Hadoop提供了兩種機制。
第一種方式是將持久化儲存在本地硬碟的檔案系統元資料備份。Hadoop可以通過配置來讓Namenode將他的持久化狀態檔案寫到不同的檔案系統中。這種寫操作是同步並且是原子化的。比較常見的配置是在將持久化狀態寫到本地硬碟的同時,也寫入到一個遠端掛載的網路檔案系統(NFS)。
第二種方式是執行一個輔助的Namenode(SecondaryNamenode)。 事實上SecondaryNamenode並不能被用作Namenode它的主要作用是定期的將Namespace映象與操作日誌檔案(edit log)合併,以防止操作日誌檔案(edit log)變得過大。通常,SecondaryNamenode 執行在一個單獨的物理機上,因為合併操作需要佔用大量的CPU時間以及和Namenode相當的記憶體。輔助Namenode儲存著合併後的Namespace映象的一個備份,萬一哪天Namenode宕機了,這個備份就可以用上了。
但是輔助Namenode總是落後於主Namenode,所以在Namenode宕機時,資料丟失是不可避免的。在這種情況下,一般的,要結合第一種方式中提到的遠端掛載的網路檔案系統(NFS)中的Namenode的元資料檔案來使用,把NFS中的Namenode元資料檔案,拷貝到輔助Namenode,並把輔助Namenode作為主Namenode來執行。
5、檔案系統元資料的持久化
Namenode上儲存著HDFS的名字空間。對於任何對檔案系統元資料產生修改的操作,Namenode都會使用一種稱為EditLog的事務日誌記錄下來。例如,在HDFS中建立一個檔案,Namenode就會在Editlog中插入一條記錄來表示;同樣地,修改檔案的副本系數也將往Editlog插入一條記錄。Namenode在本地作業系統的檔案系統中儲存這個Editlog。整個檔案系統的名字空間,包括資料塊到檔案的對映、檔案的屬性等,都儲存在一個稱為FsImage的檔案中,這個檔案也是放在Namenode所在的本地檔案系統上。
Namenode在記憶體中儲存著整個檔案系統的名字空間和檔案資料塊對映(Blockmap)的映像。這個關鍵的元資料結構設計得很緊湊,因而一個有4G記憶體的Namenode足夠支撐大量的檔案和目錄。當Namenode啟動時,它從硬碟中讀取Editlog和FsImage,將所有Editlog中的事務作用在記憶體中的FsImage上,並將這個新版本的FsImage從記憶體中儲存到本地磁碟上,然後刪除舊的Editlog,因為這個舊的Editlog的事務都已經作用在FsImage上了。這個過程稱為一個檢查點(checkpoint)。在當前實現中,檢查點只發生在Namenode啟動時,在不久的將來將實現支援週期性的檢查點。
Datanode將HDFS資料以檔案的形式儲存在本地的檔案系統中,它並不知道有關HDFS檔案的資訊。它把每個HDFS資料塊儲存在本地檔案系統的一個單獨的檔案中。Datanode並不在同一個目錄建立所有的檔案,實際上,它用試探的方法來確定每個目錄的最佳檔案數目,並且在適當的時候建立子目錄。在同一個目錄中建立所有的本地檔案並不是最優的選擇,這是因為本地檔案系統可能無法高效地在單個目錄中支援大量的檔案。當一個Datanode啟動時,它會掃描本地檔案系統,產生一個這些本地檔案對應的所有HDFS資料塊的列表,然後作為報告發送到Namenode,這個報告就是塊狀態報告。
B、DataNode
儲存節點,真正存放資料的節點,用於儲存資料,儲存在磁碟上(在HDFS上儲存的資料副本數預設是3個,這個副本數量是可以設定的)。基本單位是塊(block),預設128M。
Block塊的概念
先不看HDFS的Block,每臺機器都有磁碟,機器上的所有持久化資料都是儲存在磁碟上的。磁碟是通過塊來管理資料的,一個塊的資料是該磁碟一次能夠讀寫的最小單位,一般是512個位元組,而建立在磁碟之上的檔案系統也有塊的概念,通常是磁碟塊的整數倍,例如幾kb。
HDFS作為檔案系統,一樣有塊的概念,對於分散式檔案系統,使用檔案塊將會帶來這些好處:
1.一個檔案的大小不限制於叢集中任意機器的磁碟大小
2.因為塊的大小是固定的,相對比不確定大小的檔案,塊更容易進行管理和計算
3.塊同樣方便進行備份操作,以提高資料容錯性和系統的可靠性
為什麼HDFS的塊大小會比檔案系統的塊大那麼多呢?
操作資料時,需要先從磁碟上找到指定的資料塊然後進行傳輸,而這就包含兩個動作:
1)資料塊定址:找到該資料塊的起始位置
2)資料傳輸:讀取資料
也就是說,操作資料所花費的時間是由以上兩個步驟一起決定的,步驟1所花費的時間一般比步驟2要少很多,那麼當操作的資料塊越多,定址所花費的時間在總時間中就越小的可以忽略不計。所以塊設定的大,可以最小化磁碟的定址開銷。但是HDFS的Block塊也不能設定的太大,會影響到map任務的啟動數,並行度降低,任務的執行資料將會變慢。
★名詞擴充套件:心跳機制、宕機、安全模式
Datanode負責處理檔案系統客戶端的讀寫請求。在Namenode的統一排程下進行資料塊的建立、刪除和複製。叢集中單一Namenode的結構大大簡化了系統的架構。Namenode是所有HDFS元資料的仲裁者和管理者,這樣,使用者資料永遠不會流過Namenode。
C、SecondaryNameNode
輔助節點,用於同步元資料資訊。輔助NameNode對fsimage和edits進行合併(冷備份),下面用SNN代替
NameNode的元資料資訊先往edits檔案中寫,當edits檔案達到一定的閾值(3600秒或大小到64M)的時候,會開啟合併的流程。合併流程如下:
①當開始合併的時候,SNN 會把edits和fsimage拷貝到自己伺服器所在記憶體中,開始合併,合併生成一個名為fsimage.ckpt的檔案。
②將fsimage.ckpt檔案拷貝到NameNode上,成功後,再刪除原有的fsimage,並將fsimage.ckpt檔案重新命名為fsimage。
③當SNN 將edits和fsimage拷貝走之後,NameNode會立刻生成一個edits.new檔案,用於記錄新來的元資料,當合並完成之後,原有的edits檔案才會被刪除,並將edits.new檔案重新命名為edits檔案,開啟下一輪流程。
二 yarn
首先讓我們看一看Yarn的架構
1.ResourceManager概述
是全域性的,負責對於系統中的所有資源有最高的支配權。ResourceManager作為資源的協調者有兩個主要的元件:Scheduler和ApplicationsManager(AsM)。
Scheduler負責分配最少但滿足application執行所需的資源量給Application。Scheduler只是基於資源的使用情況進行排程,並不負責監視/跟蹤application的狀態,當然也不會處理失敗的task。
ApplicationsManager負責處理client提交的job以及協商第一個container以供applicationMaster執行,並且在applicationMaster失敗的時候會重新啟動applicationMaster。
2.NodeManager概述
NM主要負責啟動RM分配給AM的container以及代表AM的container,並且會監視container的執行情況。
在啟動container的時候,NM會設定一些必要的環境變數以及將container執行所需的jar包、檔案等從hdfs下載到本地,也就是所謂的資源本地化;當所有準備工作做好後,才會啟動代表該container的指令碼將程式啟動起來。
啟動起來後,NM會週期性的監視該container執行佔用的資源情況,若是超過了該container所宣告的資源量,則會kill掉該container所代表的程序。
3.ApplicationMaster概述
由於NodeManager 執行和監控任務需要資源,所以通過ApplicationMaster與ResourceManager溝通,獲取資源。換句話說,ApplicationMaster起著中間人的作用。
轉換為更專業的術語:AM負責向ResourceManager索要NodeManager執行任務所需要的資源容器,更具體來講是ApplicationMaster負責從Scheduler申請資源,以及跟蹤這些資源的使用情況以及任務進度的監控。
所以我們看到JobTracker的功能被分散到各個程序中包括ResourceManager和NodeManager:
比如監控功能,分給了NodeManager,和Application Master。
ResourceManager裡面又分為了兩個元件:排程器及應用程式管理器。
也就是說Yarn重構後,JobTracker的功能,被分散到了各個程序中。同時由於這些程序可以被單獨部署所以這樣就大大減輕了單點故障,及壓力。
最後要提醒在yarn上寫應用程式並不同於我們熟知的MapReduce應用程式,必須牢記yarn只是一個資源管理的框架,並不是一個計算框架,計算框架可以執行在yarn上。我們所能做的就是向RM申請container,然後配合NM一起來啟動container。
三搭建Hdfs-HA
一 .環境準備
1. 修改IP
2. 修改主機名及主機名和IP地址的對映
3. 關閉防火牆
4. ssh免密登入
5. 安裝JDK,配置環境變數等
二 .規劃叢集
hadoop102 |
hadoop103 |
hadoop104 |
NameNode |
NameNode |
|
JournalNode |
JournalNode |
JournalNode |
DataNode |
DataNode |
DataNode |
ZK |
ZK |
ZK |
ResourceManager |
||
NodeManager |
NodeManager |
NodeManager |
三 .配置Zookeeper叢集
1. 叢集規劃
在hadoop102、hadoop103和hadoop104三個節點上部署Zookeeper。
2. 解壓安裝
(1)解壓Zookeeper安裝包到/opt/module/目錄下
[jinghang@hadoop102 software]$ tar -zxvf zookeeper-3.4.10.tar.gz -C /opt/module/
(2)在/opt/module/zookeeper-3.4.10/這個目錄下建立zkData
mkdir -p zkData
(3)重新命名/opt/module/zookeeper-3.4.10/conf這個目錄下的zoo_sample.cfg為zoo.cfg
mv zoo_sample.cfg zoo.cfg
3. 配置zoo.cfg檔案
(1)具體配置
dataDir=/opt/module/zookeeper-3.4.10/zkData
增加如下配置
#######################cluster##########################
server.2=hadoop102:2888:3888
server.3=hadoop103:2888:3888
server.4=hadoop104:2888:3888
(2)配置引數解讀
Server.A=B:C:D。
A是一個數字,表示這個是第幾號伺服器;
B是這個伺服器的IP地址;
C是這個伺服器與叢集中的Leader伺服器交換資訊的埠;
D是萬一叢集中的Leader伺服器掛了,需要一個埠來重新進行選舉,選出一個新的Leader,而這個埠就是用來執行選舉時伺服器相互通訊的埠。
叢集模式下配置一個檔案myid,這個檔案在dataDir目錄下,這個檔案裡面有一個數據就是A的值,Zookeeper啟動時讀取此檔案,拿到裡面的資料與zoo.cfg裡面的配置資訊比較從而判斷到底是哪個server。
4. 叢集操作
(1)在/opt/module/zookeeper-3.4.10/zkData目錄下建立一個myid的檔案
touch myid
新增myid檔案,注意一定要在linux裡面建立,在notepad++裡面很可能亂碼
(2)編輯myid檔案
vi myid
在檔案中新增與server對應的編號:如2
(3)拷貝配置好的zookeeper到其他機器上
scp -r zookeeper-3.4.10/ [email protected]:/opt/app/
scp -r zookeeper-3.4.10/ [email protected]:/opt/app/
並分別修改myid檔案中內容為3、4
(4)分別啟動zookeeper
[root@hadoop102 zookeeper-3.4.10]# bin/zkServer.sh start
[root@hadoop103 zookeeper-3.4.10]# bin/zkServer.sh start
[root@hadoop104 zookeeper-3.4.10]# bin/zkServer.sh start
(5)檢視狀態
[root@hadoop102 zookeeper-3.4.10]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
[root@hadoop103 zookeeper-3.4.10]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: leader
[root@hadoop104 zookeeper-3.4.5]# bin/zkServer.sh status
JMX enabled by default
Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg
Mode: follower
四 .配置HDFS-HA叢集
1. 官方地址:http://hadoop.apache.org/
2. 在opt目錄下建立一個ha資料夾
mkdir ha
3. 將/opt/app/下的 hadoop-2.7.2拷貝到/opt/ha目錄下
cp -r hadoop-2.7.2/ /opt/ha/
4. 配置hadoop-env.sh
export JAVA_HOME=/opt/module/jdk1.8.0_144 |
5. 配置core-site.xml
<configuration> <!--把兩個NameNode)的地址組裝成一個叢集mycluster--> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <!-- 指定hadoop執行時產生檔案的儲存目錄 --> <property> <name>hadoop.tmp.dir</name> <value>/opt/ha/hadoop-2.7.2/data/tmp</value> </property> </configuration> |
6. 配置hdfs-site.xml
<configuration> <!-- 完全分散式叢集名稱 --> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <!-- 叢集中NameNode節點都有哪些 --> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <!-- nn1的RPC通訊地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>hadoop102:9000</value> </property> <!-- nn2的RPC通訊地址 --> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>hadoop103:9000</value> </property> <!-- nn1的http通訊地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>hadoop102:50070</value> </property> <!-- nn2的http通訊地址 --> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>hadoop103:50070</value> </property> <!-- 指定NameNode元資料在JournalNode上的存放位置 --> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://hadoop102:8485;hadoop103:8485;hadoop104:8485/mycluster</value> </property> <!-- 配置隔離機制,即同一時刻只能有一臺伺服器對外響應 --> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <!-- 使用隔離機制時需要ssh無祕鑰登入--> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/jinghang/.ssh/id_rsa</value> </property> <!-- 宣告journalnode伺服器儲存目錄--> <property> <name>dfs.journalnode.edits.dir</name> <value>/opt/ha/hadoop-2.7.2/data/jn</value> </property> <!-- 關閉許可權檢查--> <property> <name>dfs.permissions.enable</name> <value>false</value> </property> <!-- 訪問代理類:client,mycluster,active配置失敗自動切換實現方式--> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> </configuration> |
7. 拷貝配置好的hadoop環境到其他節點
五 .啟動HDFS-HA叢集
1. 在各個JournalNode節點上,輸入以下命令啟動journalnode服務
sbin/hadoop-daemon.sh start journalnode
2. 在[nn1]上,對其進行格式化,並啟動
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
3. 在[nn2]上,同步nn1的元資料資訊
bin/hdfs namenode -bootstrapStandby
4. 啟動[nn2]
sbin/hadoop-daemon.sh start namenode
5. 檢視web頁面顯示,如圖3-21,3-22所示
圖3-21 hadoop102(standby)
圖3-22hadoop103(standby)
6. 在[nn1]上,啟動所有datanode
sbin/hadoop-daemons.sh start datanode
7. 將[nn1]切換為Active
bin/hdfs haadmin -transitionToActive nn1
- 檢視是否Active
bin/hdfs haadmin -getServiceState nn1
六 .配置HDFS-HA自動故障轉移
1. 具體配置
(1)在hdfs-site.xml中增加
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
(2)在core-site.xml檔案中增加
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value>
</property>
2. 啟動
(1)關閉所有HDFS服務:
sbin/stop-dfs.sh
(2)啟動Zookeeper叢集:
bin/zkServer.sh start
(3)初始化HA在Zookeeper中狀態:
bin/hdfs zkfc -formatZK
(4)啟動HDFS服務:
sbin/start-dfs.sh
3. 驗證
(1)將Active NameNode程序kill
kill -9 namenode的程序id
(2)將Active NameNode機器斷開網路
service network stop
七.配置YARN-HA叢集
1. 環境準備
(1)修改IP
(2)修改主機名及主機名和IP地址的對映
(3)關閉防火牆
(4)ssh免密登入
(5)安裝JDK,配置環境變數等
(6)配置Zookeeper叢集
2. 規劃叢集
表3-2
hadoop102 |
hadoop103 |
hadoop104 |
NameNode |
NameNode |
|
JournalNode |
JournalNode |
JournalNode |
DataNode |
DataNode |
DataNode |
ZK |
ZK |
ZK |
ResourceManager |
ResourceManager |
|
NodeManager |
NodeManager |
NodeManager |
3. 具體配置
(1)yarn-site.xml
<configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!--啟用resourcemanager ha--> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!--宣告兩臺resourcemanager的地址--> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster-yarn1</value> </property> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2</value> </property> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop102</value> </property> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop103</value> </property> <!--指定zookeeper叢集的地址--> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop102:2181,hadoop103:2181,hadoop104:2181</value> </property> <!--啟用自動恢復--> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!--指定resourcemanager的狀態資訊儲存在zookeeper叢集--> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value> </property> </configuration> |
(2)同步更新其他節點的配置資訊
4. 啟動hdfs
(1)在各個JournalNode節點上,輸入以下命令啟動journalnode服務:
sbin/hadoop-daemon.sh start journalnode
(2)在[nn1]上,對其進行格式化,並啟動:
bin/hdfs namenode -format
sbin/hadoop-daemon.sh start namenode
(3)在[nn2]上,同步nn1的元資料資訊:
bin/hdfs namenode -bootstrapStandby
(4)啟動[nn2]:
sbin/hadoop-daemon.sh start namenode
(5)啟動所有DataNode
sbin/hadoop-daemons.sh start datanode
(6)將[nn1]切換為Active
bin/hdfs haadmin -transitionToActive nn1
- 啟動YARN
(1)如果之前啟動了HDFS服務,關閉所有HDFS服務:
sbin/stop-dfs.sh
(2)再啟動各臺伺服器中的Zookeeper叢集:
bin/zkServer.sh start
(3)在任意伺服器初始化HA在Zookeeper中狀態:
bin/hdfs zkfc -formatZK
(4)在namenode所在的節點啟動HDFS服務:
sbin/start-dfs.sh
(1)在resourcemanager所在的伺服器執行:
sbin/start-yarn.sh
(2)確保兩個resourcemanager都啟動了,如果沒有啟動手動開啟:
sbin/yarn-daemon.sh start resourcemanager