我已经编写了一个定制的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%)字节的局部变量。
我明白为什么这么多的内存被局部变量保留了。
暂无答案!
目前还没有任何答案,快来回答吧!