私は Hadoop ストリームに非常に慣れていないため、パーティショニングに問題があります。
行の内容に応じて、マッパー関数は次のいずれかを返します
key1, 0, somegeneralvalues # some kind of "header" line where linetype = 0
また
key1, 1, value1, value2, othervalues... # "data" line, different values, linetype =1
適切に削減するには、同じkey1を持つすべての行をグループ化し、value1、value2、および線種 (0 または 1) で並べ替える必要があります。たとえば、次のようになります。
1 0 foo bar... # header first
1 1 888 999.... # data line, with lower value1
1 1 999 111.... # a few datalines may follow. Sort by value1,value2 should be performed
------------ #possible partition here, and only here in this example
2 0 baz foobar....
2 1 123 888...
2 1 123 999...
2 1 456 111...
そのようなパーティショニングを確実にする方法はありますか? これまでのところ、次のようなオプションで遊んでみました
-partitioner,'org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner'
-D stream.num.map.output.key.fields=4 # please use 4 fields to sort data
-D mapred.text.key.partitioner.options=-k1,1 # please make partitions based on first key
または代わりに
-D num.key.fields.for.partition=1 # Seriously, please group by key1 !
それはまだ怒りと絶望をもたらすだけでした。
言及する価値がある場合は、猫のデータを使用するとスクリプトが正常に動作します。マッパー | ソート | reduce で、Amazon Elastic Map Reduce Ruby クライアントを使用しているため、オプションを次のように渡しています。
--arg '-D','options' for the ruby script.
どんな助けでも大歓迎です!前もって感謝します