2

たくさんのJobControlsを同時に実行していて、すべて同じセットのControlledJobsを使用しています。各JobControlは、日付範囲ごとに異なる入出力ファイルのセットを処理しますが、それらはすべてタイプです。私が観察している問題は、reduceステップが、異なる日付範囲を処理するreducerによって処理されるように設計されたデータを受信して​​いることです。日付範囲はジョブによって設定され、入力と出力を決定するために使用され、レデューサー内のコンテキストから読み取られます。

JobControlsを順番に送信すると、これは停止しますが、それは良くありません。これは、カスタムパーティショナーで解決する必要があるものですか?現在の日付範囲を処理しているレデューサーがわからない場合、キーの正しいレデューサーをどのように決定すればよいですか?インスタンス化されたレデューサーがJobControlにロックされないのはなぜですか?

私は、Javaでの基本実装に対して、すべてのJobControls、Jobs、Maps、Reduceを記述しています。

糸で2.0.3-alphaを使用しています。それはそれと何か関係がありますか?

コードの共有には少し注意する必要がありますが、ここにサニタイズされたマッパーがあります。

protected void map(LongWritable key, ProtobufWritable<Model> value, Context context) 
    throws IOException, InterruptedException {
  context.write(new Text(value.get().getSessionId()), 
                new ProtobufModelWritable(value.get()));
}

そしてレデューサー:

protected void reduce(Text sessionId, Iterable<ProtobufModelWritable> models, Context context) 
     throws IOException, InterruptedException {
  Interval interval = getIntervalFromConfig(context);
  Model2 model2 = collapseModels(Iterables.transform(models, TO_MODEL));

  Preconditions.checkArgument(interval.contains(model2.getTimeStamp()), 
      "model2: " + model2 + " does not belong in " + interval);
}

private Interval getIntervalFromConfig(Context context) {
  String i = context.getConfiguration().get(INTERVAL_KEY);
  return Utils.interval(i);
}
4

1 に答える 1

0

参考までに、これを2つの方法で修正しました。最も重要な問題は、間隔ごとに個別のジョブを作成しているときに、それぞれに同じ名前を付けていたことです。シリアル化された間隔をジョブ名に追加することで、Hadoopはマップ結果を送信するレデューサーを認識しました。

さらに、初期構成をコピーするのではなく、ジョブごとに個別の構成オブジェクトの作成を開始しました。これはおそらく不要ですが、少なくとも私は間違いを犯して同じConfigurationオブジェクトの共有を開始することはできないことを知っています。

于 2013-03-22T08:08:06.943 に答える