MapReduce核心思想
map負責切分,reduce負責合并(先分後合,分而治之)
如何了解偏移量
每行的行首到首行行首的距離
Suffle包含哪些步驟
分區(partition)------->排序(sort)------->資料優化計算(combine)------->分組(group)
MR從讀取資料開始到将最終結果寫入HDFS經過哪些步驟
第一步:inputformat 資料讀取
↓
↓
第二步:split 将擷取的資料進行邏輯切分
↓
↓
第三步: recordReader(将資料以\n切分,進行再次切分,并輸出key(行首字母的偏移量),value(一行的資料))
↓
↓
第四步: Map接收key(行首字母偏移量),value(一行的資料),根據業務需求編寫代碼,輸出(key,value 的list)
↓
↓
輸出給Shuffle(partition)
↓
↓
shffle(核心機制: 資料分區,排序,分組,ComBine,合并等過程)輸出key value的list
↓
↓
第五步:partition :按照一定的規則對key,value 的 list 進行分區
輸出給Shuffle(sort)
↓
↓
第六步:Sort :對每個分區内的資料進行排序。
輸出給Shuffle(combiner)
↓
↓
第七步: Combiner: 在Map端進行局部聚合(彙總)
目的是為了減少網絡帶寬的開銷
輸出給Shuffle(group)
↓
↓
第八步: Group: 将相同key的key提取出來作為唯一的key,将相同key 對應的value 提取出來組裝成一個value 的List
輸出給Shuffle(reduce)
↓
↓
第九步: Reduce:根據業務需求對傳入的資料進行彙總計算
輸出給Shuffle(outputFormat)
↓
↓
第十步: outputFormat:将最終的結果的寫入到HDFS
如何設定ReduceTask的數量
job.setNumReduceTasks(個數);
Combiner的作用
Map結束後,在Map端進行局部聚和。作用:較少網絡傳出次數,降低了網絡帶寬開銷。
combiner運作在MapReduce的哪一端?
Map端。在Map端中shuffle中。
Maptask的數量是可以人為設定的嗎?
不可以
Shuffle階段的Partition分區算法是什麼
對map輸出的key 取哈希值,用這個哈希值與reducetask的個數值取餘。
餘幾,就将這個key,value放在對應的分區編号裡(分區有多個編号)。
Split邏輯切分資料,節分大小是多大?
128M
記憶體角度介紹Map的輸出到Reduce的輸入的過程。
`Map的輸出到記憶體`
Map将資料傳入環形緩沖區(預設100MB 可修改),環形緩沖區中的資料到達一定的門檻值時(預設0.8 可修改)進行溢寫生成好多臨
時檔案,多個臨時檔案到達一定數量進行merge合并成一個大檔案。
`Reduce資料讀取`
reduce會主動去發起拷貝線程到maptask擷取屬于自己的資料,資料會進入ReduceTask中的環形緩沖區,當緩沖區中的資料量到達
一定門檻值進行溢寫,多個臨時檔案merge合并成一個大檔案,最後輸入到Reduce。
最優的Map效率是什麼?
Map端的最高效率是:盡量減少環形緩沖區flush的次數(減少磁盤IO 的使用次數)
增加環形緩沖區記憶體
将門檻值上調
壓縮map輸出的資料大小(消耗cpu)
最優的reduce是什麼?
Reduce端的最高效率是:盡量減少環形緩沖區flush的次數
盡量将資料放在記憶體上進行計算
在MR階段,有哪些可以優化的點?
1、加大環形緩沖區的記憶體
2、增大緩沖區門檻值的大小 (考慮剩餘的空間是不是夠系統使用)
3、對輸出的進行壓縮(壓縮-解壓的過程會消耗CPU)
叢集優化的核心思路是什麼?
在網絡帶寬、磁盤IO是瓶頸的前提下
能不使用IO 網絡就不使用,在必須使用的前提下,能少用就少用。
所有的,隻要能夠減少網絡帶寬的開銷,隻要能夠減少磁盤io的使用的次數的配置項,都是叢集調優的可選項。
(可選項包括: 軟體層面【系統軟體和叢集軟體】,硬體層面,網絡層面)