下面的例子跟楼主相似,可以参考,希望有所帮助
~~~~~~~~~~~~~~~~~
合并输入小文件,减少map数?
主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小。
举例:
a) 假设input目录下有1个文件a,大小为780M,那么hadoop会将该文件a分隔成7个块(6个128m的块和1个12m的块),从而产生7个map数
b) 假设input目录下有3个文件a,b,c,大小分别为10m,20m,130m,那么hadoop会分隔成4个块(10m,20m,128m,2m),从而产生4个map数即,如果文件大于块大小(128m),那么会拆分,如果小于块大小,则把该文件当成一个块。
假设一个SQL任务:
Select count(1) from mb_test where date = ‘2015-01-19’ and hour = 0;
该任务的/user/hive/warehouse/naga.db/mb_test/date=2015-01-19/hour=0共有10个文件,每个文件大小为3.15M,远小于128M的小文件,总大小31.5M,正常执行会用10个map任务。
而实际上只生成了一个map任务
set mapred.max.split.size=100000000;
set mapred.min.split.size.per.node=100000000;
setmapred.min.split.size.per.rack=100000000;
sethive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
结论是此处的的合并是逻辑上的合并,而Hive默认已经做了输入合并,我们不需要作过多的设置。
|