1

私は興味深い状況に遭遇しました、そして今それを意図的に行う方法を探しています。ローカルの単一ノードのセットアップで、ターミナル画面から2つのジョブを同時に実行しました。私の両方のジョブは同じレデューサーを使用していますが、マップ関数(集計キー-group by)にのみ違いがあり、両方のジョブの出力は最初のジョブの出力に書き込まれました(2番目のジョブは独自のフォルダーを作成しましたが、空でした) )。私が取り組んでいるのは、さまざまなレベルにまたがるロールアップ集約を提供することです。この動作は、2つの異なるレベルからの集約出力を1つのファイルで利用できる(完全にソートされている)という点で魅力的です。

私の質問は、複数のデータノードがある実際のHadoopクラスターで同じことを実現する方法です。つまり、プログラムで複数のジョブを開始し、すべて同じ入力ファイルにアクセスし、データを異なる方法でマッピングしますが、同じレデューサーを使用し、出力は1つで利用できます。単一のファイルであり、5つの異なる出力ファイルではありません。

お知らせ下さい。

質問をする前に、reduceフェーズ後のマージ出力ファイルを調べていました。

よろしくお願いいたします。

Moiz Ahmed

4

2 に答える 2

1

異なるマッパーが同じ入力ファイル、つまり同じデータ構造を消費する場合、これらすべての異なるマッパーのソースコードを単一のマッパー実装の別々のメソッドに配置し、コンテキストのパラメーターを使用して、呼び出すマップ関数を決定できます。 。プラス面では、1つのMapReduceジョブのみを開始する必要があります。例は擬似コードです:

class ComplexMapper extends Mapper {

protected BitSet mappingBitmap = new BitSet();

protected void setup(Context context) ... {
{
    String params = context.getConfiguration().get("params");
    ---analyze params and set bits into the mappingBitmap
}

protected void mapA(Object key, Object value, Context context){
.....
context.write(keyA, value);
}


protected void mapB(Object key, Object value, Context context){
.....
context.write(keyA, value);
}


protected void mapB(Object key, Object value, Context context){
.....
context.write(keyB, value);
}

public void map(Object key, Object value, Context context) ..... {
   if (mappingBitmap.get(1)) {
       mapA(key, value, context);
   }
   if (mappingBitmap.get(2)) {
       mapB(key, value, context);
   }
   if (mappingBitmap.get(3)) {
       mapC(key, value, context);
   }
}

当然のことながら、インターフェースなどを使用してよりエレガントに実装できます。

ジョブの設定で、次を追加するだけです。

Configuration conf = new Configuration();
conf.set("params", "AB");

Job job = new Job(conf);

Praveen Sripatiが述べたように、出力ファイルが1つであると、Reducerが1つだけになり、パフォーマンスが低下する可能性があります。hdfsからダウンロードする場合は、いつでもpart**ファイルを連結できます。例:

hadoop fs -text /output_dir/part* > wholefile.txt
于 2012-10-25T09:36:36.060 に答える
0

通常、各レデューサータスクはHDFSで個別のファイルを生成するため、リデューサータスクは並行して動作できます。要件がreduceタスクから1つのo/pファイルを持つことである場合は、1つのreducerタスクを持つようにジョブを構成します。レデューサーの数は、デフォルトで1に設定されているmapred.reduce.tasksプロパティを使用して構成できます。このアプローチの欠点は、ジョブを完了するためのボトルネックとなる可能性のあるレデューサーが1つしかないことです。

もう1つのオプションは、 DBOuputFormatのように、複数のレデューサーが同じシンクに同時に書き込むことができる他の出力形式を使用することです。ジョブの処理が完了すると、DBからの結果をフラットファイルにエクスポートできます。このアプローチにより、複数のreduceタスクを並行して実行できるようになります。

もう1つのオプションは、OPに記載されているようにo/pファイルをマージすることです。したがって、各アプローチの長所と短所、および処理するデータの量に基づいて、アプローチの1つを選択できます。

于 2012-10-24T05:04:09.293 に答える