1. 程式人生 > >hadoop知識點彙總

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架構

這裡寫圖片描述

  1. 主從架構【NameNode/DataNodes】
  2. NameNode存放元資料【檔名、檔案的存放位置、檔案的副本個數。。。】
  3. DataNode存放資料【以塊的形式進行儲存,預設每個塊的大小為128M】,真正響應客戶端讀取數的
  4. 在一個HDFS檔案系統中一般NameNode只有一個,DataNode可以存在多個,並且每一個伺服器中只啟動對應一個程序.
  5. DataNode會週期性的向NameNode傳送心跳機制、NameNode管理檔案和DataNode服務的對應關係(記憶體)
  6. NameNode整個叢集的訪問入口、會監聽DataNode節點的存活狀態(DataNode
    3秒鐘傳送一次,10分鐘如果NameNode接受不到某一個DataNode節點心跳資訊,那麼NameNode就
  7. 認為該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中資料在物理磁碟中的具體儲存位置
    
  8. 副本存放策略

    1. 第一個副本存放在本機架某一個DataNode節點中
    2. 第二個副本放在同一個機架的另外一個DataNode節點中
    3. 第三副本放在另外一個機架的節點中
    4. 客戶端讀取資料的原則:就近原則
    5. 機架感知(RackAwareness)
    

三、NameNOde啟動流程

這裡寫圖片描述

  1. Name啟動的時候首先將fsimage(映象)載入記憶體,並執行(replay)編輯日誌editlog的的各項操作;
  2. 一旦在記憶體中建立檔案系統元資料對映,則建立一個新的fsimage檔案(這個過程不需SecondaryNameNode)和一個空的editlog;
  3. 在安全模式下,各個datanode會向namenode傳送塊列表的最新情況;
  4. 此刻namenode執行在安全模式。即NameNode的檔案系統對於客服端來說是隻讀的。(顯示目錄,顯示檔案內容等。寫、刪除、重新命名都會失敗);
  5. NameNode開始監聽RPC和HTTP請求
    **解釋RPC:**RPC(Remote Procedure Call Protocol)——遠端過程通過協議,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議;
  6. 系統中資料塊的位置並不是由namenode維護的,而是以塊列表形式儲存在datanode中;
  7. 在系統的正常操作期間,namenode會在記憶體中保留所有塊資訊的對映資訊。

NameNode存放元資料

** fsimage  檔案系統的映象
** edits    編輯日誌
    客戶端操作檔案的一些行為:put get cat rmr ...
  1. 載入fsimage,並重新執行edits檔案,然後載入到記憶體中

    • 如果edits檔案比較大的話,合併會非常耗費時間
    • 解決辦法:SecondaryNameNode【時間、大小】
  2. 產生一個新的fsimage和edits
  3. 等待DataNode註冊與傳送Block Report
  4. SencondayNameNode

    1. 輔助NameNode,進行fsimage和edits檔案合併
    2. 避免NameNode下一期重啟fsimage和edits檔案合併時間過長的問題
    3. SencodaryNameNode不是NameNode的熱備
    

四、YARN架構剖析【hadoop2.x版本】

這裡寫圖片描述

  1. ResourceManager

    1. 接受客戶端的請求【./bin/yarn jar xxx.jar wordcount /input /output】
    2. 啟動、監控[ApplicationMaster]
    3. 監控NodeManager
    4. 資源分配和任務排程
  2. NodeManager

    1. 單個節點上的資源管理
    2. 處理來自ResourceManager的命令
    3. 處理來自ApplicationMaster的命令
  3. ApplicationMaster[AM]

    1. 當前任務的管理者,任務執行結束後自動消失
    2. 資料切分
    3. 為當前程式申請資源,並分配給內部任務
    4. 任務的監控和容錯
  4. 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發現複本兩不足時,會在另一個節點建立一個新的複本