2014-12-02 105 views
1

我从freebase转储(标题,别名,类型名称)提取数据到avro(尚未在此作业中)。我正在使用Python的mapreduce流。Hadoop流式传输KeyFieldBasedPartitioner

此作业缩减器期望类型标题(通常是任何对象标题)和类型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 

标题preceeds引用(因此减速记住它,并发出取消引用的记录),并与相关的所有记录一种类型必须分区到一个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 

是我的分区配置吗?谢谢你的帮助。

回答

1

这对我来说很好。您将密钥分成两个子密钥并使用第一部分进行分区。

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

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

如果您在输出中显示空行,表示您正在编写额外的换行符。这些行通过sys.stdin以\ n结尾输入。您可以尝试使用打印行,或者在mappers和reducer中输入line.strip()以查看是否属于这种情况。

如果你没有得到任何输出,问题可能出现在python代码中。

+0

谢谢,我会尝试这个选项。我根本没有输出。 Python代码是正确的,它可以在数据正确排序时与单个reducer一起工作。 – 2014-12-03 21:25:39

+0

如果您发布您的映射器/缩减器代码,我可以尝试在提供的示例数据的集群上运行它,并查看我得到的结果。 – Nonnib 2014-12-03 22:03:01

+0

我的老师没有回应,所以我不知道这个选项是否有帮助。你可以试试你的群集吗?不幸的是,我没有包含足够相关数据的数据集子集。在32个节点集群上,它应该在一个小时内运行。 [Freebase Triples数据集](https://developers.google.com/freebase/data)。 [代码](https://github.com/OndroNR/freebase/tree/odovzdanie/python/src/mr_extractor_avro)。让我知道你是否需要澄清任何事情。非常感谢。 – 2014-12-27 22:45:18