hadoop流式keyfieldbasedpartitioner

lc8prwob  于 2021-05-30  发布在  Hadoop
关注(0)|答案(1)|浏览(406)

我正在从freebase转储(标题、别名、类型名)中提取数据到avro中(目前还不在这个工作中)。我正在用python使用mapreduce流。
此job reducer需要类型title(通常是任何对象标题)和对对象的类型id引用。记录形式为: id%relation\tvalue 例如:

common.topic%title  Topic
common.topic%used_by    m.01dyhm
common.topic%used_by    m.03x5qm
common.topic%used_by    m.04pm6

减速器发射:

m.01dyhm%type   Topic
m.03x5qm%type   Topic
m.04pm6%type    Topic

标题处理引用(因此reducer会记住它并发出取消引用的记录),并且与一个类型相关的所有记录都必须分区到一个reducer。这可以通过密钥排序来保证。当我使用复合密钥时,我需要正确地划分记录。我正在使用配置为“-k1,1”的keyfieldbasedpartitioner,并将keyfieldseparator设置为“%”。它应该在对象标识符上划分数据,例如“common.topic”或“m.01dyhm”。但我认为我的配置是错误的。它可以与单个reducer(hortonworksvm)一起工作,但是在32节点集群上发出空白文件(我没有直接访问权限,因此无法有效地进行实验)。我猜分区是错误的,并且没有数据可以连接到单个reducer上。
这是我的hadoop命令:

hadoop \
jar $streaming \
-D mapred.job.name='Freebase extract - phase 3' \
-D mapreduce.map.output.key.field.separator='%' \
-D mapreduce.partition.keypartitioner.options=-k1,1 \
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
-input freebase/job1output \
-input freebase/job2output \
-output freebase/job3output \
-mapper "python job3mapper.py" \
-reducer "python job3reducer.py" \
-file job3mapper.py \
-file job3reducer.py

我的分区器配置正确吗?谢谢你的帮助。

nbysray5

nbysray51#

我觉得这个不错。将键拆分为两个子键,并使用第一部分进行分区。
您可能需要添加以下选项来告诉分区器您要按复合键排序,以便对reducer输入进行排序。

-D stream.num.map.output.key.fields=2

如果输出中出现空行,则表明您正在编写额外的换行符。行通过sys.stdin输入,后面有一个\n。您可以尝试在Map器和还原器中使用print line或print line.strip(),看看是否是这样。
如果您没有得到任何输出,那么问题可能出在python代码中。

相关问题