一尘不染

运行Hadoop时如何避免OutOfMemoryException?

java

我正在执行超过1.5
TB数据的Hadoop作业,并进行了大量模式匹配。我有几台机器,每台机器都有16GB的RAM,我总是OutOfMemoryException用这些数据来完成这项工作(我正在使用Hive)。

我想知道如何HADOOP_HEAPSIZE在文件中优化设置选项,hadoop- env.sh所以我的工作不会失败。甚至可以设置此选项以使我的工作不会失败吗?

当我设置HADOOP_HEAPSIZE为1.5
GB并从查询中删除了一半的模式匹配时,作业成功运行。那么,如果该选项不能帮助避免作业失败,那么该选项又有什么用呢?

我想做更多关于最佳设置的实验,但是由于这些工作需要> 10个小时才能运行,因此我正在征求您的建议。


阅读 203

收藏
2020-12-03

共1个答案

一尘不染

作业失败还是服务器崩溃?如果您的作业由于节点上的内存不足而失败,那么您可以减少最大映射数和缩减器的数量,而JVM选择它们的数量,这样就永远不会发生。通常必须根据您的数据节点特定的硬件来增加mapred.child.java.opts(默认值为200Xmx)。

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

可以在Namenode上设置最大任务,也可以在可能具有不同硬件配置的数据节点上覆盖(设置为final)。为映射器和化简器设置了最大任务。要计算此值,它基于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个内核)。请注意,如果您只有1个CPU和1个内核,那么这些最大任务是由CPU完成的,那么现在该为数据节点获取新硬件或将掩码任务设置为1了。

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

如果您的服务器因内存不足问题而崩溃,那么HADOOP_HEAPSIZE就是在其中用于进程堆(而不是任务的执行)的地方。

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

2020-12-03