大數據雲計算——hadoop組件

 

 

1.1hadoop的概念

Hadoop是 Apache基金會下一個開源的分佈式計算平臺,它以分佈式文件系統HDFS和MapReduce算法爲核心,爲用戶提供了系統底層細節透明的分佈式基礎架構。用戶可以在不瞭解分佈式底層細節的情況下,充分利用分佈式集羣進行高速運算和存儲。

1.2Hadoop的基本組成

Hadoop是一個大數據解決方案。它提供了一套分佈式系統基礎架構.核心內容包含HDFS和mapreduce。hadoop2.0以後引入Yarn.HDFS是提供數據存儲的,mapreduce方便數據計算的。

1. HDFS又對應namenode 和 datanode. namenode 負責保存元數據的基本信息,datanode 直接存放數據本身;主要是爲了解決海量數據的存儲工作。

2. mapreduce 對應 jobtracker 和 tasktracker. jobtracker 負責分發任務, tasktracker 負責執行具體任務;主要是爲了解決海量數據的計算問題

3. 對應到 master/slave 架構, namenode 和 jobtracker 就應該對應到 master, datanode

和 tasktracker 就應該對應到 slave。

4.Yarn :是作業的調度和集羣資源的管理框架:主要是是爲了解決任務的調度工作。

1.3Hadoop的生態圈

Hadoop的生態圈中有很多產品的:

HDFS:分佈式文件系統

HIVE:基於Hadoop的分佈式數據倉庫

HBASE:基於Hadoop的海量數據庫

Zookeeper:分佈式服務協調組件

Mahout:分佈式機器學習庫

Oozie:工作流調度框架

Sqoop:數據導入導出工具

Flume:數據日誌採集框架

Impala:基於hadoop的實時分析框架。

  1. HDFS的分佈式存儲系統

2.1HDFS 的基本原理

2.1.1NameNode

NamaeNode是HDFS的核心也是master nameNode僅僅存儲的HDFS原數據,文件系統中的文件的所有的樹目錄,並跟蹤真個集羣的文件。NameNode不存儲實際的數據的和數據集數據的本身在DataNodes中,Namenode知識知道HDFS任何文件中的塊列表的具體的位置,使用這個NameNode知道如何從快中構建文件。NameNode並不持久化的存儲每一個文件在中和每個DataNodede的位置信息。這些信息在系統啓動的時候從數據的節點的重建。NameNode是HDFS的關鍵在NameNode關閉的時候集羣是無法訪問的、namenode是hadoop的集羣的點點故障。Namenode所在的機器是會配置大量的內存RM的。

2.1.2DataName

DataNode是負責實際的數據的存儲的在HDFS中的。在集羣中也是slave的這樣一個說法。Namenode和dataNode溼會保持不斷的通信的。在DataNode啓動的是將自己的發佈到NameNode中。當DataNode關閉的時候不會影響豬呢個集羣的可用性。Namenode 將安排和其他的數據的DataNode管理的塊驚醒複製。複製dataNode中所在的機器中有大量的硬盤的空間,是因爲大量的數據存儲在其中。

https://img2018.cnblogs.com/blog/1721350/201907/1721350-20190724121237434-1189571085.png

HDFS上問價在物理上是分塊存儲的。每一個塊的代銷是默認是128M.

2.2HDFS的寫流程

https://img2018.cnblogs.com/blog/1426803/201907/1426803-20190729205822422-678186615.png

1客戶端通過對DistributedFileSystem對象調用create()來新建對象。

2DistributedFileSystem對NameNode創建一個RPC調用,在文件系統的命名空間中新建一個文件,此時該文件中還沒有響應的數據塊。NameNode執行各種不同的檢查以確保這個文件不存在以及客戶端有新建該文件的權限。

1如果這些檢查均通過,NameNode就會爲創建新文件記錄一條記錄;DistributedFileStream向客戶端返回一個FSDataOutputStream對象,由此客戶端可以開始寫入數據。就像讀取事件一樣,文件系統數據輸出流控制一個DFSOutputStream,負責處理datanode和namenode之間的通信。

2否則,文件創建失敗並向客戶端拋出一個IOException異常。

3在客戶端寫入數據時,DFSOutputStream將它分成一個個的數據包,並寫入內部隊列,稱爲“數據隊列”(data queue)。DataStreamer處理數據隊列,它的責任是挑選出適合存儲數據複本的一組DataNode,並據此來要求NameNode分配新的數據塊。這一組DataNode構成一個管線——我們假設複本數爲3,所以管線中有3個節點。

