线上一个Hive(CDH4.2.0)的清洗Job出错,查看日志发现其中一个MAP OOME:
查看了日志这个HQL是2个表进行Join,splits=2即开了2个MAP进行分别处理,其中一个大表123MB(<dfs.block.size=128MB),500W行左右,应该是数据量超过了MAP的内存了,通过对比前一天的日志可以确认:
由于是临时表,设置了mapred.reduce.tasks=20重跑新生成临时表,Join清洗成功:
由于MR的inputsplit size=min{minsplitsize,max{maxsplitsize,blocksize}},因此想是否可以通过设置mapred.max.split.size=32MB来起多个MAP这种方式解决呢,尝试后发现仍然是2个MAP;以为是BugMAPREDUCE-2046,但是CDH4.2已经merge进来,看了一圈由于sequencefileinputformat是老的mapreduce api接口,修改一下hive.input.format然后通过设置mapred.map.tasks增加果然起了预期的MAP数;
本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1298637,如需转载请自行联系原作者