hadoop面試問題,不定期更新
0x00 什么是hadoop
我們通常說的hadoop有兩種意思,一種是hadoop生態(tài)圈,包含hadoop、hive、hbase等組件,另一種單純指hadoop,包含hdfs、mapreduce,另外hadoop2之后添加的yarn
hdfs
hdfs是一個(gè)分布式文件系統(tǒng),設(shè)計(jì)目的就是用低廉的商業(yè)硬件存儲大數(shù)據(jù)量的文件,所以具有以下特點(diǎn)
- 處理超大文件
- 高容錯(cuò)性,運(yùn)行在廉價(jià)機(jī)器上
- 橫向擴(kuò)展
- 流式數(shù)據(jù)處理,而不是隨機(jī)讀寫(所謂流式數(shù)據(jù)讀取就是指一個(gè)文件只能寫一次,后面一直追加,所以每次讀取只需要從頭開始一直向后讀就行了,而不是像其他文件系統(tǒng)可以對文件多次修改)
- 不支持文件修改,只能追加寫入
- 對大量小文件性能不好
1、主從架構(gòu),有兩種角色namenode和datanode
namenode負(fù)責(zé)管理存儲元數(shù)據(jù),處理客戶端讀寫請求
datanode存儲真正的數(shù)據(jù),執(zhí)行讀寫操作
2、讀流程
客戶端訪問namenode,驗(yàn)證權(quán)限,返回?cái)?shù)據(jù)具體的datanode地址,客戶端訪問datanode讀取數(shù)據(jù)
3、寫流程
客戶端訪問namenode,驗(yàn)證權(quán)限并確定文件是否存在,然后先記錄到editLog(WAL)返回輸出流對象,客戶端向最近的一個(gè)datanode寫數(shù)據(jù),每寫一個(gè)數(shù)據(jù)塊,其余的datanode自己同步
mapreduce
mapreduce是一種編程模式,主要思想是將數(shù)據(jù)處理分為map和reduce兩個(gè)階段,這兩個(gè)階段也可以任意組合,屏蔽了底層分布式、并行的計(jì)算方式
map讀取數(shù)據(jù)片段,輸出<key,value>集合,reducce階段將相同的key一起處理,合并這些value,計(jì)算得到結(jié)果
大體可以分為input、split、map、shuffle、reduce、output六個(gè)步驟
輸入input:輸入數(shù)據(jù),一般是hdfs上的文件或目錄
拆分split:切割文件,將大文件切割成塊,供多個(gè)map task處理
映射map:將拆分的內(nèi)容轉(zhuǎn)換成key-value形式
派發(fā)shuffle:將key相同的放到一起value是一個(gè)序列,這步涉及數(shù)據(jù)移動(dòng),會將key相同的數(shù)據(jù)移動(dòng)到一臺機(jī)器上
縮減reduce:將同樣key的value序列進(jìn)行計(jì)算
輸出output:輸出結(jié)果
0x01 shuffle過程
從map的輸出到reduce的輸入,中間的過程叫shuffle
1、環(huán)形緩存區(qū)溢出寫,每個(gè)map任務(wù)輸出會先寫到一個(gè)緩存區(qū),默認(rèn)是100M,當(dāng)超過80%時(shí)會溢寫到磁盤
2、在內(nèi)存中時(shí)會經(jīng)過分區(qū)和排序,分區(qū)默認(rèn)是按照key的hashcode來對reduce個(gè)數(shù)取模,可以將數(shù)據(jù)平均分配到reduce上
3、合并溢寫文件,將同分區(qū)的溢寫文件合并,合并過程中伴隨著排序,最后合并成一個(gè)分區(qū)、排序的大文件
4、reduce端接受不同map的傳來的有序數(shù)據(jù),也是先寫到內(nèi)存,然后溢寫,隨著文件增多,和map端一樣,不停的排序合并,最后一次的合并結(jié)果直接輸出到reduce函數(shù),計(jì)算結(jié)果,然后每個(gè)reduce函數(shù)對應(yīng)一個(gè)輸出結(jié)果
0x02 yarn的工作原理
yarn全稱yet anthor resource negotiator(另一種資源調(diào)度器),在hadoop1.0時(shí),資源調(diào)度和任務(wù)管理都由jobtrack管理,hadoop2將任務(wù)管理分離出來由每個(gè)程序自己的ApplicationMaster完成,yarn只負(fù)責(zé)資源調(diào)度和監(jiān)控
ResourceManager
rm主要由兩部分組成schedule和ApplicationManager
- schedule
通過container來分配資源,container是yarn中的抽象概念,封裝了磁盤、內(nèi)存、cpu等資源,yarn提供的是插件式的策略來實(shí)現(xiàn)隊(duì)列、分區(qū),目前實(shí)現(xiàn)的schedule有FIFO、CapacityScheduler、FairScheduler
- ApplicationManager
ApplicationManager負(fù)責(zé)接收作業(yè)的提交,并申請第一個(gè)container來執(zhí)行作業(yè)的ApplicationMaster,并提供失敗時(shí)重啟ApplicationMaster的container,接下來作業(yè)的ApplicationMaster向schedule申請資源
NodeManager
NodeManager是yarn在每臺機(jī)器上的代理,nm負(fù)責(zé)啟動(dòng)并管理節(jié)點(diǎn)上的container,container執(zhí)行具體的由ApplicationMaster劃分的任務(wù)
整體流程
1、客戶端向ResourceManager的ApplicationManager提交程序
2、ResourceManager的ApplicationManager在nodemanager上啟動(dòng)第一個(gè)container執(zhí)行ApplicationMaster
3、ApplicationMaster拆分程序,劃分成一個(gè)個(gè)的task,這些task可以在container上運(yùn)行,然后向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 刪除計(jì)算節(jié)點(diǎn)或計(jì)算節(jié)點(diǎn)故障
2、NODE_ADDED 新增計(jì)算節(jié)點(diǎn)
3、APPLICATION_ADDED 啟動(dòng)一個(gè)新應(yīng)用
4、APPLICATION_REMOVED 一個(gè)應(yīng)用運(yùn)行結(jié)束
5、CONTAINER_EXPIRED containre回收在分配
6、NODE_UPDATE rm收到nm的心跳,更新container信息
yarn中自帶有三種調(diào)度器FIFO、Capacity Scheduler、Fair Scheduler
FIFO先進(jìn)先出調(diào)度器,單隊(duì)列,先提交的任務(wù)執(zhí)行完成后在執(zhí)行后續(xù)提交的任務(wù)
Capacity和Fair基本一致,fair具有capacity的所有功能,fair主要適用于同一隊(duì)列中所有應(yīng)用公平的使用資源
0x04 mapreduce性能調(diào)優(yōu)
性能調(diào)優(yōu)可以從程序、系統(tǒng)配置等方面入手,其中程序優(yōu)化是最有效的手段,例如適當(dāng)應(yīng)用combiner,優(yōu)化分區(qū)方法,避免數(shù)據(jù)傾斜等
系統(tǒng)配置主要有以下參數(shù)
平時(shí)的調(diào)優(yōu)沒有固定步驟,主要是要找到性能瓶頸的地方,改變處理方式,或者通過參數(shù)調(diào)節(jié)資源