原由:node
最近倉庫裏面新建了一張分區表,數據量大約是12億行,分區比較多,從2008年7月開始 一天一個分區。apache
配置了一個任務oop
對這個表進行group by 的時候 發現啓動了2800多個maps .spa
執行的時間也高大10分鐘。orm
而後我在hdfs文件裏面看到 這個表的每一個分區裏面都有20多個小文件,每一個文件都不大 300KB--1MBhadoop
以前的hive的參數:
hive.merge.mapfiles=true
hive.merge.mapredfiles=false
hive.merge.rcfile.block.level=true
hive.merge.size.per.task=256000000
hive.merge.smallfiles.avgsize=16000000input
hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormatit
mapred.max.split.size=256000000
mapred.min.split.size=1
mapred.min.split.size.per.node=1
mapred.min.split.size.per.rack=1io
hive.merge.mapredfiles 這個指的是 在Map-Reduce的任務結束時合併小文件form
解決辦法:
1.修改參數hive.merge.mapredfiles=true
2.經過map_reduece的辦法生成一張新的表 此時生成的文件變成了每一個分區一個文件
再次執行group by 發現效率獲得了大大的提高。
小結:
正確處理hive小文件 是 控制map數的一個重要環節
處理的很差 會大大影響任務的執行效率