1. 程式人生 > >MapReduce計算框架高級特性程序運行並發度

MapReduce計算框架高級特性程序運行並發度

現在 需要 我們 file 輸入 單詞 特性 高級特性 tin

2019/2/19 星期二

MapReduce計算框架高級特性程序運行並發度

所謂的並發度,就是在MapReduce執行程序的過程中有多少個map task進程和reduce task進程,來一起完成程序的處理。

MapReduce就是把業務處理邏輯變成分布式來處理。

reduce task 數量的決定機制 //全局的聚合操作 由業務場景決定
1、業務邏輯需要
2、數據量大小
設置方法:
job.setNumReduceTasks(5)

//reduce task的數量不能夠任意的指定,比如:我們在一大堆的英文文件中,我們要去統計有多少個單詞,這個時候reduce task在全局 程序執行的過程中只能有1個,為什麽呢?因為:需要讓所有的map task 把所有的結果給到一個reduce task 這樣reduce task 就會把所有的結果統計出來。在這種情況下reduce task就沒辦法用多個。

比如:在wordcount中,我們統計每一個單詞出現的總次數,在這種情況下,reduce task就 可以由任意多個。因為,maptask處理的結果經過shuffle階段之後,相同的單詞只會出現在同一個reduce task中。我們可能會得到5個文件,但這5個文件中統計的單詞數量是全局唯一的。

map task 數量的決定機制:
由於map task 之間沒有協作關系,每一個map task 都是各自為政,在map task 的處理中沒法做“全局”性的聚合操作,所以map task 的數量完全取決於所處理的數據量的大小

決定機制:
對待處理數據進行“切片”
每一個切片分配一個map task 來處理

Mapreduce 框架中默認的切片機制:
TextInputFormat.getSplits()繼承自FileInputFormat.getSplits()

數據切片的思考
1:定義一個切片大小:可以通過參數來調節,默認情況下等於“hdfs 中設置的blocksize”,通常是128M //一定程度上會減少網絡傳輸數據,但並不是絕對的。
2:獲取輸入數據目錄下所有待處理文件List
3:遍歷文件List,逐個逐個文件進行切片
for(file:List)
對file 從0 偏移量開始切,每到128M 就構成一個切片,比如a.txt(200M),就會被切成兩個切片: a.txt: 0-128M, a.txt :128M-256M 再比如b.txt(80M),就會切成一個切片, b.txt :0-80M

如果要處理的數據是大量的小文件,使用上述這種默認切片機制,就會導致大量的切片,從而maptask 進程數特別多,但是每一個切片又非常小,每個maptask 的處理數據量就很小,從而,整體的效率會很低。通用解決方案:就是將多個小文件劃分成一個切片;實現辦法就是自定義一個Inputformat 子類重寫裏面的getSplits 方法;
Mapreduce 框架中自帶了一個用於此場景的Inputformat 實現類:CombineFileInputformat

MapReduce計算框架高級特性程序運行並發度