4DataStream將數據包流式傳輸到管線中第1個DataNode,該DataNode存儲數據包並將它發送到管線中的第2個DataNode。同樣,第2個DataNode存儲該數據包並且發送給管線中的第3個(也是最後一個)DataNode。

5DFSOutputStream也維護着一個內部數據包隊列來等待DataNode的收到確認回執,稱爲“確認隊列”(ack queue)。收到管道中所有DataNode確認信息後,該數據包纔會從確認隊列刪除。如果有DataNode在數據寫入期間發生故障,則執行以下操作(對寫入數據的客戶端是透明的)。

1首先關閉管線,確認把隊列中的所有數據包都添加回數據隊列的最前端,以確保故障節點下游的DataNode不會漏掉任何一個數據包。

2爲存儲在另一正常DataNode的當前數據塊指定一個新的標識,並將該標識傳送給NameNode,以便故障DataNode在恢復後可以刪除存儲的部分數據塊。

3從管線中刪除故障DataNode,基於兩個正常DataNode構建一條新管線。

4餘下的數據塊寫入管線中正常的DataNode。

5NameNode注意到塊複本量不足時,會在另一個節點上創建一個新的複本。後續的數據塊繼續正常接受處理。

6客戶端完成數據的寫入後,對數據流調用close()。

7在聯繫到NameNode告知其文件寫入完成之前,此操作會將剩餘的所有數據包寫入DataNode管線並等待確認。NameNode已經直到文件由哪些塊組成(因爲Datastreamer請求分配數據塊),所以它在返回成功前只需要等待數據塊進行最小量的複製。

2.3HDFS的讀取流程

https://img2018.cnblogs.com/blog/1426803/201907/1426803-20190729203006403-597776326.png

1、HDFS客戶端通過調用FileSyste對象的open()方法來打開希望讀取的文件,對於HDFS來說,這個對象是DistributedFileSystem的一個實例。

2、DistributedFileSystem通過使用遠程過程調用(RPC)來調用NameNode,以確定文件起始塊的位置。對於每個塊,NameNode返回具有該塊副本的DataNode地址。此外,這些DataNode根據它們與客戶端的距離來排序(根據集羣的網絡拓撲),如果該客戶端本身就是一個DataNode,便從本地讀取數據。接着DistributedFileSystem類返回一個FSDataInputStream對象(一個支持文件定位的輸入流)給客戶端以便讀取數據。FSDataInputStream類轉而封裝DFSInputStream對象,該對象管理着DataNode和NameNode的 I/O。

3、客戶端對這個輸入流調用read()方法,存儲着文件起始幾個塊的DataNode地址的DFSInputStream隨即連接距離最近的文件中第一個塊所在的DataNode。

4、通過對數據流反覆調用read()方法,可以將數據從DataNode傳輸到HDFS 客戶端。

5、讀取數據到塊的末端時,DFSInputStream關閉與該DataNode的連接,然後尋找下一個塊的最佳DataNode。在HDFS客戶端所看來它一直在讀取一個連續的流,這些對於客戶端來說是透明的。

6、客戶端從流中讀取數據時,塊是按照打開DFSInputStream與DataNode新建連接的順序讀取的,它也會根據需要詢問NameNode來檢索下一批數據塊的DataNode的位置,一旦客戶端讀取完畢,就會調用close()方法。但在讀取時,DFSInputStream與DataNode通信時遇到錯誤,會嘗試從這個塊的另外一個最鄰近DataNode讀取數據,它也會記住那個故障DataNode,以保證以後不會反覆讀取該節點上後續的塊。DFSInputStream也會通過校驗和確認從DataNode發來的數據是否完整。如果發現有損壞的塊,DFSInputStream會試圖從其他DataNode讀取其複本,也會將被損壞的塊通知給NameNode

HDFS讀數據過程這一設計的一個重點是:客戶端可以直接連接到DataNode檢索數據,且NameNode告知客戶端每個塊所在的最佳DataNode,由於數據流分散在集羣中的所有DataNode,所以這種設計能使HDFS擴展到大量的併發客戶端。同時,NameNode只需要響應塊位置的請求(這些信息存儲在內存中,因而非常高效),無需響應數據請求,否則隨着客戶端數量的增長,NameNode會很快稱爲瓶頸。

