运行Hadoop时如何避免OutOfMemoryException?

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

我想知道如何在文件hadoop-env.sh最佳地设置选项HADOOP_HEAPSIZE ,所以,我的工作不会失败。 是否可以设置此选项,以便我的工作不会失败?

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

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

作业失败还是服务器崩溃? 如果您的作业由于节点上的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并减少到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 ^)