Hadoop 底层原理介绍
1 概述
Apache Hadoop是一個軟件框架,可在具有數千個節點和PB級數據的大型集群上進行分布式處理。
Hadoop主要包含四個項目:Hadoop Common、Hadoop分布式文件系統(HDFS)、YARN(Yet Another Resource Negoiator)、MapReduce。
- HDFS用于存儲數據
- MapReduce用于處理數據
- YARN用來管理集群的資源(CPU和內存)及支持Hadoop的公共實用程序
Hadoop帶來三個組件:
- 可靠的分布式數據存儲框架、
- 用于并行處理數據的框架
- 用于集群資源管理的框架
Hadoop1.0 和 Hadoop2.0 結構對比:
?Hadoop2.0 主要改進:
1、YARN實現資源調度和管理,使Hadoop2.0可以運行更多種類的計算框架,如Spark、Giraph等
2、實現了NameNode的HA方案,即同時有2個NameNode(一個Active另一個Standby),如果ActiveNameNode掛掉的話,另一個NameNode會轉入Active狀態提供服務,保證了整個集群的高可用。
3、實現了HDFS federation,由于元數據放在NameNode的內存當中,內存限制了整個集群的規模,通過HDFS federation使多個NameNode組成一個聯邦共同管理DataNode,這樣就可以擴大集群規模。
4、Hadoop RPC序列化擴展性好,通過將數據類型模塊從RPC中獨立出來,成為一個獨立的可插拔模塊。
RPC:RPC 的主要功能目標是讓構建分布式計算(應用)更容易,在提供強大的遠程調用能力時不損失本地調用的語義簡潔性。為實現該目標,RPC 框架需提供一種透明調用機制讓使用者不必顯式的區分本地調用和遠程調用。
HA(High Available):雙機集群系統的簡稱,指高可用性集群,是保證業務連續性的有效解決方案,一般有兩個或兩個以上的節點,且分為活動節點及備用節點。通常把正在執行業務的稱為活動節點,而作為活動節點的一個備份的則稱為備用節點。當活動節點出現問題,導致正在運行的業務(任務)不能正常運行時,備用節點此時就會偵測到,并立即接續活動節點來執行業務。從而實現業務的不中斷或短暫中斷。
2 HDFS概述
HDFS是一種分布式文件系統,在低價通用硬件的大型集群上提供高擴展性和可靠性。具有高容錯的特點。
HDFS文件會劃分成數據塊,分布在集群中,每個區塊大小通常128MB。每個區塊會被復制3份,以便故障處理。
區塊的元數據(文件名、區塊、位置、創建的日期和大小)會存儲在管理結點中。HDFS具有較大的區塊大小,從而減少了讀取完整文件所需的磁盤尋道次數 。
主要特點:
1、支持超大文件:支持TB級的數據文件。
2、檢測和快速應對硬件故障:HDFS的檢測和冗余機制很好克服了大量通用硬件平臺上的硬件故障問題。
3、高吞吐量:批量處理數據。
4、簡化一致性模型:一次寫入多次讀取的文件處理模型有利于提高吞吐量。
構成:NameNode保存HDFS的元數據;DataNode將HDFS數據以文件形式存儲在本地文件系統上,并不知道有關HDFS文件的信息。
數據塊:是HDFS的文件存儲處理單元,默認128MB,可根據業務配置。數據塊的存在,使HDFS可保存比存儲節點單一磁盤大的文件,簡化了存儲管理,方便容錯,有利于數據復制。
3 HDFS讀寫流程
讀文件流程:
1. client使用open()打開文件
2. 分布式文件系統用RPC調用數據節點,得到文件數據塊信息
3. 對每個數據塊,NameNode返回保存數據塊的數據節點的地址
4. 分布式文件系統返回FSDataInputStream給client,用來讀取數據
5.client調用FSDataInputStream的read()開始讀取數據
6. FSDataInputStream連接保存此文件第一個數據塊的最近數據節點
7. data從數據節點讀到 client
8. 當此數據塊讀取完畢,FSDataInputStream關閉和此數據節點的連接,然后連接此文件下一數據塊的最近數據節點
9. 當client讀取數據完畢,調用FSDataInputStream的close()函數
10. 讀取數據過程中。若client與數據節點通信出現錯誤,則嘗試連接包含此數據塊的下一個數據節點。失敗的數據節點將被記錄,以后不再連接。
流程圖如下:
寫文件流程:
1.client調用create()創建文件
2. 分布式文件系統用RPC調用NameNode節點,在文件系統的命名空間中創建一個新的文件
3. NameNode節點首先確定文件是否存在,并且client是否有創建文件的權限,然后創建新文件
4. 分布式文件系統返回FSDataOutputStream給client用于寫數據
5. client開始寫入數據,FSDataOutputStream將數據分塊,寫入data queue
6. data queue 由 DataStreamer 讀取,并通知NameNode節點分配數據節點用來存儲數據塊(每塊默認復制3塊),分配的數據節點放在一個pipeline里
7. DataStreamer 將數據塊寫入pipeline中第一個數據節點,第一個數據節點把數據塊發給第二個,第二個發給第三個
8. FSDataOutputStream 為發出去的數據塊保存ack queue,等待pipeline中數據節點告知數據已寫入成功
9. 若數據節點寫入過程中失敗,則進行以下操作:
(1)關閉pipeline并把ack queue中數據塊放入data queue的開始
(2)當前數據塊在已寫入的數據節點中被NameNode結點賦予 新的標識,錯誤節點重啟后察覺其數據塊過時而被刪除
(3)失敗數據節點從pipeline移除,另外的數據塊則寫入pipeline中另外的數據節點
(4)NameNode結點被通知此數據塊復制塊數不足,從而創建第三份備份
10. 客戶端結束寫入數據,調用close()將所有數據塊寫入pipeline中數據節點,等待ack queue返回成功,最后通知NameNode結點寫入完畢。
流程圖如下:
4 YARN原理介紹
4.1 YARN產生背景
1. 擴展性差:JobTracker同時兼備了資源管理和作業控制兩個功能,這是整個系統的最大瓶頸,它嚴重制約了整個集群的擴展性
2. JobTracker存在單點故障,JobTracker出現問題將導致整個集群不可用
3. 資源利用率低:資源無法在多個任務間共享或合理分配,導致無法有效利用各種資源。
4. 無法支持多種計算框架:Hadoop 1.0只支持MapReduce這種離線批處理計算模式,而無法支持內存計算、流式計算、迭代式計算等。
注:內存計算:隨著大容量內存技術的興起,專家開始提出在初始階段就把數據全部加載到內存中,而后可直接把數據從內存中調取出來,再由處理器進行計算。這樣可以省去外存與內存之間的數據調入/調出過程,從而大大提升計算速度。
流式計算:利用分布式的思想和方法,對海量“流”式數據進行實時處理,源自業務對海量數據,在“時效”的價值上的挖掘訴求。
4.2 YARN基本架構
YARN是Hadoop2.0的資源管理器。它是一個通用的資源管理系統,可為上層應用提供統一的資源管理和調度。
YARN的基本設計思想是將Hadoop 1.0中的JobTracker拆分成了兩個獨立的服務:
一個全局的資源管理器ResourceManager:負責整個系統的資源管理和分配
每個應用程序特有的ApplicationMaster:負責單個應用程序的管理
基本架構如下圖:
YARN總體上是Master/Slave結構,ResourceManager為Master,NodeManager為Slave,通過HA方案實現ResourceManager高可用。ResourceManager負責對各個NodeManager上的資源進行統一管理和調度。當用戶提交一個應用程序時,需要提供一個用以跟蹤和管理這個程序的ApplicationMaster,它負責向ResourceManager申請資源,并要求NodeManger啟動可以占用一定資源的任務。由于不同的ApplicationMaster被分布到不同的節點上,因此它們之間不會相互影響。
Master/Slave結構:一個HDFS集群包含一個單獨的Master節點和多個Slave節點服務器,這里的一個單獨的Master節點的含義是HDFS系統中只存在一個邏輯上的Master組件。一個邏輯的Master節點可以包括兩臺物理主機,即兩臺Master服務器、多臺Slave服務器。一臺Master服務器組成單NameNode集群,兩臺Master服務器組成雙NameNode集群,并且同時被多個客戶端訪問。
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中描述的資源。
4.3 YARN工作流程
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注銷并關閉自己
5 MapReduce原理介紹
5.1 MapReduce介紹
MapReduce是由Google公司研究提出的一種面向大規模數據處理的并行計算模型和方法,是Hadoop面向大數據并行處理的計算模型、框架和平臺。
MapReduce執行流包括input、map、shuffle、reduce和output共5個過程,如下圖所示:
5.2 MapReduce原型原理:
YARN框架下MapReduce工作流程圖:
?
1. 客戶端向集群提交作業
2. Job從ResouceManager獲取新的作業應用程序ID
3. 客戶端檢查作業的輸出情況,計算分片,將作業jar包、配置、分片信息等作業資源復制到HDFS
4.Job向ResourceManager提交作業
5. ResourceManager接收到作業后,將作業請求傳遞給調度器,調度器根據作業信息為ResourceManager分配一個container,然后ResourceManager在NodeManager的管理下,在container中啟動一個ApplicationMaster進程
6. ApplicationMaster對作業進行初始化,并保持對作業的跟蹤,判斷作業是否完成
7. ApplicationMaster根據存儲在HDFS中的分片信息確定Map和Reduce的數量
8. ApplicationMaster為本次作業的Map和Reduce以輪詢的方式向ResourceManager申請container
9. ApplicationMaster獲取到container后,與NodeManager進行通信啟動container
10.? container從HDFS中獲取作業的jar包、配置和分布式緩存文件等,將任務需要的資源本地化
11. container啟動Map或Reduce任務
5.3 shuffle及排序
MapReduce的map端輸出作為輸入傳給reduce端,并按鍵排序的過程稱為shuffle。shuffle字面含義是洗牌,即將map產生的數據通過分區、排序等過程分配給不同reduce任務。MapReduce數據處理流程:
Map階段:
1. 每個輸入分片讓一個map任務處理,默認情況下,以HDFS一個塊的大小為一個分片。map輸出結果暫存在一個環形內存緩沖區中。當該緩沖區快要溢出時,會在本地文件系統創建溢出文件,將該緩沖區中的數據寫入這個文件。
2. 在寫入磁盤之前,線程首先根據reduce任務的數目將數據劃分為相同數目的分區,也就是一個reduce任務對應一個分區的數據。然后對每個分區中的數據進行排序,如果此時設置了Combiner,將排序后的結果進行combine操作,這樣做可以有效減少磁盤IO和網絡IO。
3. 當map任務輸出最后一個記錄時,可能會有很多的溢出文件,這時需要將這些文件合并。合并的過程中會不斷地進行排序和combine操作,這樣做是為了盡量減少每次寫入磁盤的數據量和盡量減少下一復制階段網絡傳輸的數據量。最后合并成了一個已分區且已排序的文件。為了減少網絡傳輸的數據量,這里可以將數據壓縮。
4. 將分區中的數據拷貝給相對應的reduce任務。ApplicationMaster保存了整個作業的宏觀信息,只要reduce任務向ApplicationMaster獲取對應的map輸出位置就可以了。
Reduce階段:
1. Reduce會接收到不同map任務傳來的數據,并且每個map傳來的數據都是有序的。如果reduce接受的數據量相當小,則直接存儲在內存中,如果數據量超過了該緩沖區大小的一定比例,則對數據合并后溢寫到磁盤中
2. 隨著溢寫文件的增多,后臺線程會將它們合并成一個更大的有序文件,這樣做是為了給后面的合并節省時間。其實不管在map端還是reduce端,MapReduce都是反復地執行排序、合并操作,所以說排序是hadoop的靈魂
3.在合并的過程中會產生許多的中間文件(寫入磁盤了),但MapReduce會讓寫入磁盤的數據盡可能地少,并且最后一次合并的結果并沒有寫入磁盤,而是直接輸入到reduce函數
?
總結
以上是生活随笔為你收集整理的Hadoop 底层原理介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mining Precision Int
- 下一篇: Apache Spark概述