hadoop面試問題

hadoop面試問題,不定期更新

0x00 什么是hadoop

我們通常說的hadoop有兩種意思,一種是hadoop生態圈,包含hadoop、hive、hbase等組件,另一種單純指hadoop,包含hdfs、mapreduce,另外hadoop2之后添加的yarn

hdfs

hdfs是一個分布式文件系統,設計目的就是用低廉的商業硬件存儲大數據量的文件,所以具有以下特點

  • 處理超大文件
  • 高容錯性,運行在廉價機器上
  • 橫向擴展
  • 流式數據處理,而不是隨機讀寫(所謂流式數據讀取就是指一個文件只能寫一次,后面一直追加,所以每次讀取只需要從頭開始一直向后讀就行了,而不是像其他文件系統可以對文件多次修改)
  • 不支持文件修改,只能追加寫入
  • 對大量小文件性能不好

1、主從架構,有兩種角色namenode和datanode
namenode負責管理存儲元數據,處理客戶端讀寫請求
datanode存儲真正的數據,執行讀寫操作

2、讀流程
客戶端訪問namenode,驗證權限,返回數據具體的datanode地址,客戶端訪問datanode讀取數據

3、寫流程
客戶端訪問namenode,驗證權限并確定文件是否存在,然后先記錄到editLog(WAL)返回輸出流對象,客戶端向最近的一個datanode寫數據,每寫一個數據塊,其余的datanode自己同步

mapreduce

mapreduce是一種編程模式,主要思想是將數據處理分為map和reduce兩個階段,這兩個階段也可以任意組合,屏蔽了底層分布式、并行的計算方式
map讀取數據片段,輸出<key,value>集合,reducce階段將相同的key一起處理,合并這些value,計算得到結果
大體可以分為input、split、map、shuffle、reduce、output六個步驟

輸入input:輸入數據,一般是hdfs上的文件或目錄
拆分split:切割文件,將大文件切割成塊,供多個map task處理
映射map:將拆分的內容轉換成key-value形式
派發shuffle:將key相同的放到一起value是一個序列,這步涉及數據移動,會將key相同的數據移動到一臺機器上
縮減reduce:將同樣key的value序列進行計算
輸出output:輸出結果

0x01 shuffle過程

參考mapreduce shuffle深入理解

從map的輸出到reduce的輸入,中間的過程叫shuffle

1、環形緩存區溢出寫,每個map任務輸出會先寫到一個緩存區,默認是100M,當超過80%時會溢寫到磁盤

2、在內存中時會經過分區和排序,分區默認是按照key的hashcode來對reduce個數取模,可以將數據平均分配到reduce上

3、合并溢寫文件,將同分區的溢寫文件合并,合并過程中伴隨著排序,最后合并成一個分區、排序的大文件

4、reduce端接受不同map的傳來的有序數據,也是先寫到內存,然后溢寫,隨著文件增多,和map端一樣,不停的排序合并,最后一次的合并結果直接輸出到reduce函數,計算結果,然后每個reduce函數對應一個輸出結果

0x02 yarn的工作原理

yarn全稱yet anthor resource negotiator(另一種資源調度器),在hadoop1.0時,資源調度和任務管理都由jobtrack管理,hadoop2將任務管理分離出來由每個程序自己的ApplicationMaster完成,yarn只負責資源調度和監控

ResourceManager

rm主要由兩部分組成schedule和ApplicationManager

  • schedule

通過container來分配資源,container是yarn中的抽象概念,封裝了磁盤、內存、cpu等資源,yarn提供的是插件式的策略來實現隊列、分區,目前實現的schedule有FIFO、CapacityScheduler、FairScheduler

  • ApplicationManager

ApplicationManager負責接收作業的提交,并申請第一個container來執行作業的ApplicationMaster,并提供失敗時重啟ApplicationMaster的container,接下來作業的ApplicationMaster向schedule申請資源

NodeManager

NodeManager是yarn在每臺機器上的代理,nm負責啟動并管理節點上的container,container執行具體的由ApplicationMaster劃分的任務

整體流程

1、客戶端向ResourceManager的ApplicationManager提交程序

2、ResourceManager的ApplicationManager在nodemanager上啟動第一個container執行ApplicationMaster

3、ApplicationMaster拆分程序,劃分成一個個的task,這些task可以在container上運行,然后向ResourceManager申請資源執行task,并向ResourceManager發送心跳

4、申請到container后,ApplicationMaster會和NodeManager通信,并將task發送到對應的container執行,task會向ApplicationMaster發送心跳

5、程序執行完成,ApplicationMaster向ResourceManager注銷并釋放資源

0x03 列出yarn調度器,并簡述工作方法

yarn的調度是基于事件來處理的,共有六種事件,yarn會根據事件作出相應處理

1、NODE_REMOVE 刪除計算節點或計算節點故障

2、NODE_ADDED 新增計算節點

3、APPLICATION_ADDED 啟動一個新應用

4、APPLICATION_REMOVED 一個應用運行結束

5、CONTAINER_EXPIRED containre回收在分配

6、NODE_UPDATE rm收到nm的心跳,更新container信息

yarn中自帶有三種調度器FIFO、Capacity Scheduler、Fair Scheduler

FIFO先進先出調度器,單隊列,先提交的任務執行完成后在執行后續提交的任務

Capacity和Fair基本一致,fair具有capacity的所有功能,fair主要適用于同一隊列中所有應用公平的使用資源

參考

0x04 mapreduce性能調優

性能調優可以從程序、系統配置等方面入手,其中程序優化是最有效的手段,例如適當應用combiner,優化分區方法,避免數據傾斜等

系統配置主要有以下參數


image
image

平時的調優沒有固定步驟,主要是要找到性能瓶頸的地方,改變處理方式,或者通過參數調節資源

參考

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容