Hadoop Mapreduce 中的Partitioner
阿新 • • 發佈:2019-02-19
alsa max one 輸入 階段 負載均衡。 均衡 total cal
Partitioner的作用的對Mapper產生的中間結果進行分片,以便將同一分組的數據交給同一個Reduce處理,Partitioner直接影響Reduce階段的負載均衡。
MapReduce提供了兩個Partitioner實現:HashPartitioner和TotalOederPartitioner。
HashPartitioner是默認實現,實現了一種基於哈希值的分片方法,代碼如下:
public int getPartition(K2 key, V2 value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; }
TotalOrderPartitioner提供了一種基於區間的分片方法,通常用在數據全排序中。
在MapReduce環境中,容易想到的全排序方案是歸並排序,即在Map階段,每個Map Task進行局部排序;在Reduce階段,啟動一個Reduce Task進行全局排序。由於作業只能有一個Reduce Task,因而reduce階段會成為作業的瓶頸。
TotalOrderPartitioner能夠按照大小將數據分成若幹個區間(分片),並保證後一個區間的所有數據均大於前一個區間的所有數據。全排序的步驟如下:
- 數據采樣。在Client端通過采樣獲取分片的分割點。Hadoop自帶了幾個采樣算法,如IntercalSampler、RandomSampler、SplitSampler等。
- Map階段。本階段涉及兩個組件,分別是Mapper和Partitioner。其中,Mapper可采用IdentityMapper,直接將輸入數據輸出,但Partitioner必須選用TotalOrderPartitioner,它將步驟1中獲取的分割點保存到trie樹中以便快速定位任意一個記錄所在的區間,這樣,每個Map Task產生R(Reduce Task 個數)個區間,且區間有序。TotalOrderPartitioner通過trie樹查找每條記錄所對應的Reduce Task編號。
- Reduce階段。每個Reducer對分配到的區間數據進行局部排序,最終得到全排序數據。
基於TotalOrderPartitioner全排序的效率跟key分布規律和采樣算法有直接關系;key值分布越均勻且采樣越具有代表性,則Reduce Task負載越均衡,全排序效率越高。
Hadoop Mapreduce 中的Partitioner