大数据技术架构(组件)21——Hive:Parameter optimization

1.9、Parameter optimization

1.9.1、Storage

存储层面的调优主要是针对文件压缩,序列化这些方面考虑。避免小文件的产生,同时尽量选用可切分的文件格式和压缩,充分利用算力。

1.9.1.1 Serde

--序列化相关的参数
set hive.script.serde
set hive.script.recordreader
set hive.script.recordwriter
set hive.default.serde

1.9.1.2 IO

1.9.1.3 Compress

1.9.2、Execute

1.9.2.1、设置合理的map和reduce task数量

map的个数取决于input端的文件个数以及大小及文件是否可切分的特性。同时需要结合集群配置的块大小设置。

  1. map数调整

--确定合并文件块大小
--每个map最大输入大小
set mapred.max.split.size=100000000;
set mapred.min.split.size=100000000;
set mapred.min.split.size.per.node=100000000;
set mapred.min.split.size.per.rack=100000000;
--map执行前进行文件合并
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

2、reduce数调整

hive自动推测reduce个数的公式:

N = min(hive.exec.reducers.max,总输入数据量/hive.exec.reducers.bytes.per.reducer)

--直接设置reduce个数
set mapred.reduce.task=?
--每个reduce处理的数据量
set hive.exec.reducers.bytes.per.reducer=?
--每个任务最大的reduce个数
set hive.exec.reducers.max=?

1.9.2.2、sql优化

1.9.2.2.1、列裁剪

1.9.2.2.2、分区裁剪

1.9.2.2.3、谓词下推

1.9.2.2.4、MapJoin使用

当出现一个小表和一个大表关联的时候,需要走MapJoin,这个可以通过参数配置让hive自动抉择是否使用mapjoin。

--设置自动选择mapjoin
set hive.auto.convert.join=true;
--设置大小表的闽值
set hive.mapjoin.smalltable.filesize=250000000;

1.9.2.2.5、使用groupBy代替distinct

要考虑避免出现倾斜的情况

--开启map端聚合
set hive.map.aggr=true;
--map端聚合的记录
set hive.groupby.mapaggr.checkinterval=10000;
--出现倾斜的时候自动进行均衡
set hive.groupby.skewindata=true;

1.9.2.2.6、四个By的选择

sort by: 只能保证分区内有序
distribte by: 只是决定分配到reduce的方式。
cluster by: distribute by + sort by 的结合实现
order by: 全局有序,只能保证有一个reduce用来全局排序

扩展:全局有序的实现
    1、sort by + order by该种实现缓解了只使用order by 产生一个reduce的问题。先通过使用sort by 使得每个分区内部有序,然后再使用order by 对所有的分区进行全排序
    2、sort by + distribute by
    select * from tab
    distribute by (case when age>23 then 1 else 0 end)
    sort by age

1.9.2.2.7、向量化查询

开启向量化功能,可以提高执行效率。批量执行代替单次执行。

set hive.vectorized,execution.enabled=true;
set hive.vectorized.execution.reduce.enabled=true;

1.9.2.2.8、模式选择

1、对于小数据集的处理,可以选择使用本地模式执行。

通过配置参数hive.exec.mode.local.auto=true,由hive自动执行优化。但需要满足以下几个条件:

1、job的输入数据必须小于参数:hive.exec.mode.local.auto.inputbytes.max

2、job的map数必须小于参数:hive.exec.mode.local.auto.tasks.max

3、job对应的reduce数必须为0或者1;

2、另对于一些Fetch抓取任务是没有必要走MR计算的。

设置hive.fetch.task.conversion=more;在全局查找、字段查以及limit查询都不会走mr.

对于其参数值有以下几种:

1、none:禁用该效果,所有的查询都会走mr程序

2、minimal:只在select 、分区列过滤、含有limit的语句上不走mr。也就是说比较简单的select查询是不走mr程序

3、more:相对于minimal效果,select不仅仅是*,还可以单独选择某几列,而且filter也不再限制分区字段,同时支持虚拟列。

1.9.2.2.9、尽量使用相同的连接键

1.9.2.2.10、开启CBO优化

开启该优化功能,可以在逻辑计划优化阶段基于代价分析自动的选择最优的算法。

set hive.cbo.enable=true;
set hive.compute.query.using.stats=true;
set hive.stats.fetch.column.stats=true;
set hive.stats.fetch.partition.stats=true;

1.9.2.3、避免小文件

合并输出参数

是否合并map端输出文件
set hive.merge.mapfiles=true;

--是否合并reduce端输出文件
set hive.merge.mapredfiles=false

--合并文件大小
set hive.merge.size.per.task=256*100*100;

--map执行前进行文件合并
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

--当输出文件平均大小小于设置值时,会启动一个独立的MR任务去合并
set hive.merge.smallfiles.avgsize=1600000

1.9.2.4、JVM复用

通过配置mapred.job.reuse.jvm.num.tasks来设置。

1.9.2.5、并行执行

sql查询会转化为一个或多个阶段。如果某些阶段之间没有依赖关系,那么可以并行执行。

开启并行执行:set hive.exec.parallel=true

设置并行度:set hive.exec.parallel.thread.number=8

1.9.2.6、推测执行

推测执行会对重复执行一些任务,为了保证任务能够尽快的获取数据以及增加job的稳定性,不会因为部分task失败导致任务失败。

set mapred.map.tasks.speculative.execution=true;
set mapred.reduce.tasks.speculative.execution=true;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mylife512

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值