MapReduce的分割槽
阿新 • • 發佈:2018-11-28
一:分割槽Partitioner
在MapReduce中,通過指定分割槽,mapTask會將同一個分割槽的資料傳送到同一個reduce當中進行處理。也就是把相同型別的資料,傳送到同一個reductTask去處理。
注意:分割槽需要在yarn叢集上執行,不能本地測試。
二:程式碼實現
自定義分割槽類,注意分割槽實現階段在map階段,也就是分割槽時的key為k2,v2階段
import org.apache.hadoop.io.NullWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Partitioner; /** * 自定義分割槽 * 接收的引數是k2,v2 * 多個分割槽,對應輸出的結果檔案也是多個 */ public class Partition extends Partitioner<Text,NullWritable> { /** * * @param text:k2 * @param nullWritable:v2 * @param i * @return:返回分割槽數 */ @Override public int getPartition(Text text, NullWritable nullWritable, int i) { String s = text.toString(); String[] split = s.split("\t"); if(Integer.valueOf(split[5]) > 15){ return 1;//到1號reduceTask } return 0;//到0號reduceTask } }
三:設定分割槽類和reduceTask數量
//第三步:自定義分割槽
job.setPartitionerClass(Partition.class);
//設定分割槽數,也就是設定有幾個reduce,結果會產生幾個結果檔案,
//如果設定數量過大例如:2塊磚,設定了3個人ReduceTask處理,則其中有一個處理為空的內容,則返回的結果檔案有一個沒有值
//如果設定數量過小例如:2塊磚,設定了1個人ReduceTask處理,則會重複處理
job.setNumReduceTasks(2);
驅動程式: