線上一個Hive(CDH4.2.0)的清洗Job出錯,檢視日志發現其中一個MAP OOME:
<a href="http://blog.itpub.net//resserver.php?blogId=43144&resource=hive1.png" target="_blank"></a>
檢視了日志這個HQL是2個表進行Join,splits=2即開了2個MAP進行分别處理,其中一個大表123MB(<dfs.block.size=128MB),500W行左右,應該是資料量超過了MAP的記憶體了,通過對比前一天的日志可以确認:
<a href="http://blog.itpub.net//resserver.php?blogId=43144&resource=hive%20yesterday.png" target="_blank"></a>
由于是臨時表,設定了mapred.reduce.tasks=20重跑新生成臨時表,Join清洗成功:
<a href="http://blog.itpub.net//resserver.php?blogId=43144&resource=hive2.png" target="_blank"></a>
由于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,如需轉載請自行聯系原作者