1. 程式人生 > >MapReduce系列之自定義Partitioner

MapReduce系列之自定義Partitioner

partitioner定義:分割槽器

partitioner的作用是將mapper(如果使用了combiner的話就是combiner)輸出的key/value拆分為分片(shard),每個reducer對應一個分片。預設情況下,partitioner先計算key的雜湊值(通常為md5值)。然後通過reducer個數執行取模運算:key.hashCode%(reducer個數)。這種方式不僅能夠隨機地將整個key空間平均分發給每個reducer,同時也能確保不同mapper產生的相同key能被分發到同一個reducer。

目的:如果對資料的整體有很好的瞭解,可以使用自定義Partitioner來達到reducer的負載均衡,提高效率。

適用範圍:需要非常注意的是:必須提前知道有多少個分割槽。比如自定義Partitioner會返回5個不同int值,而reducer number設定了小於5,那就會報錯。所以我們可以通過執行分析任務來確定分割槽數。例如,有一堆包含時間戳的資料,但是不知道它能追朔到的時間範圍,此時可以執行一個作業來計算出時間範圍。

注意:在自定義partitioner時一定要注意防止資料傾斜。

一個案例:https://github.com/taowenjun/MapReduce/blob/master/cn/tao/secondarysort/DateTemperaturePartitioner.java

在驅動中指定該定義類:

job.setPartitionerClass(DateTemperaturePartitioner.class);