hadoop三大核心組件


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工作正常,如果在10分鍾后還接受到不到DN的心跳,那么NN認為DN已經宕機
這時候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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM