[MapReduce_8] MapReduce 中的自定义分区实现

时间:2023-03-09 02:50:10
[MapReduce_8] MapReduce 中的自定义分区实现

0. 说明

  设置分区数量 && 编写自定义分区代码


1. 设置分区数量

  分区(Partition)

  分区决定了指定的 Key 进入到哪个 Reduce 中

  分区目的:把相同的 Key 发送给同一个 Reduce

  默认 hash 分区,算法

// 返回的分区号
(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks

  设置分区数

job.setNumReduceTasks(3);

2. 代码编写

  在 [MapReduce_1] 运行 Word Count 示例程序 代码基础之上进行以下操作

  实现将文本中的数字存放在分区0,数字之外的内容放置到分区1

  【2.1 编写 MyPartition.java】

package hadoop.mr.partition;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner; /**
* MapReduce 自定义分区
*/
public class MyPartition extends Partitioner<Text, IntWritable> {
/**
* 自定义分区将数字放在0号分区,其余放在1号分区
*/
@Override
public int getPartition(Text key, IntWritable value, int numPartitions) {
try {
Integer.parseInt(key.toString());
return 0;
} catch (Exception e) {
return 1;
}
}
}

  【2.2 修改 WCApp.java】

  [MapReduce_8] MapReduce 中的自定义分区实现

  【2.3 最终结果】

  [MapReduce_8] MapReduce 中的自定义分区实现    [MapReduce_8] MapReduce 中的自定义分区实现