有人能帮忙解决这个hadoop流排序问题吗?提前谢谢你的建议。
我是hadoop的新手,需要在500gb制表符分隔的文本文件上实现排序函数。下面是一个输入示例,一行中有3个字段,如 READA14 chr14 50989
. 在这里,我需要按第2列和第3列进行数字排序,除非我将还原数设置为1,否则我将永远不会得到正确的排序结果。
输入示例:
READA14 chr14 50989
READB18 chr18 517043
READC22 chr22 88345
READD10 chr10 994183
READE19 chr19 232453
READF20 chr20 42912
READF9 chr9 767396
READG22 chr22 783469
READG16 chr16 522257
READH9 chr9 826357
READH16 chr16 555098
READH21 chr21 128309
READH4 chr4 719890
READH18 chr18 944551
READH22 chr22 530068
READH9 chr9 212247
READH11 chr11 574930
READH22 chr22 664833
READH2 chr2 908178
READH22 chr22 486178
READH7 chr7 533343
READH6 chr6 109022
READH15 chr15 316353
READH20 chr20 439938
READH21 chr21 731912
READH11 chr11 81162
READH2 chr2 670838
READH15 chr15 729549
READH3 chr3 196626
READH14 chr14 841104
我的流式排序代码:
hadoop jar \
/home/hadoop-0.20.2-cdh3u5/contrib/streaming/hadoop-streaming-0.20.2-cdh3u5.jar \
-input /user/luoqin/projects/samsort/number \
-output /user/luoqin/projects/samsort/number_sort \
-mapper "cat" \
-reducer "sort -k 2.5 -n -k 3" \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-jobconf map.output.key.field.separa="\t" \
-jobconf num.key.fields.for.partition=1 \
-jobconf mapred.data.field.separator="\t" \
-jobconf map.output.key.value.fields.spec="2:0-" \
-jobconf reduce.output.key.value.fields.spec="2:0-" \
-jobconf mapred.reduce.tasks=50
结果被划分为50个部分。任务设置为50。但是,将结果视为是不正确的,除非将reduce.task设置为1:
hadoop fs -cat /user/projects/samsort/number_sort/*
1条答案
按热度按时间tvz2xvvm1#
默认情况下,hadoop使用散列分区器—Map器的键输出“散列”以确定该键应发送到哪个缩减器。当您使用多个减速机时,这种散列是导致“不正确”结果的原因。
您应该注意,每个输出部分都是经过排序的,现在您只需要将不同的部分交错起来,就可以得到一个经过排序的输出。
您可以通过实现自己的分区器并将键、值对发送到减速器来解决此问题,具体取决于
chrx
第二个领域的价值。然而,您将需要将分区器实现和缩减器的数量结合起来,否则您的结果仍然与目前的结果相似。因此,如果您知道第二列的值的域或范围(假设
chr0
至chr255
)然后,可以基于chr
一串