错误:缩减阶段

时间:2017-02-12 11:09:43

标签: java hadoop mapreduce reducers

我的reducer阶段出现了JAVA堆空间错误。我在我的应用程序中使用了41个reducer,也使用了Custom Partitioner类。 下面是我的reducer代码,它低于错误。

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

这是我的reducer代码..

       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 :(得分:0)

最后我决定解决它。

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

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