首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hadoop streaming KeyFieldBasedPartitioner

Hadoop streaming KeyFieldBasedPartitioner
EN

Stack Overflow用户
提问于 2014-12-02 23:05:59
回答 1查看 2.2K关注 0票数 1

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

这个job reducer需要类型标题(通常是任何对象标题)和对对象的类型id引用。记录格式为:id%relation\tvalue

例如:

代码语言:javascript
复制
common.topic%title  Topic
common.topic%used_by    m.01dyhm
common.topic%used_by    m.03x5qm
common.topic%used_by    m.04pm6

减速剂排放:

代码语言:javascript
复制
m.01dyhm%type   Topic
m.03x5qm%type   Topic
m.04pm6%type    Topic

Title在引用之前(因此reducer记住它并发出取消引用的记录),与一种类型相关的所有记录都必须划分到一个reducer。这是通过键排序来保证的。因为我正在使用组合键,所以我需要正确地对记录进行分区。我正在使用配置为"-k1,1“的KeyFieldBasedPartitioner,并将关键字字段分隔符设置为"%”。它应该根据对象标识符对数据进行分区,例如"common.topic“或"m.01dyhm”。但我认为我的配置是错误的。它可以使用单个reducer (Hortonworks VM),但会在32节点集群上发出空白文件(我没有直接访问权限,因此无法有效地进行实验)。我猜分区是错误的,并且在单个reducer上没有要连接的数据。

这是我的hadoop命令:

代码语言:javascript
复制
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 

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

EN

回答 1

Stack Overflow用户

发布于 2014-12-03 23:50:41

我觉得这个不错。您正在将键拆分为两个子键,并使用第一部分进行分区。

您可能希望添加以下选项,以告诉分区工具您希望按组合键进行排序,以便对您的reducer输入进行排序。

代码语言:javascript
复制
-D stream.num.map.output.key.fields=2

如果您在输出中得到空行,则表明您正在编写额外的换行符。您可以尝试在映射器和缩减程序中使用print sys.stdin或print line.strip()来查看是否是这种情况。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27252541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档