1

こんにちは、一般的に XML ファイルを解析する mapreduce ジョブを作成しました。XML ファイルを解析し、適切に生成されたすべてのキーと値のペアを取得できます。6 つの異なるキーとそれに対応する値があります。そのため、6 つの異なるレデューサーを並行して実行しています。

今私が直面している問題は、レデューサーが2つの異なるキーと値のペアを同じファイルに入れ、残りの4つのキーと値を個々のファイルに入れていることです。つまり、リデューサーからの出力の 6 つのファイルのうち、単一のキーと値のペアを含む 4 つのファイルと、2 つのキーと値のペアを含む 1 つのファイルと、何も持たない 1 つのファイルを取得しています。

Google やさまざまなフォーラムで調査を試みましたが、この問題を解決するにはパーティショナーが必要であるという結論に達しました。私は新しいHadoopなので、誰かがこの問題に光を当てて、これを解決するのを手伝ってくれます.

私は疑似ノードクラスターに取り組んでおり、Java をプログラミング言語として使用しています。ここでコードを共有することはできませんが、問題を簡単に説明しようとしています。

より多くの情報が必要であることをお知らせください。事前に感謝します。

4

2 に答える 2

0

6 つのレデューサーに対して 6 つのキーしか持たないことは、hadoop の最適な利用法ではありません。

キーはレデューサー間で分割できないため、キーが 6 つ未満の場合、レデューサーのサブセットのみが作業を行うことになります。キーの割り当て (および入力ファイルの Hadoop に対する適切性) を再考し、リデューサー間である程度均等に分散するのに十分なキーがあるようなシステムを使用することを検討する必要があります。

EDIT:あなたがしたいのMultipleOutputFormatは、メソッドを持っている.generateFileNameForKeyValue(key, value, name)Reducer

于 2013-04-24T21:30:23.597 に答える
0

Hadoop はデフォルトでデフォルトのHash パーティショナーを使用します - ここをクリックのようなものです

public class HashPartitioner<K2, V2> implements Partitioner<K2, V2> {

  public void configure(JobConf job) {}

  /** Use {@link Object#hashCode()} to partition. */
  public int getPartition(K2 key, V2 value,
                          int numReduceTasks) {
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;
  }

}

key.hashCode() & Integer.MAX_VALUE) % numReduceTasks は 0 から numReduceTasks までの数値を返します。この場合、numRuduceTask=6 であるため、範囲は 0 から 5 になります。

キャッチはその行自体にあります-そのようなステートメントが2つあると、同じ数値が返される場合があります。その結果、2 つの異なるキーが同じレデューサーに送られる可能性があります。例えば ​​-

("go".hashCode() & Integer.MAX_VALUE) % 6

あなたを返します 4 そして、

("hello".hashCode() & Integer.MAX_VALUE) % 6

また、あなたを返します 4.

したがって、ここで私が提案したいのは、6 つのキーすべてが 6 つの異なるレデューサーによって確実に処理されるようにしたい場合は、必要なものを取得するために独自のパーティショナーを作成する必要があるということです。

カスタム パーティショナーの作成については、このリンクを参照してください。混乱があり、Job クラスを使用して次のようにカスタム パーティショナーを指定する場合は、次のようにします。

job.setPartitioner(<YourPartionerHere.class>);

お役に立てれば。

于 2013-05-11T06:07:38.240 に答える