我提取数据从freebase转储(标题,别名,类型名称)到avro (还没有在这个工作)。我正在使用带有python的mapreduce流。
这个job reducer需要类型标题(通常是任何对象标题)和对对象的类型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 TopicTitle在引用之前(因此reducer记住它并发出取消引用的记录),与一种类型相关的所有记录都必须划分到一个reducer。这是通过键排序来保证的。因为我正在使用组合键,所以我需要正确地对记录进行分区。我正在使用配置为"-k1,1“的KeyFieldBasedPartitioner,并将关键字字段分隔符设置为"%”。它应该根据对象标识符对数据进行分区,例如"common.topic“或"m.01dyhm”。但我认为我的配置是错误的。它可以使用单个reducer (Hortonworks VM),但会在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 我的分区程序配置正确吗?谢谢你的帮助。
发布于 2014-12-03 23:50:41
我觉得这个不错。您正在将键拆分为两个子键,并使用第一部分进行分区。
您可能希望添加以下选项,以告诉分区工具您希望按组合键进行排序,以便对您的reducer输入进行排序。
-D stream.num.map.output.key.fields=2如果您在输出中得到空行,则表明您正在编写额外的换行符。您可以尝试在映射器和缩减程序中使用print sys.stdin或print line.strip()来查看是否是这种情况。
如果您根本没有得到输出,那么问题可能出在python代码中。
https://stackoverflow.com/questions/27252541
复制相似问题