在运行Hadoop时如何避免OutOfMemoryException?

2022-09-04 03:27:40

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

我想知道如何在文件中以最佳方式设置选项,以便我的工作不会失败。是否有可能设置此选项,以便我的作业不会失败?HADOOP_HEAPSIZEhadoop-env.sh

当我设置为 1,5 GB 并从查询中删除一半的模式匹配时,作业运行成功。那么,如果此选项无助于避免作业失败,那么它有什么用呢?HADOOP_HEAPSIZE

我打算做更多的优化设置实验,但由于这些工作需要>10小时才能运行,所以我正在征求您的建议。


答案 1

作业是否失败或服务器崩溃?如果你的作业因为节点上的 OutOfMemmory 而失败,你可以调整你的最大映射和化简器的数量,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.max设置为7,mapred.child.java.opts设置为-400Xmx(假设有8个内核)。请注意,如果您只有1个CPU和1个内核,那么这些任务最大值由您的CPU完成,那么现在是时候为数据节点获取新硬件或将掩码任务设置为1了。如果你有1个CPU和4个核心,那么将map设置为3并减少到3会很好(为守护程序节省1个核心)。

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

如果您的服务器因 OutOfMemory 问题而崩溃,那么这就是HADOOP_HEAPSIZE仅针对进程堆(而不是任务的执行)而出现的地方。

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


答案 2

推荐