7

私はHadoopを使用して、データの非常に不均一な分布を分析しています。一部のキーには数千の値がありますが、ほとんどのキーには1つしかありません。たとえば、IPアドレスに関連付けられたネットワークトラフィックには、いくつかの会話型IPに関連付けられた多くのパケットと、ほとんどのIPに関連付けられた少数のパケットが含まれます。別の言い方をすれば、ジニ係数は非常に高いということです。

これを効率的に処理するには、各レデューサーは、ほぼ均等な負荷がかかるように、いくつかの大音量のキーまたは多数の低音量のキーを取得する必要があります。パーティションプロセスを作成している場合、これをどのように行うかを知っています。keysマッパーによって生成された(すべての重複キーを含む)ソートされたリストと、レデューサーの数を取得Nし、

split[i] = keys[floor(i*len(keys)/N)]

レデューサーは、 forおよびforのようなiキーを取得します。ksplit[i] <= k < split[i+1]0 <= i < N-1split[i] <= ki == N-1

Javaで独自のパーティショナーを作成するつもりですが、Partitioner <KEY、VALUE>クラスは、リスト全体ではなく、一度に1つのKey-Valueレコードにしかアクセスできないようです。Hadoopはマッパーによって生成されたレコードをソートすることを知っているので、このリストはどこかに存在する必要があります。複数のパーティショナーノードに分散されている可能性があります。その場合、サブリストの1つで分割手順を実行し、その結果を他のすべてのパーティショナーノードに何らかの方法で伝達します。(選択したパーティショナーノードにランダム化されたサブセットが表示されると仮定すると、結果はほぼ負荷分散されます。) ソートされたキーのリストが格納されている場所と、それにアクセスする方法を知っている人はいますか?

2つのmap-reduceジョブを作成したくありません。1つは分割を見つけるためのもので、もう1つは実際にそれらを使用するためのものです。(マッパーは同じ仕事を2回行う必要があります。)これは一般的な問題のようです。不均一な分布はかなり一般的です。

4

2 に答える 2

2

私もこの問題について考えてきました。これは、誰かに強制された場合に私がとる高レベルのアプローチです。

  • ビジネス上の問題を解決するために配置したマッパー ロジックに加えて、キーと値のペアをバランスのとれた方法で配布するためにパーティショナーで必要な統計を収集するためのロジックをコーディングします。もちろん、各マッパーは一部のデータしか見ることができません。
  • 各マッパーは、そのタスク ID を見つけ、その ID を使用して、指定された hdfs フォルダーに一意のファイル名を作成し、収集した統計を保持できます。タスクの最後に実行される cleanup() メソッドでこのファイルを書き出します。
  • パーティショナーで遅延初期化を使用して、指定された hdfs ディレクトリ内のすべてのファイルを読み取ります。これにより、マッパー フェーズで収集されたすべての統計が取得されます。そこから、データを正しく分割するために必要な分割ロジックを実装する必要があります。

これはすべて、すべてのマッパーが終了するまでパーティショナーが呼び出されないことを前提としていますが、これまでのところ、これが最善の方法です。

于 2012-08-26T14:52:42.247 に答える
1

私の理解では、すべてのキーが存在する MR 処理の単一の場所はありません。これ以上 - 単一のマシンがこのデータを保存できるという保証はありません。この問題は、現在の MR の枠組みでは理想的な解決策を持っていないと思います。理想的な解決策を得るには、最後のマッパーが終了するのを待ってから、キー配布を分析し、この知識でパーティショナーをパラメーター化する必要があるためです。
このアプローチは、システムを大幅に複雑にし、レイテンシーを高めます。
適切な近似は、データに対してランダム サンプリングを実行してキーの分布を把握し、それに従ってパーティショナーを機能させることだと思います。
私が理解している限り、Terasort の実装は非常に似たようなことを行っています: http://sortbenchmark.org/YahooHadoop.pdf

于 2012-08-25T12:24:51.663 に答える