hadoop流排序

nnsrf1az  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(313)

有人能帮忙解决这个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/*
tvz2xvvm

tvz2xvvm1#

默认情况下,hadoop使用散列分区器—Map器的键输出“散列”以确定该键应发送到哪个缩减器。当您使用多个减速机时,这种散列是导致“不正确”结果的原因。
您应该注意,每个输出部分都是经过排序的,现在您只需要将不同的部分交错起来,就可以得到一个经过排序的输出。
您可以通过实现自己的分区器并将键、值对发送到减速器来解决此问题,具体取决于 chrx 第二个领域的价值。然而,您将需要将分区器实现和缩减器的数量结合起来,否则您的结果仍然与目前的结果相似。
因此,如果您知道第二列的值的域或范围(假设 chr0chr255 )然后,可以基于 chr 一串

相关问题