Map端:
===
通常是自己的程序逻辑问题,比如map内部的计算需要大量内存。
Reduce端:
===
map每次只处理一行数据,而reduce每次要处理一个key的集合,如果这个key的集合过大,就会出现oom
比如数据倾斜,或者value对象过大/过多
解决办法:
增加reduce个数,set mapred.reduce.tasks=300,。
在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;
使用map join 代替 common join. 可以set hive.auto.convert.join = true
设置 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-内存溢出分析/