2014-12-02 111 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