运行Hadoop时如何避免OutOfMemoryException?

时间:2010-08-01 19:22:16

标签: java hadoop out-of-memory

我正在通过大量模式匹配运行超过1.5 TB数据的Hadoop作业。我有几台机器,每台机器有16GB RAM,我总是通过这些数据得到OutOfMemoryException(我正在使用Hive)。

我想知道如何在文件HADOOP_HEAPSIZE中最佳地设置选项hadoop-env.sh,这样,我的工作就不会失败。甚至可以设置此选项,以便我的工作不会失败吗?

当我将HADOOP_HEAPSIZE设置为1.5 GB并从查询中删除了一半模式匹配时,作业成功运行。那么这个选项是什么,如果它无助于避免失败?

我打算做更多的优化设置试验,但由于这些工作需要> 10小时才能运行,我会征求您的意见。

1 个答案:

答案 0 :(得分:13)

作业失败或服务器崩溃了吗?如果您的作业由于节点上的OutOfMemmory而失败,您可以调整最大映射和缩减器的数量以及JVM的每个选项,以便永远不会发生。 mapred.child.java.opts(默认值为200Xmx)通常必须根据您的数据节点特定硬件进行增加。

http://allthingshadoop.com/2010/04/28/map-reduce-tips-tricks-your-first-real-cluster/

可以在Namenode上设置最大任务,或者在可能具有不同硬件配置的数据节点上覆盖(并设置最终)最大任务。为映射器和减速器设置最大任务。要计算它,它基于CPU(核心)和您拥有的RAM量以及您在mapred.child.java.opts中设置的JVM max(默认值为200)。 Datanode和Tasktracker都设置为1GB,因此对于8GB机器,mapred.tasktracker.map.tasks.maximum可以设置为7,mapred.tasktracker.reduce.tasks.maximum设置为7,使用mapred.child.java .opts设置为-400Xmx(假设8个核心)。请注意,如果您的CPU只有1个CPU,那么这些任务最大值由CPU完成,那么是时候为您的数据节点获取新硬件或将屏蔽任务设置为1.如果您有1个CPU,其中包含4个内核将map设置为3并将reduce设置为3会很好(为守护进程保存1个核心)。

默认情况下,只有一个reducer,您需要将mapred.reduce.tasks配置为多个。此值应介于每个节点的最大任务数乘以数据节点数的0.95和1.75倍之间。因此,如果您有3个数据节点,并且设置最大任务数为7,则将其配置为25到36之间。

如果您的服务器因OutOfMemory问题而崩溃,那么HADOOP_HEAPSIZE只是针对进程堆(而不是执行任务)而来的。

最后,如果您的Job花了这么长时间,您可以检查是否有另外一个好的配置添加是mapred.compress.map.output。将此值设置为true应该(压缩与传输的时间之间的平衡)大大加快Reducer复制速度,尤其是在处理大型数据集时。通常工作确实需要时间,但也有一些选项可以调整以帮助加快速度= 8 ^)