這裏HdfsDataInputStream是FSDataInputStream的子類,這裏是通過子類創建父類對象。

https://img2018.cnblogs.com/blog/1426803/201907/1426803-20190729205752286-587862972.png

  1. MapReduce計算模型

MapReduce是一種編程模型,用於大規模數據集(大於1TB)的並行運算。主要思想是函數式編程語言中的"Map"和"Reduce"概念,來實現海量數據運算的分而治之

Hadoop-mapreduce是hadoop中一個批量計算的框架,在整個mapreduce作業的過程中,包括從數據的輸入,數據的處理,數據的數據輸出這些部分,而其中數據的處理部分就要map,reduce,combiner等操作組成。在一個mapreduce的作業中必定會涉及到如下一些組件:

1、客戶端,提交mapreduce作業

2、yarn資源管理器,負責集羣上計算資源的協調

3、yarn節點管理器,負責啓動和監控集羣中機器上的計算容器(container)

4、mapreduce的application master,負責協調運行mapreduce的作業

5、hdfs,分佈式文件系統,負責與其他實體共享作業文件。

3.1MapReduce架構:

Mapreduce2.0架構圖

a、Client

與MapReduce 1.0 的Client類似,用戶通過Client與YARN交互,提交MapReduce作業,查詢作業運行狀態,管理作業等。

b、MRAppMaster

功能類似於 1.0 中的JobTracker ,但不負責資源管理;

功能包括:任務劃分、資源申請並將之二次分配個Map Task和Reduce Task。

a、MRAppMaster 容錯性

   一旦運行失敗,由YARN 的ResourceManager 負責重新啓動,最多重啓次數可由用戶設置,默認是2 次。一旦超過最高重啓次數,則作業運行失敗。

b、Map Task/Reduce Task

  Task 週期性向MRAppMaster 彙報心跳;

  一旦Task 掛掉,則MRAppMaster 將爲之重新申請資源,並運行之。最多重新運行次數可由用戶設置,默認4 次。

MapReduce的執行流程:

1向資源管理器(ResourceManager)請求,要運行一個程序。中獲取新的作業ID(jobId),以及程序資源存儲路徑

2ResourceManager檢查作業的輸出說明,然後返回一個存放程序資源的路徑以及jobId,這個路徑在hdfs的tmp文件夾中,如果程序中沒有指定輸出目錄或指定的輸出目錄已經存在,作業就不提交,錯誤返回給MapReduce程序就是這個路徑存放程序資源,包括切邊信息,程序的jar包,job.xml配置文件等。

3客戶端去計算作業的輸入分片,把job對象序列化爲job.XML配置文件,裏面全是 key,value。並把切邊序列化成文件保存到hdfs的資源路徑下,如果無法計算,比如因爲輸入路徑不存在,作業就無法提交,將錯誤返回給Mapreduce程序。作業客戶端檢查作業的輸出說明,在計算輸入分片

4將作業資源(包括JAR、配置和分片信息)複製到HDFS,默認保存10份。

5通過調用資源管理器上的submitApplication()方法提交作業。

6資源管理器收到調用它的submitApplication()消息後,如果容器不夠,任務會現在等待隊列中等待,之後便將請求傳遞給調度器(Schedule),調度器分配一個容器,然後資源管理器在節點管理器的管理下在容器中啓動應用程序master進程也就是MRAPPMaster。

MapReduce作業的application master是一個Java應用程序,它的主類是MRAPPMaster他對作業進行初始化,通過創建多個薄記對象以保持對作業進度的跟蹤,因爲他將接受來自任務的進度和完成報告

7MRAPPMaster根據切邊信息,獲知要啓動多少個mapTask,向ResourceManager請求容器

8一旦資源管理器的調度器爲任務分配了容器,MRAPPMaster(application master) 就通過與節點管理器NodeManager通信來啓動容器向已獲得容器的mapTask或reduceerTask發從啓動命令,也就是主類爲YarnChild程序

https://img-blog.csdn.net/20180420165100710?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FBNTE4MTg5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70

MapReduce的應用場景

1、  簡單的數據統計,比如網站pv 、uv 統計

2、  搜索引擎建索引

3、  海量數據查找

4、  複雜數據分析算法實現

5、  聚類算法

6、  分類算法

7、  推薦算法

3.2MapReduce的序列化

Yarn的架構和原理

YARN是Hadoop 2.0的資源管理器。它是一個通用的資源管理系統,可爲上層應用提供統一的資源管理和調度,它的引入爲集羣在利用率、資源統一管理和數據共享等方面帶來了巨大好處。

