大量的小文件对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。

技术
©2019-2020 Toolsou All rights reserved,
车主无忧:为什么放弃开源Kafka?必传之作!Alibaba内部出品Redis深度笔记及源码宝典统信UOS首次公布软件适配:QQ、微信、迅雷都有了阿里开发10年技术核心总结,Springboot+Redis文档,送给努力上进的程序员python画爱心Docker容器数据卷详解(共享数据)为何华为的5G专利高居第一名,却还被高通要求缴纳专利费?Spring循环依赖三级缓存是否可以减少为二级缓存?C#中字典的排序方法面试还不会Spring?阿里P8总结的100道面试解析,让你实锤面试官