分享

小文件特别多,job数很多,怎么优化

zeus_lhl 发表于 2016-9-5 12:33:44 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 9 24783
日志源文件很小(每个只有几M甚至几十M,来自第三方),但数量很多,下载下来以后,每次加载一个文件到hive表里。从加载到最后计算出结果,特别耗时,有时候一天的数据,就要跑半天甚至一天,job数有几千个。其实总的数据量并不大,这种情况怎么去优化?
谢谢大家

本帖被以下淘专辑推荐:

已有(10)人评论

跳转到指定楼层
hx252502115 发表于 2016-9-5 14:35:46
可以考虑下顺序文件
回复

使用道具 举报

qcbb001 发表于 2016-9-5 15:35:57
楼主可以尝试合并小文件,启用压缩,然后减少map数目,下面内容,楼主可以参考配置
启动压缩
set hive.exec.compress.output=true;
set mapreduce.output.fileoutputformat.compress=true;



一.减少map数,(当有大量小文件时,启动合并)
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
set mapreduce.input.fileinputformat.split.maxsize=1073741824;
set mapreduce.input.fileinputformat.split.minsize=1;
set mapreduce.input.fileinputformat.split.minsize.per.node=536870912;
set mapreduce.input.fileinputformat.split.minsize.per.rack=536870912;

经过测试,这种设置可以在map阶段和并小文件,减少map的数量。
注意:在测试的时候,如果文件格式为Textfile,并且启用lzo压缩,不能生效。 rcfile以及orc可以生效,Textfile不启用lzo压缩也可以生效。如果是新集群的话,没有历史遗留的问题的话,建议hive都使用orc文件格式,以及启用lzo压缩。


二.MR作业结束后,判断生成文件的平均大小,如果小于阀值,就再启动一个job来合并文件
set hive.merge.mapredfiles=true;
set hive.merge.mapfiles=true;
set hive.merge.smallfiles.avgsize=268435456;


点评

能帮忙解释下orc和parquet的区别吗?适用于什么场景?  发表于 2020-1-9 18:07
回复

使用道具 举报

qcbb001 发表于 2016-9-5 15:39:29
可以对JOB优化,在本地执行

默认关闭了本地执行模式,小数据可以使用本地执行模式,加快执行速度。
相关参数设置:
hive.exec.mode.local.auto=true

默认本地执行的条件是,hive.exec.mode.local.auto.inputbytes.max=128MB, hive.exec.mode.local.auto.tasks.max=4,reduce task最多1个。


回复

使用道具 举报

zeus_lhl 发表于 2016-9-5 18:45:39
qcbb001 发表于 2016-9-5 15:35
楼主可以尝试合并小文件,启用压缩,然后减少map数目,下面内容,楼主可以参考配置

加载文件时候不能合并吧

回复

使用道具 举报

arsenduan 发表于 2016-9-6 16:44:41
zeus_lhl 发表于 2016-9-5 18:45
加载文件时候不能合并吧

下面的例子跟楼主相似,可以参考,希望有所帮助
~~~~~~~~~~~~~~~~~
合并输入小文件,减少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默认已经做了输入合并,我们不需要作过多的设置。

回复

使用道具 举报

xingoo 发表于 2016-9-7 22:57:22
arsenduan 发表于 2016-9-6 16:44
下面的例子跟楼主相似,可以参考,希望有所帮助
~~~~~~~~~~~~~~~~~
合并输入小文件,减少map数?

hive是怎么做的合并?会从逻辑上把小文件合并成128M的大文件么、
回复

使用道具 举报

xingoo 发表于 2016-9-7 22:58:37
arsenduan 发表于 2016-9-6 16:44
下面的例子跟楼主相似,可以参考,希望有所帮助
~~~~~~~~~~~~~~~~~
合并输入小文件,减少map数?

比如我有三个文件,每个是50M。那么会把前两个分给一个map,然后第三个分给一个map,这样创建出两个map来执行么?
回复

使用道具 举报

ledasion 发表于 2017-2-7 15:34:34
map 逻辑合并小文件的时候,是将几个小的文件加载到一个 map 里 进行处理,这样可以较少 map 数,实现一种 小文件物理合并的假象。。
回复

使用道具 举报

erbin 发表于 2017-3-20 17:59:19
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条