当有多个Reducer时就需要控制哪些Mapper输出的内容进入哪些Reducer。
制定这个规则的就是Partitioner。这个过程称为shuffling。
现在要实现<FromNode,ToNode>这个结构中,把相同FromNode的城市对放入一个Reducer。
"Hadoop实战"这本书是旧的API写的,用的mapre包内的Partitioner,这里用新API进行了重写。
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.mapreduce.Partitioner;
public class EdgePartition extends Partitioner<Edge, Writable>{
@Override
public int getPartition(Edge arg0, Writable arg1, int numPartitions) {
return arg0.getFromNode().hashCode() % numPartitions;
}
// 决定Mapper输出的键值对去哪个Reducer。 numPartitions 是Reducer的数量。
// 这里说明相同出发地的 键值对会去同一个Reducer
}
public String getFromNode(){
return this.FromNode;
}
// 这里给之前的Edge类新增了这个访问器。