Hadoop基本原理
阿新 • • 發佈:2018-12-29
Getting Started
Hadoop是一個用於海量資料統計分析的分散式計算框架,封裝了分散式計算中比較困難的程序間通訊、負載均衡,任務排程等模組,降低了學習門檻。在最簡單的程式實現中,僅僅需要重寫map和reduce方法,並實現任務提交邏輯。接下來,就讓我們一起推開Hadoop的大門,走進大資料的神奇世界。
Hadoop的組成
Hadoop目前主要包括Hadoop1.x和hadoop2.x,兩種版本差距較大,目前常用的是Hadoop2.x版本,所以主要基於Hadoop2.x進行講解
主要組成模組
- Hadoop Distributed File System(HDFS):分散式檔案儲存系統。
- MapReduce:平行計算框架(可以自定義計算邏輯的部分)
- Yet Another Resource Negotiator(YARN):另一種資源協調者(顧名思義,Hadoop1.x採用的不是這一個資源管理器)
MapReduce的工作機制
上圖是MapReduce的工作原理,首先解釋一下各個組成模組的作用。
- Job:由客戶端向叢集提交的一次計算任務。
- Task:叢集的最小可執行單位(一個Job將會分為多個Task執行)
- ResourceManager(以下簡稱RM):管理整個叢集的計算資源,主要用於為每一個Job分配計算資源(整個叢集只有一個RM)
- Container:資源分配單位,一個Container包括一些CPU和儲存資源
- NodeManager(以下簡稱NM):管理單臺伺服器的計算資源,類似RM的更細粒度實現(叢集中每臺伺服器有一個NM)。
- ApplicationMaster(以下簡稱AM):監控每一個Job的執行情況,包括資源申請、Task排程等。
為了便於理解,下面有一個並不是太恰當的比喻。類似一個學生宿舍的構成,RM相當於宿舍管理處的大BOSS,而Task則相當於一個學生,大BOSS(RM)負責分配一片區域給某個班(Job)的學生(Task)住,而具體每個學生(Task)住哪兒,則由班主任(AM)和樓管(NM)商量(當然一個班級的學生還是可以住在多個樓裡邊的)。
接下來具體解釋圖中每一步的作用:
- client呼叫Job提交介面,Job被提交到叢集上
- 為了便於標識Job,會首先向RM請求一個唯一ID,並同時檢查Job中的輸入/輸出路徑是否存在,如果輸入路徑不存在,則報錯;如果輸出路徑存在,也會報錯(注意別看錯了)
- 獲得唯一ID之後,就把Job所需資源(包括Jar包和輸入路徑資訊)上傳到HDFS中(因為分散式環境的原因,需要將這些資源上傳到所有節點都能訪問到的目錄,即這裡的HDFS)
- 在完成以上步驟之後,則可以真正提交Job到叢集中。
- 啟動一個Job的時候,首先需要啟動該Job的AM,所以RM會主動分配NM上的一個Container(一個Container就是一個JVM),用於執行AM守護程序。
- 初始化Job,包括啟動一些Job執行狀態跟蹤物件。
- 從HDFS中讀取第3步上傳的輸入路徑資訊(包括輸入檔案所在的伺服器節點資訊,一份輸入檔案可能儲存在多臺伺服器上)。
- 根據上一步的檔案路徑資訊,向RM申請所需資源(Container),儘量保證Container和輸入檔案在同一臺伺服器上邊,能夠減小網路IO(即資料本地化)
- AM根據RM分配的Container,向Container所屬的NM申請啟動Task。
- Container在收到啟動命令之後,會首先從HDFS下載Task所需Jar包和快取檔案等
- 最後就是Task的正式執行階段了。