2010-08-01 103 views
14

我在执行大量模式匹配的情况下对1,5 TB数据运行Hadoop作业。我有几台机器,每台都有16GB内存,而且我总是通过这些数据获得OutOfMemoryException这个数据(我正在使用Hive)。如何在运行Hadoop时避免OutOfMemoryException?

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

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

我希望做更多的试验以获得最佳的设置,但由于这些工作需要超过10小时才能运行,所以我在征求您的建议。

+0

什么让你觉得'HADOOP_HEAPSIZE'不*有助于避免失败?听起来像你的经验,它的确如此。由于只能通过检查数据/作业才能知道的原因,您的情况要求堆大小至少是这么大。你可以重构你的工作,以便它不需要这么大的堆? – 2010-08-01 23:29:58

+0

我修改了我的工作,所以它没有使用这么大的堆,但是在这个时候我已经改变了'HADOOP_HEAPSIZE'。我没有看到这个金字塔的真实结果,我的意思是:为什么设置堆比:amount_of_my_RAM/number_of_mappers_or_reducers? – wlk 2010-08-02 07:14:39

回答

13

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

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

最大任务可以在名称节点设置或重写(并设定最终)上可以具有不同的硬件配置的数据节点。最大的任务是为mappers和reducer设置的。要计算它,它基于CPU(内核)和RAM的数量以及您在mapred.child.java.opts中设置的JVM最大值(默认值为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的时间。如果您有1个4核的CPU,则将map设置为3并减少到3会很好(为守护进程节省1个内核)。

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

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

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

相关问题