Java 运行Hadoop时如何避免OutOfMemoryException?

Java 运行Hadoop时如何避免OutOfMemoryException?,java,hadoop,out-of-memory,Java,Hadoop,Out Of Memory,我正在运行一个超过1.5 TB数据的Hadoop作业,并进行大量的模式匹配。我有好几台机器,每台机器都有16GB的RAM,在这个工作中,我总是用这些数据获得OutOfMemoryException(我使用的是Hive) 我想知道如何在文件HADOOP env.sh中优化设置选项HADOOP\u HEAPSIZE,这样我的工作就不会失败。有没有可能设置这个选项,这样我的工作就不会失败 当我将HADOOP\u HEAPSIZE设置为1,5 GB并从查询中删除一半的模式匹配时,作业成功运行。那么,如果

我正在运行一个超过1.5 TB数据的Hadoop作业,并进行大量的模式匹配。我有好几台机器,每台机器都有16GB的RAM,在这个工作中,我总是用这些数据获得
OutOfMemoryException
(我使用的是Hive)

我想知道如何在文件
HADOOP env.sh
中优化设置选项
HADOOP\u HEAPSIZE
,这样我的工作就不会失败。有没有可能设置这个选项,这样我的工作就不会失败

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


我想对优化设置做更多的实验,但由于这些作业运行时间超过10小时,我想征求您的意见。

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

Max tasks可以在Namenode上设置,也可以在可能具有不同硬件配置的数据节点上覆盖(并设置为最终)。max任务是为映射器和还原器设置的。要计算这个值,它基于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个核)。请注意,这些任务最大值是由CPU完成的,如果您只有1个CPU和1个内核,那么是时候为数据节点获取新硬件或将掩码任务设置为1。如果您有一个CPU,有4个内核,那么将map设置为3并减少为3就好了(为守护进程保存1个内核)

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

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


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

什么让你认为HADOOP\u HEAPSIZE无助于避免失败?根据你的经验,这听起来像是真的。由于只有通过检查数据/作业才能知道的原因,您的情况要求堆的大小至少有这么大。你能重构你的作业,使它不需要这么大的堆吗?我已经修改了我的作业,所以它不使用这么大的堆,但在这个时候我已经更改了HADOOP\u HEAPSIZE。我看不到这个变化的真正结果,我的意思是:为什么把堆设置得小于:我的内存的数量/映射器或还原器的数量?