1

我正在从 freebase 转储(标题、别名、类型名称)中提取数据到 avro(还没有在这个工作中)。我正在使用带有 python 的 mapreduce 流。

此作业缩减器需要类型标题(通常是任何对象标题)和对对象的类型 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,并将关键字段分隔符设置为“%”。它应该根据对象标识符对数据进行分区,例如“common.topic”或“m.01dyhm”。但我认为我的配置是错误的。它适用于单个减速器(Hortonworks VM),但在 32 节点集群上发出空白文件(我没有直接访问权限,所以我无法有效地进行实验)。我猜分区是错误的,并且没有数据可以加入单个减速器。

这是我的 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 

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

4

1 回答 1

1

这对我来说看起来不错。您将密钥拆分为两个子密钥并使用第一部分进行分区。

您可能需要添加以下选项来告诉分区程序您要按复合键排序,以便对减速器输入进行排序。

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

如果您的输出中出现空行,则表明您正在编写额外的换行符。这些行通过 sys.stdin 输入,尾随 \n。您可以尝试在映射器和减速器中使用 print line 或 print line.strip() 来查看是否是这种情况。

如果您根本没有得到任何输出,则问题可能出在 python 代码中。

于 2014-12-03T15:50:41.160 回答