hive3.x on spark3.0生产调优实践

本文详细介绍了Hive在处理大数据时遇到的数据倾斜问题及解决方案,包括单表和多表Join的优化策略,如Map端聚合、增加Reduce数、拆分倾斜Key和使用MapJoin。此外,还探讨了大数据量性能优化的技巧,如分区表、分桶表、文件存储格式与压缩算法的选择。HQL查询性能方面,提出使用CBO、谓词下推、并行执行等方法。最后,涉及HiveJob的优化,包括map端优化、reduce数设置、并行执行和本地模式。同时,文章也提及了Spark运行参数调优,以提高执行效率。

1 数据倾斜

  • 绝大部分任务都很快完成,只有一个或者少数几个任务执行的很慢甚至最终执行失败,这样的现象为数据倾斜现象。
  • 将数据倾斜分为单表携带了 GroupBy 字段的查询和两表(或者多表)Join 的查询。

1.1 单表数据倾斜优化

1.1.1 Map 端进行聚合 - GroupBy 操作同时聚合函数为 count 或者 sum
set hive.map.aggr = true;
set hive.groupby.mapaggr.checkinterval = 100000;
set hive.groupby.skewindata = true;
# 当选项设定为 true,生成的查询计划会有两个 MR Job。
1.1.2 增加 Reduce 数量(多个 Key 同时导致数据倾斜)
方法1:
set hive.exec.reducers.bytes.per.reducer = 256000000
set hive.exec.reducers.max = 1009
计算 reducer 数的公式
N=min(参数 2,总输入数据量/参数 1)(参数 2 指的是上面的 1009,参数 1 值得是 256M)

方法2:
set mapreduce.job.reduces = 15;

1.2 多表Join 数据倾斜优化

1.2.1 拆分倾斜key
# join 的键对应的记录条数超过这个值则会进行分拆,值根据具体数据量设置
set hive.skewjoin.key=100000;
# 如果是 join 过程出现倾斜应该设置为 true
set hive.optimize.skewjoin=false;
如果开启了,在 Join 过程中 Hive 会将计数超过阈值 hive.skewjoin.key(默认 100000)的倾斜 key 对应的行临时写进文件中,然后再启动另一个 job 做 map join 生成结果。通hive.skewjoin.mapjoin.map.tasks 参数还可以控制第二个 job 的 mapper 数量,默认 10000set hive.skewjoin.mapjoin.map.tasks=10000;
1.2.2 MapJoin
  • MapJoin 是将 Join 双方比较小的表直接分发到各个 Map 进程的内存中,在 Map 进程中进行 Join 操作,这样就不用进行 Reduce 步骤,从而提高了速度。
set hive.auto.convert.join=true; #默认为 true
set hive.mapjoin.smalltable.filesize=25000000;

2 大数据量性能优化

2.1 分区表

  • Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。
  • 分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。
  • 分区表加载数据时,必须指定分区
  • 在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区
  • 创建二级分区
hive (
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值