0

私はhadoopの初心者です。現在、avro を使用して MapR プログラムに取り組んでいます。ローカル Hadoop (1 レデューサー) に対して実行する場合、プログラムのロジックは正しいのですが、8 ノードの CDH クラスターに対して、64 のレデューサーのうち 1 つだけが実際にジョブを実行するという問題が発生します。他の 63 個のレデューサーのログは、マッパーからデータを受け取っていないことを示していました。

私のデータ処理は複雑ではなく、実際には非常に単純です。以下は Mapper と Reducer のシグネチャです。

public static class MyAvroMap extends Mapper<AvroKey<NetflowRecord>, NullWritable,
                                             Text, AvroValue<NetflowRecord>> {}
public static class MyAvroReduce extends Reducer<Text, AvroValue<NetflowRecord>, 
                                             AvroKey<NetflowRecord>, NullWritable> {}

Map の出力キーは、NetflowRecord の文字列フィールドから派生します。シャッフルキーの選択とかavroのことで何か問題ないですか?ありがとうございます。

更新: 上記の実験では、7 GB の avro ファイルを使用し、1 つのレデューサーのみが機能しました。入力量を数百 GB に増やしたところ、他のレデューサーも機能するようになりました。私が知っているように、Hadoop にはデフォルトで 64MB のファイル分割制限があります。しかし、なぜ avro データに対して作業するときに異なる動作をするのでしょうか?

ところで: CDH のデフォルトのファイル分割パラメーターが変更されている場合は変更しません。

ジャミン

4

1 に答える 1

1

問題は、マップから生成されているキーが、パーティショナーが呼び出しを生成した後に 1 つのレデューサーのみを呼び出すことにつながるためです。このため、他の 63 個のレデューサーが空になります。したがって、レデューサーの呼び出しは、生成されるキーに依存します。以下のパーティショナーのロジックを確認してください:-

/** Partition keys by their {@link Object#hashCode()}. */

public class HashPartitioner extends Partitioner {

/** {@link Object#hashCode()} を使用して分割します。*/ public int getPartition(K key, V value, int numReduceTasks) { return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; }

}

ここで、戻り値によって、呼び出すレデューサーが決まります。

これがあなたの疑問に答えることを願っています。

于 2013-10-04T10:19:03.800 に答える