質問

システムのコツを掴むために、Hadoop で小さなテスト アプリケーションを構築することを考えています。

私が考えているアプリケーションは、統計を行う分野になります。リデューサー関数から「各キーのワースト 10 個の値」を取得したいと考えています (一部のキーには膨大な数の値がある可能性を想定する必要があります)。

私が計画しているのは、レデューサーに入る値は基本的に「実際の値」と「実際の値の品質/関連性」の組み合わせになるということです。関連性に基づいて、「単純に」最悪/最良の値 10 個を取得し、それらをリデューサーから出力したいと考えています。

(特定のキーに膨大な数の値があると仮定して) それを行うにはどうすればよいですか?すべての値をリデューサーに送信する前に並べ替える方法はありますか (最初の 10 個を読み取ったら入力の読み取りを停止するだけです)、それとも別の方法で行う必要がありますか?

誰かここでサンプルコードを教えてもらえますか?


アップデート:2 つの興味深い Jira 問題を見つけました HADOOP-485 そして HADOOP-686.

これを Hadoop 0.20 API で使用する方法に関するコード断片を持っている人はいますか?

役に立ちましたか?

解決

Combiner を使用したいようですね。Combiner は、Map 側で作成した値を Reducer に送信する前、キーごとにグループ化した後にその値をどう処理するかを定義します。コンバイナーは、単にリデューサー クラスになるように設定されることがよくあります (つまり、マップ側でリデュースし、次にリデュース側で再度リデュースします)。

wordCount の例で結合器を使用して部分カウントを事前計算する方法を見てください。

http://wiki.apache.org/hadoop/WordCount


アップデートあなたの問題に対して私が考えていることは次のとおりです。ただし、あなたがやろうとしていることを誤解している可能性があります。

すべてのマッパーが出力する <key, {score, data}> ペア。

コンバイナーは、次のペアの部分セットを取得します。 <key, [set of {score, data}> そして、ローカルソートを実行し(まだマッパーノード上で)、出力します <key, [sorted set of top 10 local {score, data}]> ペア。

レデューサーは取得します <key, [set of top-10-sets]> -- 必要なのは、値セットの各メンバーに対してソート/マージのマージ ステップを実行し (ソートは必要ありません)、最初の 10 個の値が取得されたときにマージを停止することだけです。


アップデート2

したがって、ランクが累積的であり、その結果、結合器を使用してデータを早期にフィルタリングできないことがわかったので、唯一のことは、あなたが提案したことを実行することです-二次並べ替えを開始することです。適切なチケットが見つかりました。Hadoop 20 でこれを行う方法の例は、src/examples/org/apache/hadoop/examples/SecondarySort.java にあります (ソース ツリー全体をダウンロードしたくない場合は、その例を参照してください)パッチイン https://issues.apache.org/jira/browse/HADOOP-4545 )

他のヒント

は決定的SecondarySortProblemのようですね。あなたがしたい場合は、「決定的なガイドのHadoop」に見てみましょう。それはオライリーからです。また、オンラインでアクセスすることができます。そこではかなり良い実装を記述します。

私も自分でそれを実装しました。基本的にはこのように動作します: パーティは、1つの減速に行く同じキーを持つすべてのキーと値のペアの世話をします。ここでは特別な何もありません。 しかし、また、グループを形成することになるGroupingComparator、そこにあります。呼び出し - 1つのグループは実際には1つ減らす()へのイテレータとして渡されます。だから、パーティションは、複数のグループを含めることができます。しかし、パーティションの量は、減速の数と等しくなければなりません。しかし、グループはまた、のcompareToメソッドを実装して、いくつかの並べ替えを行うことができます。

この方法では、あなたがコントロールすることができ、その10最高/最悪/最高/最低のキーが最初の減速に到達しますが。あなたはこれらの10個のキーを読んだ後だから、あなたは任意のさらなる反復せずにメソッドを減らす残すことができます。

役に立った

希望: - )

私が正しく質問を理解していれば、あなたが使用する必要があります<のhref = "http://hadoop.apache.org/common/docs/r0.19.0/api/org/apache/hadoop/mapred/ libに/ TotalOrderPartitioner.html」のrel = "nofollowをnoreferrer" タイトル= "TotalOrderPartitioner"> TotalOrderPartitioner を。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top