-1

Java で記述した Hadoop MapReduce ジョブで、REDUCE のフェーズで分割の不安定性を発見しました。特定の 1 / X with X double:

double sum = 0;
 while (values.hasNext())
 {
    sum += values.next().get();
 }
 if (sum != 0) {
    output.collect(key, new DoubleWritable(1/sum));
 } else {
   output.collect(key, new DoubleWritable(1));
 }

値は反復子です。

sum が ZERO と異なる場合は、1/sum を書き込み、SOMETIMES WRITE sum を書き込むことがあります。それは私を夢中にさせます。どうもありがとう

[解決済み] MAPPER と REDUCER のインターフェイス (キーと値) が異なるという別の問題がありました。(Text, InteWritable) 1 つ目 (Text, DoubleWritable) 2 つ目。これを「メイン」で構成しました。次の行を入力するのが間違っていたため、エラーが続きました。

conf.setCombinerClass(Reduce.class);

マッパーとリデューサーで同じインターフェイス (k, v) が必要ですが、これは私の場合ではありません。すべての作品を削除しました。Arnon Rotem-Gal-Oz のおかげで、私は彼を支持する評判がありません

4

1 に答える 1

1

あなたの問題は、合計を計算するときに浮動小数点値の加算が可換でないことです(その原因は double の制限された精度です)。簡単に言えば、合計は要素が追加される順序の影響を受けます。

これは、次のコードによって非常にうまく示されています。

public class DoubleSumDemo {

    public static void main(String[] argv) {
        final ArrayList<Double> list = new ArrayList<Double>();
        // fill list with random values
        for (int i=0; i<1000000; ++i)
            list.add(Math.random());
        // sum the list, print the sum and then reorder the list elements
        while (true) {
            double sum = 0D;
            for (double element : list) 
                sum += element;
            System.out.println("sum is: " + sum);
            Collections.shuffle(list);
        }
    }

}

リストは 1 回だけ入力されますが、ループごとに異なる合計が出力されます。

于 2013-05-28T18:22:28.263 に答える