Hadoop Hive小文件合并

本文介绍了Hive中产生小文件的原因,如数据切分不合理、reduce数量过多等,并提供了相应的解决方案,包括调整split大小、设置合理的reduce任务数、合并输出文件和动态分区的合并策略。还详细讲解了非分区表和分区表重建数据时的小文件合并方法。
摘要由CSDN通过智能技术生成

小文件产生的原因:
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

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值