YARN的基本設計思想是將Hadoop 1.0中的JobTracker拆分成了兩個獨立的服務:一個全局的資源管理器ResourceManager和每個應用程序特有的ApplicationMaster。其中ResourceManager負責整個系統的資源管理和分配,而ApplicationMaster負責單個應用程序的管理,其基本架構如下圖所示:

https://img-blog.csdn.net/20160714170531731?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

YARN總體上仍然是Master/Slave結構。在整個資源管理框架中,ResourceManager爲Master,NodeManager爲Slave,並通過HA方案實現了ResourceManager的高可用。ResourceManager負責對各個NodeManager上的資源進行統一管理和調度。當用戶提交一個應用程序時,需要提供一個用以跟蹤和管理這個程序的ApplicationMaster,它負責向ResourceManager申請資源,並要求NodeManger啓動可以佔用一定資源的任務。由於不同的ApplicationMaster被分佈到不同的節點上,因此它們之間不會相互影響。

ResourceManager:它是一個全局的資源管理器,負責整個系統的資源管理和分配,主要由調度器和應用程序管理器兩個組件構成。

調度器:根據容量、隊列等限制條件,將系統中的資源分配給各個正在運行的應用程序。調度器僅根據應用程序的資源需求進行資源分配,而資源分配單位用一個抽象概念“資源容器”(簡稱Container)表示,Container是一個動態資源分配單位,它將內存、CPU、磁盤、網絡等資源封裝在一起,從而限定每個任務使用的資源量。

應用程序管理器:負責管理整個系統中所有的應用程序,包括應用程序提交、與調度器協商資源以啓動ApplicationMaster、監控ApplicationMaster運行狀態並在失敗時重新啓動它等。

ApplicationMaster:用戶提交的每個應用程序均包含1個ApplicationMaster,主要功能包括與ResourceManager調度器協商以獲取資源、將得到的任務進一步分配給內部的任務、與NodeManager通信以啓動/停止任務、監控所有任務運行狀態並在任務運行失敗時重新爲任務申請資源以重啓任務等。

NodeManager:它是每個節點上的資源和任務管理器,它不僅定時向ResourceManager彙報本節點上的資源使用情況和各個Container的運行狀態,還接收並處理來自ApplicationMaster的Container啓動/停止等各種請求。

Container:它是YARN中的資源抽象,它封裝了某個節點上的多維度資源,如內存、CPU、磁盤、網絡等,當ApplicationMaster向ResourceManager申請資源時,返回的資源便是用Container表示的。YARN會爲每個任務分配一個Container,且該任務只能使用該Container中描述的資源。

1Yarn的工作流程

https://img-blog.csdn.net/20160714170556982?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

步驟1:用戶向YARN中提交應用程序,其中包括用戶程序、ApplicationMaster程序、ApplicationMaster啓動命令等。

步驟2:ResourceManager爲應用程序分配第一個Container,並與對應的NodeManager通信,要求它在這個Container中啓動應用程序的ApplicationMaster。

步驟3:ApplicationMaster首先向ResourceManager註冊,這樣用戶可以直接通過ResourceManager查看應用程序的運行狀態,然後ApplicationMaster爲各個任務申請資源,並監控它們的運行狀態,直到運行結束,即重複步驟4-7。

步驟4:ApplicationMaster用輪詢的方式通過RPC協議向ResourceManager申請和領取資源。

步驟5:一旦ApplicationMaster成功申請到資源,便開始與對應的NodeManager通信,要求它啓動任務。

步驟6:NodeManager爲任務設置好運行環境(包括環境變量、JAR包、二進制程序等)後,將任務啓動命令寫到一個腳本中,並通過運行該腳本啓動任務。

步驟7:各個任務通過某個RPC協議向ApplicationMaster彙報自己的狀態和進度,使ApplicationMaster能夠隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啓動任務。在應用程序運行過程中,用戶可隨時通過RPC向ApplicationMaster查詢應用程序的當前運行狀態。

步驟8:應用程序運行完成後,ApplicationMaster通過RPC協議向ResourceManager註銷並關閉自己。

hadoop的面試問題:

1HDFS的數據的寫數據流程:

HDFS的讀機制

HDFS中的NameNode的機制

 HDFS的DataNode工作機制

MapperReducer的機制

 

 

Yarn集羣的架構原理

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章