hive大量小文件处理方法总结

大量的小文件对namenode产生很大压力,加上最近平台要求清理小文件。下面总结一下工作中用到的小文件方法。
1.参数法(普遍方法,适用于大量map端小文件和reduce后数据量还比较大。比如:日志文件从text格式insert到orc格式)
1.map端参数
set mapred.max.split.size=256000000;//每个Map最大输入大小
set mapred.min.split.size=256000000;//每个Map最小输入大小
set mapred.min.split.size.per.node=100000000;//一个DataNode上总文件至少大小
set mapred.min.split.size.per.rack=100000000;//一个交换机下总文件至少的大小
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;//执行Map前进行小文件合并
set hive.merge.mapfiles = true //设置map端输出进行合并,默认为true
2.reduce端参数
set hive.merge.size.per.task = 256000000//reduce输出文件的大小
set hive.merge.smallfiles.avgsize=16000000//当输出文件的平均大小小于该值时,启动一个独立的MapReduce任务进行文件merge
set hive.merge.mapredfiles = true//设置reduce端输出进行合并,默认为false
3.设置reduce个数(需要SQL有reduce过程)
set mapred.reduce.tasks=5
2.设置表的存储格式为Sequencefile(主要用于统计结果的SQL,reduce量结果比较小)
3.使用HAR归档文件
set hive.archive.enabled=true;
set hive.archive.har.parentdir.settable=true;
set har.partfile.size=2560000000000;
ALTER TABLE table_name ARCHIVE PARTITION (XXX)
4.使用distribute by col(此方法适用那些只有map没有reduce的SQL,特别是hive on spark。)
比如select
time,
id
from page
distribute by rand()//distribute by substr(time,0,5)
注意:
1.在hive上使用则受制于reduce数。最好设置reduce数=分桶数(substr(time,0,5) )
2.在hive on spark使用,最好设置shuffle并发数或者开启SparkSQL自适应执行。hive on spark在map端即使设置hive相应参数也没有作用,task个数依然等于HDFS文件数,除非使用Scala编写程序。对于统计时间周期比较长,则最好使用相应周期的表,比如日统计周期用日表,不要用小时表这样可以减少大量的task。同时该方法只是人为增加reduce过程。
5.在统计结果后再增加一个insert overwrite操作(普遍方法,特别是对于那些统计结果(reduce)产生的小文件效果特别好)
此方法相当于启动一个独立的MapReduce任务进行文件merge。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值