hadoop面試問題沸柔,不定期更新
0x00 什么是hadoop
我們通常說的hadoop有兩種意思暑刃,一種是hadoop生態(tài)圈,包含hadoop蟋座、hive拗踢、hbase等組件,另一種單純指hadoop向臀,包含hdfs巢墅、mapreduce,另外hadoop2之后添加的yarn
hdfs
hdfs是一個分布式文件系統(tǒng)券膀,設(shè)計目的就是用低廉的商業(yè)硬件存儲大數(shù)據(jù)量的文件君纫,所以具有以下特點
- 處理超大文件
- 高容錯性,運行在廉價機器上
- 橫向擴展
- 流式數(shù)據(jù)處理芹彬,而不是隨機讀寫(所謂流式數(shù)據(jù)讀取就是指一個文件只能寫一次蓄髓,后面一直追加,所以每次讀取只需要從頭開始一直向后讀就行了舒帮,而不是像其他文件系統(tǒng)可以對文件多次修改)
- 不支持文件修改会喝,只能追加寫入
- 對大量小文件性能不好
1、主從架構(gòu)玩郊,有兩種角色namenode和datanode
namenode負責管理存儲元數(shù)據(jù)肢执,處理客戶端讀寫請求
datanode存儲真正的數(shù)據(jù),執(zhí)行讀寫操作
2译红、讀流程
客戶端訪問namenode预茄,驗證權(quán)限,返回數(shù)據(jù)具體的datanode地址侦厚,客戶端訪問datanode讀取數(shù)據(jù)
3耻陕、寫流程
客戶端訪問namenode,驗證權(quán)限并確定文件是否存在刨沦,然后先記錄到editLog(WAL)返回輸出流對象淮蜈,客戶端向最近的一個datanode寫數(shù)據(jù),每寫一個數(shù)據(jù)塊已卷,其余的datanode自己同步
mapreduce
mapreduce是一種編程模式,主要思想是將數(shù)據(jù)處理分為map和reduce兩個階段淳蔼,這兩個階段也可以任意組合侧蘸,屏蔽了底層分布式、并行的計算方式
map讀取數(shù)據(jù)片段鹉梨,輸出<key,value>集合讳癌,reducce階段將相同的key一起處理,合并這些value存皂,計算得到結(jié)果
大體可以分為input晌坤、split逢艘、map、shuffle骤菠、reduce它改、output六個步驟
輸入input:輸入數(shù)據(jù),一般是hdfs上的文件或目錄
拆分split:切割文件商乎,將大文件切割成塊央拖,供多個map task處理
映射map:將拆分的內(nèi)容轉(zhuǎn)換成key-value形式
派發(fā)shuffle:將key相同的放到一起value是一個序列,這步涉及數(shù)據(jù)移動鹉戚,會將key相同的數(shù)據(jù)移動到一臺機器上
縮減reduce:將同樣key的value序列進行計算
輸出output:輸出結(jié)果
0x01 shuffle過程
從map的輸出到reduce的輸入鲜戒,中間的過程叫shuffle
1、環(huán)形緩存區(qū)溢出寫抹凳,每個map任務(wù)輸出會先寫到一個緩存區(qū)遏餐,默認是100M,當超過80%時會溢寫到磁盤
2赢底、在內(nèi)存中時會經(jīng)過分區(qū)和排序失都,分區(qū)默認是按照key的hashcode來對reduce個數(shù)取模,可以將數(shù)據(jù)平均分配到reduce上
3颖系、合并溢寫文件嗅剖,將同分區(qū)的溢寫文件合并,合并過程中伴隨著排序嘁扼,最后合并成一個分區(qū)信粮、排序的大文件
4、reduce端接受不同map的傳來的有序數(shù)據(jù)趁啸,也是先寫到內(nèi)存强缘,然后溢寫,隨著文件增多不傅,和map端一樣旅掂,不停的排序合并,最后一次的合并結(jié)果直接輸出到reduce函數(shù)访娶,計算結(jié)果商虐,然后每個reduce函數(shù)對應(yīng)一個輸出結(jié)果
0x02 yarn的工作原理
yarn全稱yet anthor resource negotiator(另一種資源調(diào)度器),在hadoop1.0時崖疤,資源調(diào)度和任務(wù)管理都由jobtrack管理秘车,hadoop2將任務(wù)管理分離出來由每個程序自己的ApplicationMaster完成,yarn只負責資源調(diào)度和監(jiān)控
ResourceManager
rm主要由兩部分組成schedule和ApplicationManager
- schedule
通過container來分配資源劫哼,container是yarn中的抽象概念叮趴,封裝了磁盤、內(nèi)存权烧、cpu等資源眯亦,yarn提供的是插件式的策略來實現(xiàn)隊列伤溉、分區(qū),目前實現(xiàn)的schedule有FIFO妻率、CapacityScheduler乱顾、FairScheduler
- ApplicationManager
ApplicationManager負責接收作業(yè)的提交,并申請第一個container來執(zhí)行作業(yè)的ApplicationMaster舌涨,并提供失敗時重啟ApplicationMaster的container糯耍,接下來作業(yè)的ApplicationMaster向schedule申請資源
NodeManager
NodeManager是yarn在每臺機器上的代理,nm負責啟動并管理節(jié)點上的container囊嘉,container執(zhí)行具體的由ApplicationMaster劃分的任務(wù)
整體流程
1温技、客戶端向ResourceManager的ApplicationManager提交程序
2、ResourceManager的ApplicationManager在nodemanager上啟動第一個container執(zhí)行ApplicationMaster
3扭粱、ApplicationMaster拆分程序舵鳞,劃分成一個個的task,這些task可以在container上運行琢蛤,然后向ResourceManager申請資源執(zhí)行task蜓堕,并向ResourceManager發(fā)送心跳
4、申請到container后博其,ApplicationMaster會和NodeManager通信套才,并將task發(fā)送到對應(yīng)的container執(zhí)行,task會向ApplicationMaster發(fā)送心跳
5慕淡、程序執(zhí)行完成背伴,ApplicationMaster向ResourceManager注銷并釋放資源
0x03 列出yarn調(diào)度器,并簡述工作方法
yarn的調(diào)度是基于事件來處理的峰髓,共有六種事件傻寂,yarn會根據(jù)事件作出相應(yīng)處理
1、NODE_REMOVE 刪除計算節(jié)點或計算節(jié)點故障
2携兵、NODE_ADDED 新增計算節(jié)點
3疾掰、APPLICATION_ADDED 啟動一個新應(yīng)用
4、APPLICATION_REMOVED 一個應(yīng)用運行結(jié)束
5徐紧、CONTAINER_EXPIRED containre回收在分配
6静檬、NODE_UPDATE rm收到nm的心跳,更新container信息
yarn中自帶有三種調(diào)度器FIFO并级、Capacity Scheduler拂檩、Fair Scheduler
FIFO先進先出調(diào)度器,單隊列死遭,先提交的任務(wù)執(zhí)行完成后在執(zhí)行后續(xù)提交的任務(wù)
Capacity和Fair基本一致,fair具有capacity的所有功能凯旋,fair主要適用于同一隊列中所有應(yīng)用公平的使用資源
0x04 mapreduce性能調(diào)優(yōu)
性能調(diào)優(yōu)可以從程序呀潭、系統(tǒng)配置等方面入手,其中程序優(yōu)化是最有效的手段钠署,例如適當應(yīng)用combiner糠聪,優(yōu)化分區(qū)方法舰蟆,避免數(shù)據(jù)傾斜等
系統(tǒng)配置主要有以下參數(shù)
平時的調(diào)優(yōu)沒有固定步驟,主要是要找到性能瓶頸的地方身害,改變處理方式,或者通過參數(shù)調(diào)節(jié)資源