2

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

私が念頭に置いているアプリケーションは、統計を行う領域になります。レデューサー関数から「各キーの10個の最悪の値」が必要です(一部のキーの値が膨大になる可能性を想定する必要があります)。

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

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

ここで誰かが私が見ることができるサンプルコードを教えてもらえますか?


更新: 2 つの興味深いJira 課題 HADOOP-485およびHADOOP-686を見つけました。

Hadoop 0.20 API でこれを使用する方法に関するコード フラグメントを持っている人はいますか?

4

3 に答える 3

4

決定的にSecondarySortProblemのように聞こえます。必要に応じて、「Hadoop: The definitive guide」をご覧ください。オライリーからです。オンラインでアクセスすることもできます。そこでは、かなり良い実装について説明しています。

私も自分で実装しました。基本的にはこのように動作します: パーティショナーは、同じキーが 1 つのレデューサーに送られるすべてのキーと値のペアを処理します。ここでは特別なことは何もありません。しかし、グルーピングを形成する GroupingComparator もあります。1 つのグループは、実際には反復子として 1 つの reduce() 呼び出しに渡されます。そのため、パーティションには複数のグループを含めることができます。ただし、パーティションの量はレデューサーの数と同じにする必要があります。ただし、グループ化では、compareTo メソッドを実装するため、並べ替えも実行できます。

この方法を使用すると、10 個の最良/最悪/最高/最低のキーが最初にレデューサーに到達するように制御できます。したがって、これらの 10 個のキーを読み取った後は、それ以上反復せずに reduce メソッドを終了できます。

お役に立てば幸いです:-)

于 2009-10-21T10:34:41.453 に答える
1

コンバイナーを使用したいようです。コンバイナーは、レデューサーに送信される前に、キーによってグループ化された後に、マップ側で作成した値をどのように処理するかを定義します。コンバイナーは、多くの場合、レデューサークラスとして設定されます(したがって、マップ側でリデュースし、次にリデュース側でリデュースします)。

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]>-それがしなければならないのは、値セットのメンバーごとにsort-merge(ソートは不要)のマージステップを実行し、最初の10個の値がプルされたときにマージを停止することです。


アップデート2

したがって、ランクが累積的であることがわかったので、コンバイナーを使用してデータを早期にフィルター処理することはできません。唯一のことは、提案したことを実行することです。つまり、2次ソートを実行します。適切なチケットを見つけました。src / examples / org / apache / hadoop / examples /SecondarySort.javaのHadoop20でこれを行う方法の例があります(または、ソースツリー全体をダウンロードしたくない場合は、例を見ることができますhttps://issues.apache.org/jira/browse/HADOOP-4545のパッチ)

于 2009-09-30T16:14:50.127 に答える
0

質問を正しく理解している場合は、TotalOrderPartitionerを使用する必要があります。

于 2009-10-01T20:02:37.913 に答える