因为设置上面四个参数,看上去规定了map结束,MR结束合并文件,如果文件平均小于smallfiles.avgsize启动一个新的MRj进行文件的二次合并 。如果启动mr合并文件,没有问题 。0.背景近来我们公司搞小文件治理(小于10Mb),小文件太多的危害就不此赘述了 。公司的开发人员提供的合并小文件治理配置如下:
-- 设置小文件合并set hive.merge.mapfiles=true;set hive.merge.mapredfiles=true;set hive.merge.size.per.task = 256000000 ;set hive.merge.smallfiles.avgsize= 256000000 ;
看上去配置的没啥问题,不管是Map-only,还是MapReduce都考虑到了,只要输出的文件小于这个值,就重新启动一个MR去执行文件合并 。看也符合Hive官网的配置解释
文章插图
然而现实并非如此,废话不多说,you can you code,no can no bb.
原分析表数据在HDFS存储为551个小文件,下面所有的测试都是基于这个文件 。
文章插图
1.测试代码方案1设置启动map前文件合并,先使用官方默认配置,实现文件合并测试
sethive.input.format = org.Apache.hadoop.hive.ql.io.CombineHiveInputFormat; --官方默认值,也是当前平台默认值sethive.merge.smallfiles.avgsize=16000000;--官方默认值,也是当前平台默认值sethive.merge.size.per.task=256000000;--官方默认值,也是当前平台默认值sethive.merge.mapfiles=true ;--官方默认值,也是当前平台默认值sethive.merge.mapredfiles = true ;--官方默认值,也是当前平台默认值drop table if exists FDM_SOR.T_FSA_BHVR_NEW_EXPO_D_tmp_tmp;create table FDM_SOR.t_fsa_bhvr_new_expo_d_tmp_tmpstored as orc as select *from FDM_SOR.t_fsa_bhvr_new_expo_d where stat_date = '20200630'
结果:只产生了438个文件,看样子效果不错,文件变少了,但是发现还是有很多小于16Mb的文件,为啥设置了不管用呢,是不是sethive.merge.smallfiles.avgsize官方的默认值给的太小了 。需要加大 。看实验2.
文章插图
文章插图
【大多数开发人员都弄错的Hive与MapReduce小文件合并问题】
2.测试代码方案2设置启动map前文件合并,将set
hive.merge.smallfiles.avgsize值加大,增加文件合并的Size 。按照官方的说法当输出的文件平均小于16Mb时系统会再启动一个MR进行文件合并 。这下该管用了吧,请看:
sethive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; --官方默认值,也是当前平台默认值sethive.merge.smallfiles.avgsize=256000000;--改了这个值,由默认的16Mb,改成256Mbsethive.merge.size.per.task=256000000;--官方默认值,也是当前平台默认值sethive.merge.mapfiles=true ;--官方默认值,也是当前平台默认值sethive.merge.mapredfiles = true ;--官方默认值,也是当前平台默认值drop table if exists FDM_SOR.T_FSA_BHVR_NEW_EXPO_D_tmp_tmp;create table FDM_SOR.t_fsa_bhvr_new_expo_d_tmp_tmpstored as orc as select *from FDM_SOR.t_fsa_bhvr_new_expo_d where stat_date = '20200630'
废话不多说,上结果请看文章插图
文章插图
结果分析:没错,第一次MR因为Comb.NEText启动了438个map和上面一样,果然接着又启动了一个MR,进行输出后的文件合并 。看样子很DIAO 。合并要求文件大小不小256Mb,然后实际呢?pAppa 。文件虽然减少了很多到351个,但依然有很多小文件,很多小于10Mb的文件,这个时候心里肯定一句
3.测试代码方案3放大招,功夫有没有,代码走一走,加上split参数
set mapred.max.split.size=256000000;set mapred.min.split.size.per.node=100000000;set mapred.min.split.size.per.rack=100000000;set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;set hive.merge.mapfiles = true ;set hive.merge.mapredfiles = true ;set hive.merge.size.per.task = 256000000 ;set hive.merge.smallfiles.avgsize=160000000 ;drop table if exists FDM_SOR.T_FSA_BHVR_NEW_EXPO_D_tmp_tmp;create table FDM_SOR.T_FSA_BHVR_NEW_EXPO_D_tmp_tmpstored as orc as select *from FDM_SOR.T_FSA_BHVR_NEW_EXPO_D where stat_date = '20200630'
推荐阅读
- MySQL函数索引及优化
- 小买卖补单平台 “大生意合伙做,小买卖自己干”为什么绝大多数人理解不了?
- ERP软件系统二次开发的注意事项 软件二次开发
- 高叶|陈乔恩和老公在马来西亚看舞狮,被工作人员认出,挨个合影有亲和力
- 如何培训销售人员? 销售人员培训方案
- 软件开发企业的税收筹划方案 税务规划方案
- 退休人员的工龄满30年,不幸离世后,领取的丧葬费和抚恤金更多?
- 为什么 JavaScript 在国外逐渐用于前端+后端开发,而国内还是只用它做前端?
- 分享9个前端开发人员必备的查询手册工具网站
- 杨紫琼|杨紫琼“美国退休人员协会电影奖”再封影后