2017-02-12 17 views
1

私のレデューサーフェーズでJAヒープスペースエラーが発生しました。私のアプリケーションとカスタムパーティショナークラスに41レデューサーを使用しました。 以下はエラーをスローする私のレデューサーコードです。エラー:レジューサーフェーズのJavaヒープスペース

17/02/12 05:26:45 INFO mapreduce.Job: map 98% reduce 0% 
17/02/12 05:28:02 INFO mapreduce.Job: map 100% reduce 0% 
17/02/12 05:28:09 INFO mapreduce.Job: map 100% reduce 17% 
17/02/12 05:28:10 INFO mapreduce.Job: map 100% reduce 39% 
17/02/12 05:28:11 INFO mapreduce.Job: map 100% reduce 46% 
17/02/12 05:28:12 INFO mapreduce.Job: map 100% reduce 51% 
17/02/12 05:28:13 INFO mapreduce.Job: map 100% reduce 54% 
17/02/12 05:28:14 INFO mapreduce.Job: map 100% reduce 56% 
17/02/12 05:28:15 INFO mapreduce.Job: map 100% reduce 88% 
17/02/12 05:28:16 INFO mapreduce.Job: map 100% reduce 90% 
17/02/12 05:28:18 INFO mapreduce.Job: map 100% reduce 93% 
17/02/12 05:28:18 INFO mapreduce.Job: Task Id : attempt_1486663266028_2653_r_000020_0, Status : FAILED 
Error: Java heap space 
17/02/12 05:28:19 INFO mapreduce.Job: map 100% reduce 91% 
17/02/12 05:28:20 INFO mapreduce.Job: Task Id : attempt_1486663266028_2653_r_000021_0, Status : FAILED 
Error: Java heap space 
17/02/12 05:28:22 INFO mapreduce.Job: Task Id : attempt_1486663266028_2653_r_000027_0, Status : FAILED 
Error: Java heap space 
17/02/12 05:28:23 INFO mapreduce.Job: map 100% reduce 89% 
17/02/12 05:28:24 INFO mapreduce.Job: map 100% reduce 90% 
17/02/12 05:28:24 INFO mapreduce.Job: Task Id : attempt_1486663266028_2653_r_000029_0, Status : FAILED 
Error: Java heap space 

ここに私の減速コードが..です

 public class MyReducer extends Reducer<NullWritable, Text, NullWritable, Text> { 

    private Logger logger = Logger.getLogger(MyReducer.class); 
    StringBuilder sb = new StringBuilder(); 
    private MultipleOutputs<NullWritable, Text> multipleOutputs; 

    public void setup(Context context) { 

     logger.info("Inside Reducer."); 

     multipleOutputs = new MultipleOutputs<NullWritable, Text>(context); 
    } 

    @Override 
    public void reduce(NullWritable Key, Iterable<Text> values, Context context) 
      throws IOException, InterruptedException { 

     for (Text value : values) { 
      final String valueStr = value.toString(); 
      if (valueStr.contains("Japan")) { 
       sb.append(valueStr.substring(0, valueStr.length() - 20)); 
      } else if (valueStr.contains("SelfSourcedPrivate")) { 
       sb.append(valueStr.substring(0, valueStr.length() - 29)); 
      } else if (valueStr.contains("SelfSourcedPublic")) { 
       sb.append(value.toString().substring(0, valueStr.length() - 29)); 
      } else if (valueStr.contains("ThirdPartyPrivate")) { 
       sb.append(valueStr.substring(0, valueStr.length() - 25)); 
      } 
     } 
     multipleOutputs.write(NullWritable.get(), new Text(sb.toString()), "MyFileName"); 
    } 

    public void cleanup(Context context) throws IOException, InterruptedException { 
     multipleOutputs.close(); 
    } 
} 

あなたは私の問題を解決するすべての変更を提案することができます。 コンバイナクラスを使用すると改善されますか?

+1

文字列に何個の値を追加しようとしていますか?価値のあるキーがありますか? –

答えて

0

最後に私はそれを解決するために管理しました。

私はちょうどループの中にmultipleOutputs.write(NullWritable.get(), new Text(sb.toString()),strName);を使用しました。それは私の問題を解決しました。非常に巨大なデータセットで19GBのファイルをテストしたところ、うまくいきました。 これは私の最終的な解決策です。最初は多くのオブジェクトを作成するかもしれないと思っていましたが、私にとってはうまくいきました。

@Override 
    public void reduce(NullWritable Key, Iterable<Text> values, Context context) 
      throws IOException, InterruptedException { 
     for (Text value : values) { 

      final String valueStr = value.toString(); 
      StringBuilder sb = new StringBuilder(); 
      if (valueStr.contains("Japan")) { 
       sb.append(valueStr.substring(0, valueStr.length() - 20)); 
      } else if (valueStr.contains("SelfSourcedPrivate")) { 
       sb.append(valueStr.substring(0, valueStr.length() - 24)); 
      } else if (valueStr.contains("SelfSourcedPublic")) { 
       sb.append(value.toString().substring(0, valueStr.length() - 25)); 
      } else if (valueStr.contains("ThirdPartyPrivate")) { 
       sb.append(valueStr.substring(0, valueStr.length() - 25)); 
      } 
      multipleOutputs.write(NullWritable.get(), new Text(sb.toString()), 
        strName); 
     } 
    } 
関連する問題