hadoop知識點彙總
一、Hadoop的主要模組
- Hadoop Common: 基礎模組
- Hadoop Distributed File System (HDFS): 分散式檔案系統
- Hadoop YARN:hadoop的資源管理平臺[Yet Another Resource Negotiator,另一種資源協調者]
Hadoop MapReduce: 一個分散式的平行計算框架.
主要分兩步:map階段和reduce階段 map:執行在多臺伺服器上進行計算 reduce:預設執行在一臺 機器中,對map執行的結果進行合併分析
1、HDFS架構:儲存資料
- NameNode:存放元資料[資料的基本屬性]
- DataNode:存放具體檔案資料
SecondaryNameNode:輔助NameNode的
注意:採用備份機制保證資料的安全性,並且檔案按塊存放,預設每塊的大小為128M
2、YARN架構:資源管理平臺[在hadoop1.x中沒有的,這是hadoop2.x與hadoop1.x最大的區別]
- ResourceManager:資源管理節點
- NodeManager:資料處理節點
- Container:資源物件封裝
Application Master:當前job的管理者
注意:每一個job都需要通過RM分配資源並且將資源物件封裝成Container,然後RM選擇一個NM啟動App Mstr,App Mstr負責該job的執行過程,並將最後的執行結果彙報給RM
二、HDFS架構
- 主從架構【NameNode/DataNodes】
- NameNode存放元資料【檔名、檔案的存放位置、檔案的副本個數。。。】
- DataNode存放資料【以塊的形式進行儲存,預設每個塊的大小為128M】,真正響應客戶端讀取數的
- 在一個HDFS檔案系統中一般NameNode只有一個,DataNode可以存在多個,並且每一個伺服器中只啟動對應一個程序.
- DataNode會週期性的向NameNode傳送心跳機制、NameNode管理檔案和DataNode服務的對應關係(記憶體)
- NameNode整個叢集的訪問入口、會監聽DataNode節點的存活狀態(DataNode
3秒鐘傳送一次,10分鐘如果NameNode接受不到某一個DataNode節點心跳資訊,那麼NameNode就 認為該DataNode節點失效,NameNode就需要將該DataNode節點中資料進行備份)。一個數據塊在DataNode以檔案儲存在磁碟上,包括兩個檔案,一個是資料本身,一個是元資料包括資料塊的長度,塊資料的校驗和,以及時間戳
/opt/modules/hadoop-2.5.0/data/dfs/data/current/BP-1950595699-192.168.17.100-1487039906884/current/finalized hdfs的DataNode中資料在物理磁碟中的具體儲存位置
副本存放策略
1. 第一個副本存放在本機架某一個DataNode節點中 2. 第二個副本放在同一個機架的另外一個DataNode節點中 3. 第三副本放在另外一個機架的節點中 4. 客戶端讀取資料的原則:就近原則 5. 機架感知(RackAwareness)
三、NameNOde啟動流程
- Name啟動的時候首先將fsimage(映象)載入記憶體,並執行(replay)編輯日誌editlog的的各項操作;
- 一旦在記憶體中建立檔案系統元資料對映,則建立一個新的fsimage檔案(這個過程不需SecondaryNameNode)和一個空的editlog;
- 在安全模式下,各個datanode會向namenode傳送塊列表的最新情況;
- 此刻namenode執行在安全模式。即NameNode的檔案系統對於客服端來說是隻讀的。(顯示目錄,顯示檔案內容等。寫、刪除、重新命名都會失敗);
- NameNode開始監聽RPC和HTTP請求
**解釋RPC:**RPC(Remote Procedure Call Protocol)——遠端過程通過協議,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議; - 系統中資料塊的位置並不是由namenode維護的,而是以塊列表形式儲存在datanode中;
- 在系統的正常操作期間,namenode會在記憶體中保留所有塊資訊的對映資訊。
NameNode存放元資料
** fsimage 檔案系統的映象
** edits 編輯日誌
客戶端操作檔案的一些行為:put get cat rmr ...
載入fsimage,並重新執行edits檔案,然後載入到記憶體中
- 如果edits檔案比較大的話,合併會非常耗費時間
- 解決辦法:SecondaryNameNode【時間、大小】
- 產生一個新的fsimage和edits
- 等待DataNode註冊與傳送Block Report
SencondayNameNode
1. 輔助NameNode,進行fsimage和edits檔案合併 2. 避免NameNode下一期重啟fsimage和edits檔案合併時間過長的問題 3. SencodaryNameNode不是NameNode的熱備
四、YARN架構剖析【hadoop2.x版本】
ResourceManager
- 接受客戶端的請求【./bin/yarn jar xxx.jar wordcount /input /output】
- 啟動、監控[ApplicationMaster]
- 監控NodeManager
- 資源分配和任務排程
NodeManager
- 單個節點上的資源管理
- 處理來自ResourceManager的命令
- 處理來自ApplicationMaster的命令
ApplicationMaster[AM]
- 當前任務的管理者,任務執行結束後自動消失
- 資料切分
- 為當前程式申請資源,並分配給內部任務
- 任務的監控和容錯
Container
- 對當前任務執行環境的一個抽象,封裝了CPU、記憶體、網路頻寬等等和任務相關的資訊
五、MapReduce的執行流程
1. client向叢集提交一個 job任務,ResourceManager接收到任務請求
2. ResourceManager接收到該任務請求後,選擇一臺NodeManager啟動一個ApplicationMaster
3. ApplicationMaster向ResourceManager申請資源(運行當前任務需要哪些NodeManager、每一個NodeManager需要多少CPU、記憶體)
4. ResourceManager把對應的資源資訊響應給 ApplicationMaster
5. ApplicationMaster收到後,排程指揮其他NodeManager執行任務
6. 相關NodeManager接收任務並執行(Map\Reduce)
7. NodeManager執行結束後會向ApplicationManater彙報
8. ApplicationMaster向ResourceManager報告,並將結果反饋給Client
hadoop讀檔案流程
1. 開啟分散式檔案
呼叫 分散式檔案 DistributedFileSystem.open()方法
2. 從 NameNode 獲得 DataNode 地址
DistributedFileSystem 使用 RPC 呼叫 NameNode,NameNode 返回存有該副本的 DataNode 地址,DistributedFileSystem 返 回一個輸入流 FSDataInputStream物件,該物件封存了輸入流 DFSInputStream
3. 連線到DataNode
呼叫 輸入流 FSDataInputStream 的 read() 方法,從而 輸入流 DFSInputStream 連線 DataNodes
4. 讀取DataNode
反覆呼叫 read()方法,從而將資料從 DataNode 傳輸到客戶端
5. 讀取另外的DataNode直到完成
到達塊的末端時候,輸入流 DFSInputStream 關閉與DataNode 連線, 尋找下一個 DataNode
6. 完成讀取,關閉連線
即呼叫輸入流 FSDataInputStream.close()
hadoop寫檔案流程
1. 傳送建立檔案請求:呼叫分散式檔案系統DistributedFileSystem.create()方法
2. NameNode中建立檔案記錄:分散式檔案系統DistributedFileSystem 傳送 RPC 請求給namenode,namenode 檢查許可權後建立一條記錄,返回輸出流 FSDataOutputStream,封裝了輸出流 DFSOutputDtream
3. 客戶端寫入資料:輸出流 DFSOutputDtream 將資料分成一個個的資料包,並寫入內部佇列。DataStreamer 根據 DataNode 列表來要求 namenode 分配適合的新塊來儲存資料備份。一組DataNode 構成管線(管線的 DataNode 之間使用 Socket 流式通訊)
4. 使用管線傳輸資料:DataStreamer 將資料包流式傳輸到管線第一個DataNode,第一個DataNode 再傳到第二個DataNode ,直到完成。
5. 確認佇列:DataNode 收到資料後傳送確認,管線的DataNode所有的確認組成一個確認佇列。所有DataNode 都確認,管線資料包刪除。
6. 關閉:客戶端對資料量呼叫close()方法。將剩餘所有資料寫入DataNode管線,並聯系NameNode且傳送檔案寫入完成資訊之前等待確認。
7. NameNode確認
故障處理:
若過程中發生故障,則先關閉管線, 把佇列中所有資料包添加回去佇列,確保資料包不漏。為另一個正常DataNode的當前資料塊指定一個新的標識,並將該標識傳送給NameNode, 一遍故障DataNode在恢復後刪除上面的不完整資料塊. 從管線中刪除故障DataNode 並把餘下的資料塊寫入餘下正常的DataNode。NameNode發現複本兩不足時,會在另一個節點建立一個新的複本