Hadoop元件

ColaIce發表於2021-04-26

Hadoop

分散式計算平臺,同時也是一個生態圈

  • hadoop 1.X HDFS+MapReducer+Common
  • hadoop 2.X HDFS+MAP+Reducer+Common
  • hadoop 3.X java7->java8,引入糾刪碼,重寫shell指令碼,支援超過兩個NameNode,預設埠改變

HDFS

分散式檔案儲存系統(可靠,高吞吐),利用目錄樹定位檔案

  • 可靠性-維護多個副本
  • 擴充套件性-隨時增減伺服器
  • 高效性-task並行
  • 容錯性-失敗的任務重新分配執行
  • 適合一次寫入多次讀出
  • 支援資料的追加,不支援隨機修改

HDFS元件

NameNode

  • NameNode 儲存檔案的後設資料,位置資訊
  • 配置副本策略
  • 管理資料塊對映資訊
  • 處理讀寫請求

DataNode

  • DataNode 儲存檔案的真實資料,並做資料校驗
  • 一個資料塊在DN中會儲存資料本身,資料長度,檢驗和以及時間戳。同時DN啟動後會向NN進行註冊,後續每隔一小時向NN彙報資料塊資訊,同時每三秒進行一次NN心跳並帶回NN指令,如果10分鐘沒有心跳訊號,NN會認為該節點當機。
  • 在資料節點退役過程中推薦使用黑名單進行退役,辭職後會進行HDFS資料轉移。

SecondaryNameNode

  • SecondaryNameNode 對NameNode做備份,但不能頂替NN提供服務
  • 定期合併映象檔案,編輯日誌,推送給NN
  • 可以恢復NN的資料(可能不完整)

Client

  • Client切分上傳的檔案
  • 告知NN檔案的位置資訊,互動DN的讀寫資料
  • 通過命令管理HDFS

HDFS檔案的上傳與下載

  • 上傳:客戶端通過HDFS物件向NameNode提交上傳請求,NN確定檔案狀態以及父目錄是否存在,返回許可。隨後使用者上傳檔案的第一個資料塊,請求NN返回DataNode,NN根據請求返回三個DN節點,使用者通過輸出流請求在一個DN上上傳資料(上傳的DN根據網路拓撲計算決定),然後該DN會呼叫其他的DN節點將這個通訊通道建立完成。三個節點逐級應答客戶端,客戶端向第一個DN節點上傳一個資料塊,以packet為單位,DN收到後先進行落盤處理,同時將該packet傳送給第二個DN節點然後再傳給第三個DN節點。當第一個塊傳輸完成後,第二個資料塊重複上面的動作,傳遞完成後關閉傳輸流,傳輸過程中,第一個DN節點會將packet放入一個應答佇列,待所有節點相應完成後表示上傳成功。
  • 下載: 客戶端訪問HDFS物件,向NameNode請求下載某檔案,NameNode返回檔案的後設資料資訊,以及資料塊坐在的位置。客戶端得到資訊後獲取檔案輸入流,根據就近原則隨機原則隨機挑選一個DN節點獲取packet,客戶端收到後現在本地快取,然後寫入目標檔案。

NameNode與SecondaryNameNode的機制

  • NN在啟動後會將fsimage和edits載入到記憶體裡,格式化後則是建立。客戶端對HDFS進行操作後,NN先將操作記錄到日誌中,然後再記憶體中進行操作,2NN向NN詢問是否CheckPoint,帶回指令。如果CheckPoint,NN會生成一個滾動的日誌檔案,一個磁碟中編輯日誌的複製檔案,將磁碟中的映象檔案和複製好的編輯日誌檔案複製到2NN中,載入到2NN記憶體中合併成一個合併檔案,返回到NN中,NN用重新命名的方式覆蓋原檔案。
  • fsimage是HDFS檔案系統中後設資料的一個永久性檢查點
  • edits存放HDFS檔案系統中所有的更新操作
  • CheckPoint觸發點為1小時或者edits執行了一百萬次操作。2NN在一分鐘內確認三次NN的操作次數

Yarn元件

  • ResourceManager 處理客戶端請求,監控NodeManager,啟動ApplicationMaster,排程資源
  • NodeManager 管理單個節點上的資源,處理ResourceManager的命令,處理ApplicationMaster的命令
  • Contianer 封裝單個節點上的資源
  • ApplicationMaster 負責資料切分,為應用申請資源,監控任務

MapReduce框架⭐

  • 常用的資料序列化型別 String-》Text | Map-》MapWritable | Array-》ArrayWritable
  • 一個運算程式一般是一個map階段和一個reduce階段,MapTask併發執行,互不相干。ReduceTask併發執行,依賴MapTask的資料結果。
  • 關於程式,mrAppMaster負責過程排程和狀態協調,MapTask負責map階段的資料處理。ReduceTask負責reduce階段的資料處理。

MapReduce

Mapper與Reducer的繼承

  • 繼承自Mapper並重寫map方法,讀取檔案中內容並格式化輸出到Reduce中處理。
  • 繼承自Reducer並重寫reduce方法,將map輸出的KV對接收處理後提交到job中執行。

Writable序列化介面

  • Writable序列化介面是一個javaBean物件,其中封裝了需要系列化的引數。其中重寫的序列化與反序列化方法中的值順序必須一致。提供空參建構函式來實現反射呼叫。另外還需要重寫toString方法,令輸出資料可觀。

MapTask的工作機制(分而治之思想)

  1. 通過TextInputFormat元件(可自定義)將檔案進行邏輯切片(HDFS是物理切塊),後續有多少個切片就會啟動多少個MapTask。其中每個切片大小與blok大小對應為128M。
  2. 檔案切分完成後交給LineRecordReader按照換行符依次讀取資料交給定義的map方法。
  3. map方法輸出的KV對會進入一個環形緩衝區(記憶體區域),按照Key的HashCode值%NumReduceTask數量進行分割槽,環形緩衝區的預設大小是100M,達到80M後會進行溢寫,同時會進行分割槽內按照key執行快速排序,在最後一次溢寫結束後,會進行分割槽內的歸併排序,最後輸出一個檔案給MapTask,檔案中會有多個分割槽的索引來記錄偏移量。

MapTask的並行度

  • 移動計算比移動資料划算、即寫滿blok大小防止出現資料的移動(資料本地化-HDFS的短路讀取)
  1. 單個資料切片大小為blok大小128M,最大超限10%,即129M也會分為一個切片。MapTask的並行度取決於split的數量。

ReduceTask的工作機制

  • Copy階段,複製Map端輸出的一個分割槽的一片資料,對於同一個分割槽的資料,一定會進入同一個ReduceTask。在記憶體緩衝區中merge合併,溢位到磁碟的資料進行歸併排序合併。按照Key分組,呼叫一次Reduce方法。

ReduceTask的並行度

  • ReduceTask的並行度通過job.setNumReduceTasks() 設定。0是與MapTask保持一致,不設定預設為一個。如果資料分配不均會產生資料傾斜的問題,即某個ReduceTask處理的資料量遠遠大於其他處理的資料量

Shuffle機制⭐

  • Map階段處理後的資料傳給Reduce階段被稱為Shuffle,是MapReduce框架中最關鍵的一個流程。
  • 資料分割槽,排序,分組,預聚合(combine),合併

相關文章