我正在AWS EMR上运行MapReduce作业。除了一个非常大的文件外,映射作业已完成。我得到以下错误:
OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000611280000, 1521483776, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 1521483776 bytes for committing reserved memory.
这似乎是记忆问题。我修改了我的配置json文件,添加了(比所需的多得多)内存:
[
{
"Classification": "hadoop-env",
"Properties": {},
"Configurations": [
{
"Classification": "export",
"Properties": {
"HADOOP_DATANODE_HEAPSIZE": "10240",
"HADOOP_NAMENODE_OPTS": "-XX:GCTimeRatio=19",
"HADOOP_HEAPSIZE": "11264",
"HADOOP_CLIENT_OPTS": "-Xmx10240M"
}
}
]
},
{
"Classification": "mapred-site",
"Properties": {
"mapreduce.map.memory.mb": "24576",
"mapreduce.map.java.opts": "-Xmx19200M",
"mapred.child.java.opts": "-Xmx4096M",
"mapreduce.reduce.memory.mb": "15360",
"mapreduce.reduce.java.opts": "-Xmx10240M",
"mapreduce.job.jvm.numtasks": "1",
"mapreduce.job.reuse.jvm.num.tasks": "1"
}
},
{
"Classification": "yarn-site",
"Properties": {
"yarn.scheduler.maximum-allocation-mb": "25600",
"yarn.nodemanager.resource.memory-mb": "25600"
}
},
{
"Classification": "hive-env",
"Properties": {}
},
{
"Classification": "hive-site",
"Properties": {}
}
]
然而,我一直在了解这个问题。正如你所看到的,我已经添加了许多在线建议的mapred.child.java.opts,但我运气不好。我还能尝试什么?
非常感谢。
您的配置似乎超出了服务器的物理内存界限。m3.xl在物理上只有15G,默认情况下分配给容器的安全内存量为11.5G(http://docs.aws.amazon.com/ElasticMapReduce/latest/ReleaseGuide/emr-hadoop-task-config.html)。
因此,对于m3.xl,您可以将mapreduce.map.java.opts设置为-Xmx9216,mapreduce.map.memory.mb为11520(opts应始终小于总映射内存,通常约为80%)。这些属性会影响映射任务内存大小。如果映射任务需要更多内存来处理较大的文件,则需要使用较大的实例类型。
我建议不要进行其他内存属性更改,除非这些进程特别需要这样的调优。