深入理解MapReduce

2021-08-30 17:46:39 字數 3187 閱讀 1698

化簡(reducing):遍歷集合中的元素來返回乙個綜合的結果。即,輸出表單裡一列數字的和這個任務屬於reducing。

input,資料讀入

123456

// 設定資料輸入**

fileinputformat.setinputpaths(job, args[0]);

fileinputformat.setinputdirrecursive(job, true); //遞迴

job.setinputformatclass(textinputformat.class); //設定輸入格式

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

/**

* k1 : 行序號

* v1 : 行資訊

* k2 : 單詞

* v2 : 次數

*/ text k2 = new text() ;

longwritable v2 = new longwritable();

@override

protected void map(longwritable key, text value, context context)

throws ioexception, interruptedexception

}}使用reducer合併計算

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

28

//設定job的reducer計算類和k3、v3型別

job.setreducerclass(wordcountreducer.class); //自定義的reducer類

job.setoutputkeyclass(text.class); //輸出key型別

job.setoutputvalueclass(longwritable.class); //輸出value型別

//wordcountreducer 類

/** * 自定義的reduce 需要繼承reducer

* k2 : 字串

* v3 : 次數(分組)

* k3 : 字串

* v3 : 次數(統計總的)

*/public static class wordcountreducer extends reducer

v3.set(sum);

context.write( key , v3 );}}

output,資料寫出

1
fileoutputformat.setoutputpath(job, new path(args[1]));
各個角色實體;

執行的時間先後順序。

任務執行,在 container 上啟動任務(通過yarnchild程序來執行),執行map/reduce任務。

輸入分片(input split)

每個輸入分片會讓乙個map任務來處理,預設情況下,以hdfs的乙個塊的大小(預設為128m,可以設定)為乙個分片。map輸出的結果會暫且放在乙個環形記憶體緩衝區中(預設mapreduce.task.io.sort.mb=100m),當該緩衝區快要溢位時(預設mapreduce.map.sort.spill.percent=0.8),會在本地檔案系統中建立乙個溢位檔案,將該緩衝區中的資料寫入這個檔案;

map階段:由我們自己編寫,最後呼叫 context.write(…);

partition分割槽階段

3.1. 在map中呼叫 context.write(k2,v2)方法輸出,該方法會立刻呼叫 partitioner類對資料進行分割槽,乙個分割槽對應乙個 reduce task。

3.2. 預設的分割槽實現類是 hashpartitioner ,根據k2的雜湊值 % numreducetasks,可能出現「資料傾斜」現象。

3.3. 可以自定義 partition ,呼叫 job.setpartitioner(…)自己定義分割槽函式。

combiner合併階段:將屬於同乙個reduce處理的輸出結果進行合併操作

4.1. 是可選的;

4.2. 目的有三個:1.減少key-value對;2.減少網路傳輸;3.減少reduce的處理。

shuffle階段:即map和reduce中間的這個過程

5.1. 首先 map 在做輸出時候會在記憶體裡開啟乙個環形記憶體緩衝區,專門用來做輸出,同時map還會啟動乙個守護執行緒;

5.2. 如緩衝區的記憶體達到了閾值的80%,守護執行緒就會把內容寫到磁碟上,這個過程叫spill,另外的20%記憶體可以繼續寫入要寫進磁碟的資料;

5.3. 寫入磁碟和寫入記憶體操作是互不干擾的,如果快取區被撐滿了,那麼map就會阻塞寫入記憶體的操作,讓寫入磁碟操作完成後再繼續執行寫入記憶體操作;

5.4. 寫入磁碟時會有個排序操作,如果定義了combiner函式,那麼排序前還會執行combiner操作;

5.5. 每次spill操作也就是寫入磁碟操作時候就會寫乙個溢位檔案,也就是說在做map輸出有幾次spill就會產生多少個溢位檔案,等map輸出全部做完後,map會合併這些輸出檔案,這個過程裡還會有乙個partitioner操作(如上)

5.6. 最後 reduce 就是合併map輸出檔案,partitioner會找到對應的map輸出檔案,然後進行複製操作,複製操作時reduce會開啟幾個複製執行緒,這些執行緒預設個數是5個(可修改),這個複製過程和map寫入磁碟過程類似,也有閾值和記憶體大小,閾值一樣可以在配置檔案裡配置,而記憶體大小是直接使用reduce的tasktracker的記憶體大小,複製時候reduce還會進行排序操作和合併檔案操作,這些操作完了就會進行reduce計算了。

reduce階段:由我們自己編寫,最終結果儲存在hdfs上的。

參考 (shuffle階段講的很好)

深入理解MapReduce

mapreduce是乙個基於hdfs的分布式計算框架,是乙個可以將分布式計算抽象為map和reduce的程式設計模型,它的核心思想是分治,將大量資料分到不同機器上去分別計算最終彙總從而進行高效的資料處理,但是mapreduce不支援迭代和迴圈會有一定的侷限性,如果有需要迭代就會需要進行多倫的mapr...

MapReduce理解 深入理解MapReduce

化簡 reducing 遍歷集合中的元素來返回乙個綜合的結果。即,輸出表單裡一列數字的和這個任務屬於reducing。input,資料讀入 123456 設定資料輸入 fileinputformat.setinputpaths job,args 0 fileinputformat.setinputd...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...