mapper因堆空间问题而失败

jjhzyzn0  于 2021-06-01  发布在  Hadoop
关注(0)|答案(0)|浏览(222)

我已经编写了一个定制的map reduce代码来模拟flatmap行为,即mapper的输入是一个s3位置,其中包含{key,collection}的元组。Map程序只遍历数据并返回集合。mapper的输入是s3中的27个文件,每个文件的大小为238MB。当map/reduce代码运行时,分割决定为57。作业的减速机数为0。
Map程序代码:

@Override
protected void map(final LongWritable key, @Nonnull final Text value, @Nonnull final Context context)
        throws IOException, InterruptedException {
    Objects.requireNonNull(value);
    Objects.requireNonNull(context);

    T input;
    try {
        input = mapper.readValue(value.toString(), componentFunction.getInputClass());
    } catch (Exception e ) {
        throw new CafeMapReduceException("Failed to deserialize input: " + value.toString(), e);
    }
    PartitionerFlatmapComponentOutput output = new PartitionerFlatmapComponentOutput().setNotifications(input.getNotificationTuple().getValue());
    writeToContext(context, output);
}

    protected void writeToContext(@Nonnull final Context context, @Nonnull final U output)
        throws IOException, InterruptedException {
    if (output instanceof Collection) {
        for (Object element : (Collection) output) {
            context.write(NullWritable.get(), new Text(mapper.writeValueAsString(element)));
        }
    } else {
        throw new CafeMapReduceException("Invalid output for flatMap. Output type: " + output.getClass());
    }
}

我尝试使用以下配置运行此代码:mapreduce.map.java.opts=-xmx4096m,但由于java堆空间问题,它失败了。我甚至尝试了多个gc算法,比如-xx:+usepallelgc,concurrentgc,但是仍然失败了。
当我们为mapper提供10gb的堆空间时,mappers成功完成。
我不明白为什么Map程序需要10GB的内存。我正在使用hadoop2.7.3。我们应该以什么方式着手解决这个问题,任何帮助都是有帮助的。
... 正在添加更多详细信息。。。
发送到Map器的每个250MB只有一行,即tuple{key,collection}的json表示。我得到了堆转储并运行了分析器,它显示了以下内容:
线程java.lang.thread@0x6c018b708 main保存总大小为3030076656(98.29%)字节的局部变量。

我明白为什么这么多的内存被局部变量保留了。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题