在将MapReduce与流媒体和Python结合使用时,我在排序时遇到问题。
这是一个更大的问题的一部分,但可以将其简化为(无双关语:)):
>> cat inputFile.txt
a b 1 file1
a b 2 file1
e f 0 file2
d c 3 file3
d e 2 file4
a c 5 file5
a b 3 file1
d c 2 file3
e f 2 file2
a c 4 file5
d e 10 file4
第一和第二列是键。
我希望对地图阶段的输出进行这种排序(首先按column1,然后按数字2,然后按数字3):
>>sort -k1,1 -k2,2 -k3n,3 inputFile.txt
a b 1 file1
a b 2 file1
a b 3 file1
a c 4 file5
a c 5 file5
d c 2 file3
d c 3 file3
d e 2 file4
d e 10 file4
e f 0 file2
e f 2 file2
这里的第四列暗示了我如何将文件还原,但是如果两个键在同一个文件中(只要每个键的所有实例都在一个文件中)就可以了)。 为此,我运行以下命令:
hadoop jar /usr/lib/hadoop/hadoop-streaming.jar -D stream.num.map.output.key.fields=2 -D mapred.text.key.comparator.options="-k3,3" -D mapred.text.key.partitioner.options="-k3,3" -mapper cat -reducer cat -input /user/hadoop/inputFile.txt -output /user/hadoop/output
此命令的输出未排序。例如:
>>cat output/part-00066
a b 2 file1
a b 3 file1
a b 1 file1
备注:
这似乎是我真正想念的东西,我在做什么错了?
非常感谢您的帮助!
答案 0 :(得分:0)
尝试了几乎所有可能的组合之后,我发现这可行:
hadoop jar /usr/lib/hadoop/hadoop-streaming.jar \
-D \
mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator\
-D stream.num.map.output.key.fields=4 \
-D mapred.text.key.partitioner.options=-k1,2 \
-D mapred.text.key.comparator.options=-"-k1,1 -k2,2 -k3n,3" \
-input /user/hadoop/inputFile.txt \
-output /user/hadoop/output \
-mapper cat -reducer cat \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner
可以找到更多的解释here:
关键(同样,没有双关语:))是使用KeyFieldBasedPartitioner作为分区程序。