错误:还原器阶段中的Java堆空间

问题描述:

我在我的还原器阶段收到了JAVA堆空间错误。我在我的应用程序中使用了41还原器,还使用了自定义分区器类。 下面是我的reducer代码,抛出错误。错误:还原器阶段中的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

您试图向字符串添加多少个值?你有一个有很多价值的钥匙吗? –

最后我管理解决它。

我刚刚在for循环中使用了multipleOutputs.write(NullWritable.get(), new Text(sb.toString()),strName);,这解决了我的问题。我用非常大的数据集19 GB文件测试了它,它对我来说工作得很好。 这是我的最终解决方案。最初我认为它可能会创建很多对象,但它对我来说工作得很好.Map缩小也是竞争非常快。

@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); 
     } 
    }