赞
踩
小文件产生的原因:
1、map数据切分不合理
2、设置过多的reduce
3、动态分区的时候分区数太多
解决方案
1、加大数据切片,这个需要用来处理输入是大量文件的场景
set mapred.max.split.size= 512000000;
set mapred.min.split.size.per.node=128000000;
set mapred.min.split.size.per.rack=128000000;
2、合理设置reduce数量
set mapred.reduce.tasks = 15 --数据比较稳定的情况下可以设定死的reduce task数量
hive.exec.reducers.bytes.per.reducer=500000000 --设定每个reduce的处理数据的大小
3、对于输出合并小文件
set hive.merge.mapfiles = true --在 map only 的任务结束时合并小文件
set hive.merge.mapredfiles=true --在有reduce任务结束时合并小文件
4、动态分区对分区数据进行合并
hive.optimize.sort.dynamic.partition=True
5、对历史表小文件进行合并
5.1、非分区表重建数据
--把数据放在临时表,不直接重写原表,保证安全
create table dmptmp.etl_merge_file_demo_merge_tmp as
select * from dmptmp.etl_merge_file_demo; ---正式表;
set mapred.max.split.size= 512000000;
set mapred.min.split.size.per.node=128000000;
set mapred.min.split.size.per.rack=128000000;
--重写回正式表
insert overwrite table dmptmp.etl_merge_file_demo
select * from dmptmp.etl_merge_file_demo_merge_tmp
;
---确认数据没有问题后删除临时表
drop table if exists dmptmp.etl_merge_file_demo_merge_tmp;
5.2、 分区表重建数据
--把数据放在临时表,不直接重写原表,保证安全
create table dmptmp.etl_merge_file_partition_demo_tmp as
select * from dmptmp.etl_merge_file_partition_demo
;
set mapred.max.split.size= 512000000;
set mapred.min.split.size.per.node=128000000;
set mapred.min.split.size.per.rack=128000000;
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
set hive.exec.max.dynamic.partitions=1000; ---根据实际需要设置
set hive.exec.max.dynamic.partitions.pernode=1000; --根据实际需要设置
--重写回正式表,
--非常例外的情况如果分区数据量极大,建议分批进行合并
insert overwrite table dmptmp.etl_merge_file_partition_demo partition(love)
select
myname
,love
from dmptmp.etl_merge_file_partition_demo_tmp
distribute by ---需要重新分布,不然极大概率出现小文件
love
;
---确认数据没有问题后删除临时表
drop table if eixsts dmptmp.etl_merge_file_partition_demo_tmp
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。