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
タイトルは参照に先行し (したがって、レデューサーはそれを記憶し、参照解除されたレコードを出力します)、1 つのタイプに関連するすべてのレコードは 1 つのレデューサーに分割する必要があります。これは、キーの並べ替えによって保証されます。複合キーを使用しているため、レコードを正しく分割する必要があります。KeyFieldBasedPartitioner を構成 "-k1,1" で使用しており、キー フィールド セパレータを "%" に設定しています。「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
パーティショナーの構成は正しいですか? 助けてくれてありがとう。