4

私は 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.

どんな助けでも大歓迎です!前もって感謝します

4

2 に答える 2

3

ryanbwork のおかげで、この問題を解決できました。わーい !

実際、値の連結からなるキーを作成するというのは正しい考えでした。もう少し進んで、次のようなキーを作成することもできます

<'1.0.foo.bar', {'0','foo','bar'}>
<'1.1.888.999', {'1','888','999'}>

その後、キーの最初の「部分」によって分割できるように、オプションを hadoop に渡すことができます。解釈を間違えていなければ、次のようになります。

-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartioner
-D stream.map.output.field.separator=. # I added some "." in the key
-D stream.num.map.output.key.fields=4  # 4 "sub-fields" are used to sort
-D num.key.fields.for.partition=1      # only one field is used to partition

このソリューションは、ryanbwork の発言に基づいており、データが適切に分割およびソートされていることを確認しながら、より多くのレデューサーを作成できます。

于 2013-01-29T10:24:09.890 に答える
2

この投稿を読んだ後、「キー」にキー値、線種値、および value1/value2 値がすべて連結されたペアを返すようにマッパーを変更することを提案します。ペアの「値」部分は同じにします。たとえば、最初の 2 つの例を表すには、次のペアを返します。

<'10foobar',{'0','foo','bar'}>
<'11888999',{'1','888','999'}>

単一のレデューサーを使用する場合、すべてのレコードが同じリデュース タスクに送信され、「キー」に基づいてアルファベット順に並べ替えられます。これは、ペアがキー、次に線種、次に値1、最後に値2でソートされるという要件を満たし、ペアの「値」部分でこれらの値に個別にアクセスできます。私はさまざまな組み込みのパーティショナー/ソート クラスにあまり詳しくありませんが、デフォルトを使用してこれを機能させることができると思います。

于 2013-01-28T23:38:11.370 に答える