mapreduce 内存溢出分析

Map端:

===

通常是自己的程序逻辑问题,比如map内部的计算需要大量内存。

Reduce端:

===

map每次只处理一行数据,而reduce每次要处理一个key的集合,如果这个key的集合过大,就会出现oom

比如数据倾斜,或者value对象过大/过多

解决办法:

  1. 增加reduce个数,set mapred.reduce.tasks=300,。

  2. 在hive-site.xml中设置,或者在hive shell里设置 set mapred.child.java.opts = -Xmx512m

    或者只设置reduce的最大heap为2G,并设置垃圾回收器的类型为并行标记回收器,这样可以显著减少GC停顿,但是稍微耗费CPU。

    set mapred.reduce.child.java.opts=-Xmx2g -XX:+UseConcMarkSweepGC;

  3. 使用map join 代替 common join. 可以set hive.auto.convert.join = true

  4. 设置 hive.optimize.skewjoin = true 来解决数据倾斜问题

Driver提交job阶段:

mr扫描分区表时,会把分区的hdfs路径封装为path对象,如果这些对象太多,就会在提交阶段oom

参考文献

http://blog.csdn.net/oopsoom/article/details/41356251
http://dj1211.com/?p=358
https://www.mapr.com/blog/how-to-avoid-java-heap-space-errors-understanding-and-managing-task-attempt-memory


本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:http://thousandhu.github.io/2016/01/21/mapreduce-内存溢出分析/