5步避免Java堆空间错误

牢记以下五个步骤可以为你减少很多头痛的问题并且避免Java堆空间错误。

本文由 ImportNew –
光光头去打酱油 翻译自
mapr。欢迎加入翻译小组。转载请见文末要求。

  1. 通过计算预期的内存消耗。
  2. 检查JVM是否有足够的可用空间。
  3. 检查JVM的设置是否正确。
  4. 限制节点使用交换空间和内存分页。
  5. 设置实例slot数量小于JobTracker web GUI计算的数值。

牢记以下五个步骤可以为你减少很多头痛的问题并且避免Java堆空间错误。

译者注:slot
:slot不是CPU的Core,也不是memory
chip,它是一个逻辑概念,一个节点的slot的数量用来表示某个节点的资源的容量或者说是能力的大小,因而slot是
Hadoop的资源单位。详见这里。

  1. 通过计算预期的内存消耗。
  2. 检查JVM是否有足够的可用空间。
  3. 检查JVM的设置是否正确。
  4. 限制节点使用交换空间和内存分页。
  5. 设置实例slot数量小于JobTracker web GUI计算的数值。

在这篇博文里,我将详细讲解每个步骤,帮助大家更好地理解并正确管理实例(task
attempt)内存。

译者注:slot
 :slot不是CPU的Core,也不是memory
chip,它是一个逻辑概念,一个节点的slot的数量用来表示某个节点的资源的容量或者说是能力的大小,因而slot是
Hadoop的资源单位。详见这里。

译者注:实例(task attempt)
:这个词在官方文档中找到了解释:
“Each task attempt is one particular instance of a Map or Reduce Task
identified by its TaskID”。

在这篇博文里,我将详细讲解每个步骤,帮助大家更好地理解并正确管理实例(task
attempt)内存。

理解怎样管理实例内存是很重要的,这样可以避免Java堆空间错误。当运行
map/reduce 作业(Job)时,你可能会看到实例出现这样的错误:

译者注:实例(task attempt)
:这个词在官方文档中找到了解释:
“Each task attempt is one particular instance of a Map or Reduce Task
identified by its TaskID”。

13/09/20 08:50:56 INFO mapred.JobClient: Task Id : attempt_201309200652_0003_m_000000_0, Status : FAILED on node node1
Error: Java heap space

理解怎样管理实例内存是很重要的,这样可以避免Java堆空间错误。当运行
map/reduce 作业(Job)时,你可能会看到实例出现这样的错误:

当试图申请一个超过Java虚拟机(JVM)设置的最大内存限制时就会发生这个错误。

13/09/20 08:50:56 INFO mapred.JobClient: Task Id : attempt_201309200652_0003_m_000000_0, Status : FAILED on node node1
Error: Java heap space

避免Java堆空间错误的第一步是了解你的map和reduce任务的内存需求,以便于你启动一个JVM时设置了适当内存限制。

当试图申请一个超过Java虚拟机(JVM)设置的最大内存限制时就会发生这个错误。

例如,hadoop-0.20.2-dev-examples.jar中的wordcount 功能。
不管处理什么数据,map
任务都不需要很多内存。唯一需要很多内存的就是在加载运行所需的函数库的时候。当使用默认附带MapR包的wordcount功能时,512MB的内存对于实例JVM是绰绰有余了。如果你打算运行我们提供的Hadoop示例,可以尝试将map实例JVM的内存限制设为512MB。

避免Java堆空间错误的第一步是了解你的map和reduce任务的内存需求,以便于你启动一个JVM时设置了适当内存限制。

如果你知道自己的map实例需要多少内存(在本例中是512MB),
那么下一步启动设置好JVM内存。该实例在JVM中的内存是由TaskTracker为Map/Reduce作业处理数据而设定的。
TaskTracker设定的限制可能有两个来源:要么是用户提交作业时指定了内存大小作为该作业配置对象的一部分,或者是TaskTracker产生了
默认内存大小的JVM。

例如,hadoop-0.20.2-dev-examples.jar中的wordcount 功能。
不管处理什么数据,map
任务都不需要很多内存。唯一需要很多内存的就是在加载运行所需的函数库的时候。当使用默认附带MapR包的wordcount功能时,512MB的内存对于实例JVM是绰绰有余了。如果你打算运行我们提供的Hadoop示例,可以尝试将map实例JVM的内存限制设为512MB。

mapred.map.child.java.opts属性被用来为TaskTracker
启动JVM和执行map任务的参数(在reduce任务中也有个类似的属性)。如果mapred.map.child.java.opts属性被设置成“-Xmx512m”,那么map实例JVMs会有512MB的内存限制。相反的,如果-Xmx没有通过配置属性去指定一个数值的话,那么
每个TaskTracker将会为启动JVM计算一个默认的内存限制。该限制是基于TaskTracker为map/reduce
task
slot分配的数量所决定的,并且TaskTracker分配给Map/Reduce总内存不能超过系统限制。

如果你知道自己的map实例需要多少内存(在本例中是512MB),
那么下一步启动设置好JVM内存。该实例在JVM中的内存是由TaskTracker为Map/Reduce作业处理数据而设定的。
TaskTracker设定的限制可能有两个来源:要么是用户提交作业时指定了内存大小作为该作业配置对象的一部分,或者是TaskTracker产生了
默认内存大小的JVM。

TaskTracker为map/reduce实例分配的slot数量在TaskTracker启动时就设定好了。通过每个节点上mapred-site.xml文件中两个参数进行控制的:

mapred.map.child.java.opts属性被用来为TaskTracker 启动JVM和执行map任务的参数(在reduce任务中也有个类似的属性)。如果mapred.map.child.java.opts属性被设置成“-Xmx512m”,那么map实例JVMs会有512MB的内存限制。相反的,如果-Xmx没有通过配置属性去指定一个数值的话,那么
每个TaskTracker将会为启动JVM计算一个默认的内存限制。该限制是基于TaskTracker为map/reduce
task
slot分配的数量所决定的,并且TaskTracker分配给Map/Reduce总内存不能超过系统限制。

mapred.tasktracker.map.tasks.maximum
mapred.tasktracker.reduce.tasks.maximum

TaskTracker为map/reduce实例分配的slot数量在TaskTracker启动时就设定好了。通过每个节点上mapred-site.xml文件中两个参数进行控制的:

设置这些默认值的规则是基于节点上CPU核心的数量。不过你可以下面两个方法来重载参数:

mapred.tasktracker.map.tasks.maximum
mapred.tasktracker.reduce.tasks.maximum
  1. 修改mapred-site.xml文件设定一个固定的slots数值。
  2. 使用自定义规则。

设置这些默认值的规则是基于节点上CPU核心的数量。不过你可以下面两个方法来重载参数:

在系统中,TaskTracker
map/reduce实例内存限制是在TaskTracker进程启动时设定的。有两个地方可以设置内存限制。首先在Hadoop
conf目录下的hadoop-env.sh脚本中可以显式的设置,你可以添加下面这行来指定内存限制:

  1. 澳门新葡亰3522平台游戏,修改mapred-site.xml文件设定一个固定的slots数值。
  2. 使用自定义规则。
export HADOOP_HEAPSIZE=2000

在系统中,TaskTracker 
map/reduce实例内存限制是在TaskTracker进程启动时设定的。有两个地方可以设置内存限制。首先在Hadoop
conf目录下的hadoop-env.sh脚本中可以显式的设置,你可以添加下面这行来指定内存限制: