hive常用参数优化及说明

本文详细介绍了Hive的性能优化策略,包括开启任务并行执行、小文件合并、动态分区处理、普通join转为mapjoin等技巧,以及关键参数如hive.exec.parallel、hive.merge.mapfiles的设置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hive常用参数优化及说明

一、常用参数优化

  1. 开启任务并行执行
    set hive.exec.parallel=true;

  2. 同一个sql允许并行任务的最大线程数
    set hive.exec.parallel.thread.number=8;

  3. 若读取小文件较多,则设置在map端进行小文件合并参数
    set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
    set hive.hadoop.supports.splittable.combineinputformat = true;
    set mapreduce.input.fileinputformat.split.maxsize = 256000000;
    set mapreduce.input.fileinputformat.split.minsize.per.node=256000000;
    set mapreduce.input.fileinputformat.split.minsize.per.rack=256000000;

  4. 配置MR任务结束后进行文件合并
    在只有map的作业结束时合并小文件,默认开启true:
    set hive.merge.mapfiles = true;
    在一个map/reduce作业结束后合并小文件,默认不开启false:
    set hive.merge.mapredfiles = true;
    作业结束时合并文件的大小,默认256MB
    set hive.merge.size.per.task = 256000000;
    在作业输出文件小于该值时,起一个额外的map/reduce作业将小文件合并为大文件,小文件的基本阈值,设置大点可以减少小文件个数,需要mapfiles和mapredfiles为true,默认值是16MB:
    set hive.merge.smallfiles.avgsize=256000000;

  5. 动态分区无Reduce产生小文件处理
    在设置动态分区后,map数量:m,分区数量:n,中间会产生m*n个文件。大多数情况下,我们想让大部分数据在一个reduce中处理,但是有些hql不会产生reduce,这时,我们可以使用distribute by rand()的方式保证数据进行一次reduce操作,实现文件的合并:
    两种处理方式参数设置如下:
    1) 设置reduce个数:
    set mapred.reduce.tasks=50;
    insert into table tableA
    select
    *
    from
    tableB
    distribute by rand();
    注解:set设置的是最终生成的文件个数,distribute by rand()能够保证数据随机分配到50个文件中。

    2) 设置每个reducer处理的数据

    set hive.exec.reducers.bytes.per.reducer=2560000000;
    insert into table tableA
    select
    	   *
    from
    tableB
    distribute by rand();
    注解:set设置的输出每个文件大小,distribute by rand()保证数据的平均大小是256Mb。
    
  6. 普通join转化为mapjoin(适用于大表关联小表)
    set hive.auto.convert.join=true;

二、常用参数说明
7. hive.exec.compress.output:
控制hive的查询结果输出是否进行压缩,压缩方式在hadoop的mapred.output.compress中配置,默认不压缩false;一个查询的最后一个map/reduce任务输出是否被压缩的标志,默认为false,但是一般会开启为true,好处的话,节省空间不说,在不考虑cpu压力的时候会提高io。使用方式:
set mapred.output.compress=true;
set hive.exec.compress.output=true;
8. hive.exec.dynamic.partition:是否支持动态分区,默认false;
hive.exec.dynamic.partition.mode:默认strict,在strict模式下,动态分区的使用必须在一个静态分区确认的情况下,其他分区可以是动态;
hive.exec.max.dynamic.partitions:动态分区的上限,默认1000;
hive.exec.max.dynamic.partitions.pernode:每个mapper/reducer节点可以创建的最大动态分区数,默认100;
9. hive.exec.reducers.bytes.per.reducer:
每个reducer的大小,默认是1G,输入文件如果是10G,那么就会起10个reducer;
10. hive.groupby.skewindata:
group by操作是否允许数据倾斜,默认是false,当设置为true时,执行计划会生成两个map/reduce作业,第一个MR中会将map的结果随机分布到reduce中,达到负载均衡的目的来解决数据倾斜
11. map个数控制及性能调优,请参考另一个老哥的
https://blog.youkuaiyun.com/qq_26442553/article/details/99438121

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值