当前位置:   article > 正文

Hadoop Hive小文件合并_小文件合并 hadoop

小文件合并 hadoop

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/727943
推荐阅读
相关标签
  

闽ICP备14008679号