我正在做mapreduce工作如下:
地图方面:
映射器将以A\tB\t\t1
的形式输出,其中A和B一起是复合键。
我在这个作业中使用了几个reducer(reducer是identity reducer,A -> A
),并希望根据复合键进行分区。我运行此命令来启动mapreduce作业。
hadoop jar hadoop-streaming-2.7.1.jar \
-D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator \
-D stream.num.map.output.key.fields=2 \
-D mapred.text.key.comparator.options="-k1n -k2n" \
-D mapred.text.key.partitioner.options=-k1 \
-D mapreduce.job.reduces=4 \
-files /mapper,/reducer \
-mapper ./mapper \
-reducer ./reducer \
-input /data \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-output /result
我想要的输出是: 减速机A的输出:
A B 1
A B 1
A C 1
A D 1
A E 1
减速器B的输出:
B E 1
B G 1
E G 1
B H 1
但是,输出现在是A作为主键(在上述情况下为A和B)可能出现在不同的reducer之间。什么事情发生在这里?