hadoop--Shuffle机制
目錄
- Shuffle機制
- 一、 Shuffle機制
- 二、 Partition分區
- 1. 問題引出
- 2. 默認partitioner分區
- 3. 自定義Partitioner步驟
- 4.分區總結
- 三、WritableComparable排序
- 排序概述
- 排序分類
- 四、Combiner合并
Shuffle機制
一、 Shuffle機制
Map方法之后,Reduce方法之前的數據處理過程稱為Shuffle。
二、 Partition分區
1. 問題引出
要求將統計結果按照條件輸出到不同文件中(分區)。如統計結果按照手機歸屬地不同省份輸出到不同文件中。
2. 默認partitioner分區
默認分區是根據key的hashCode對ReduceTasks個數取模得到的。用戶沒法控制哪個key存儲到哪個分區。
3. 自定義Partitioner步驟
4.分區總結
如果ReduceTask的數量 > getPartition的結果數,則會多產生幾個空的輸出文件part-r-000xx;
如果1 < ReduceTask的數量 < getPartition的結果數,則有一部分分區數據無地可放,拋出IOException異常;
如果ReduceTask的數量 = 1,則不管MapTask端輸出多少個分區文件,最終結果都交給這一個ReduceTask,也只會產生一個結果文件part-r-00000;
分區號必須從零開始,逐一累加。
🌰:
假設自定義分區數為5,則
三、WritableComparable排序
排序概述
為什么要進行排序?
為了提高效率。
排序是MapReduce框架中最重要的操作之一。
MapTask和ReduceTask均會對數據按照key進行排序,該操作屬于Hadoop默認行為。任何應用程序中的數據均會被排序,而不管邏輯上是否需要。
默認排序是按照字典順序排序,且實現該排序的方法是快速排序。
對于MapTask,它會將處理的結果暫時放到環形緩沖區中,當環形緩沖區使用率達到一定閾值后,再對緩沖區中的數據進行一次快速排序,并將這些有序數據溢寫到磁盤上,而當數據處理完畢后,它會對磁盤上所有文件進行歸并排序。
對于ReduceTask,它從每個MapTask上遠程拷貝相應的數據文件,如果文件大小超過一定閾值,則溢寫到磁盤上,否則存儲在內存中。
如果磁盤上文件數目達到一定閾值,則進行一次歸并排序以生成一個更大文件;如果內存中文件大小或者數目達到一定閾值,則進行一次合并后將數據溢寫到磁盤上。當所有數據拷貝完畢后,ReduceTask統一對內存和磁盤上的所有數據進行一次歸并排序。
排序分類
MapReduce根據輸入記錄的鍵對數據集排序。保證輸出的每個文件內部有序。
最終輸出結果只有一個文件,且文件內部有序。實現方式是只設置一個ReduceTask。但該方法在處理大型文件時效率極低,因為一臺機器處理所有文件,完全喪失了MapReduce所提供的并行架構。
在Reduce端對key進行分組。應用于:在接收的key為bean對象時,想讓一個或幾個字段相同(全部字段比較不相同)的key進入到同一個reduce方法時,可以采用分組排序。
在自定義排序過程中,如果compareTo中的判斷條件為兩個即為二次排序。
四、Combiner合并
Combiner是在每一個MapTask所在的節點運行;
Reducer是接收全局所有Mapper的輸出結果;
🌰:
要求兩個MapTask的平均值,如果提前在Mapper階段開啟了Combiner,
Mapper:
MapTask1: 3 5 7 -> (3+5+7)/3=5,
MapTask2: 2 6 -> (2+6)/2=4,
Reducer:
將所有數據都拷貝到reducer端后求平均值:(3+5+7+2+6)/5=23/5 不等于(5+4)/2=9/2;
所以針對求和可以使用Combiner合并,針對求平均值不可。
總結
以上是生活随笔為你收集整理的hadoop--Shuffle机制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: postgres+socket.io+n
- 下一篇: Unity3d截图两种方式