1 优化说明
小文件优化可以从两个方面解决,在Map端输入的小文件合并,在Reduce端输出的小文件合并。
1.1 Map端输入文件合并
合并Map端输入的小文件是指将多个小文件分到同一个切片中,由一个Map Task处理,防止单个小文件启动一个Map Task,造成资源浪费。
相关参数:
--将多个小文件切片合成一个切片,由一个map task处理
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
1.2 Reduce输出文件合并
合并Reduce端输出的小文件是指将多个小文件合并成大文件,减少HDFS小文件数量。
原理:
根据计算任务输出文件的平均大小判断,若符合条件则单独启动一个额外的任务进行合并。
相关参数:
--开启合并map only任务输出的小文件,针对只有map的计算任务
set hive.merge.mapfiles=true;
--开启合并map reduce任务输出的小文件
set hive.merge.mapredfiles=true;
--合并后的文件大小
set hive.merge.size.per.task=256000000;
--触发小文件合并任务的阈值,若某计算任务输出的文件平均大小低于该值,则触发合并
set hive.merge.smallfiles.avgsize=16000000;
2 案例
1、示例SQL语句
--计算各省份订单金额总和,下表为结果表
drop table if exists order_amount_by_province;
create table order_amount_by_province(
provonce_id string comment '省份id',
order_amount decimal(16,2) comment '订单金额'
)
location '/order_amount_by_province';
insert overwrite table order_amount_by_province
select
province_id,
sum(total_amount)
from order_detail
group by province_id;
2、优化前
根据任务并行度,在默认情况下,该sql语句的Reduce端并行度为5,所以最终输出的文件个数也为5,且均为小文件。
3、优化思路
方案一、合理设置任务的Reduce端并行度
将任务并行度设置为1,保证输出结果为1个文件。文章来源:https://www.toymoban.com/news/detail-635984.html
set mapreduce.job.reduces=1;
方案二、启用HIve合并小文件进行优化
设置参数:文章来源地址https://www.toymoban.com/news/detail-635984.html
--开启合并map reduce任务输出的小文件
set hive.merge.mapredfiles=true;
--合并后的文件大小
set hive.merge.size.per.task=256000000;
--触发小文件合并任务的阈值,若某计算任务输出的文件平均大小低于该值,则触发合并
set hive.merge.smallfiles.avgsize=16000000;
到了这里,关于【大数据之Hive】二十五、HQL语法优化之小文件合并的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!