我正在运行一个超过 1.5 TB 数据的 Hadoop 作业,并进行大量模式匹配。我有几台每台 16GB RAM 的机器,我总是得到OutOfMemoryException
使用这些数据来完成这项工作(我正在使用 Hive)。
我想知道如何最佳设置选项HADOOP_HEAPSIZE
在文件中hadoop-env.sh
这样,我的工作就不会失败。是否有可能设置此选项,这样我的工作就不会失败?
当我设置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/ http://allthingshadoop.com/2010/04/28/map-reduce-tips-tricks-your-first-real-cluster/
最大任务可以在名称节点上设置,也可以在可能具有不同硬件配置的数据节点上覆盖(并设置为最终)。最大任务是为映射器和缩减器设置的。要计算此值,它基于 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 个带有 1 个核心的 CPU,那么这些任务最大值是由您的 CPU 完成的,那么是时候为您的数据节点获取新硬件或将掩码任务设置为 1。如果您有 1 个带有 4 个核心的 CPU,那么是时候了将map设置为3并将reduce设置为3会很好(为守护进程节省1个核心)。
默认情况下只有一个reducer,你需要将mapred.reduce.tasks配置为多个。该值应介于每个节点最大任务数乘以数据节点数的 0.95 到 1.75 之间。因此,如果您有 3 个数据节点,并且设置最大任务数为 7,则将其配置在 25 到 36 之间。
如果您的服务器因 OutOfMemory 问题而崩溃,那么 HADOOP_HEAPSIZE 就只针对进程堆(而不是任务的执行)起作用。
最后,如果您的作业花费了那么长时间,您可以检查是否有另一个好的配置添加是mapred.compress.map.output。将此值设置为 true 应该(压缩时间与传输时间之间的平衡)大大加快减速器复制速度,尤其是在处理大型数据集时。通常工作确实需要时间,但也有一些选项可以进行调整以帮助加快速度=8^)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)