08-hive优化

(1)小表大表join(MapJoin)
如果不指定MapJoin或者不符合MapJoin的条件,那么Hive解析器会将join操作转换成Common Join,即:在reduce阶段完成join。容易发生数据倾斜。可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理
实际测试发现:新版的hive已经对小表JOIN大表和大表JOIN小表进行了优化。小表放在左边和右边已经没有明显区别
MapJoin通常用于一个很小的表和一个大表进行join的场景,具体小表有多小,由参数hive.mapjoin.smalltable.filesize来决定,该参数表示小表的总大小,默认值为25000000字节,即25M
Hive0.7之前,需要使用hint提示 /*+ mapjoin(table) */才会执行MapJoin,否则执行Common Join,但在0.7版本之后,默认自动会转换Map Join,由参数hive.auto.convert.join来控制,默认为true
总结:
①设置自动选择MapJoin
set hive.auto.convert.join = true; 默认为true
②大表小表的阈值设置(默认25M一下认为是小表):
set hive.mapjoin.smalltable.filesize=25000000;

(2)行列过滤
列处理:在SELECT中,只拿需要的列,如果有,尽量使用分区过滤,少用select *
行处理:在分区剪裁中,当使用外关联时,如果将副表的过滤条件写在where后面,那么就会先全表关联,之后再过滤

(3)列式存储
(4)采用分区技术

(5)合理设置map数
mapred.min.split.size:指的是数据的最小分割单元大小;min的默认值是1B
mapred.max.split.size:指的是数据的最大分割单元大小;max的默认值是256MB
通过调整max可以起到调整map数的作用,减小max可以增加map数,增大max可以减少map数
需要提醒的是,直接调整mapred.map.tasks这个参数是没有效果的。
https://www.cnblogs.com/swordfall/p/11037539.html

(6)合理设置reduce数
reduce个数并不是越多越好
①过多的启动和初始化reduce也会消耗时间和资源
②另外,有多少个reduce,就会有多少个输出文件,如果生成了很多个小文件,那么如果这些小文件作为下一个任务的输入,则也会出现小文件过多的问题
在设置reduce个数的时候也需要考虑这两个原则:处理大数据量利用合适的reduce个数,使单个reduce任务处理数据量大小要合适

(7)小文件如何产生的?
①动态分区插入数据,产生大量的小文件,从而导致map数量剧增
②reduce数量越多,小文件也越多(reduce的个数和输出文件是对应的)
③数据源本身就包含大量的小文件

(8)小文件解决方案
①在map端执行前合并小文件,减少map个数:CombineHiveInputFormat具有对小文件进行合并的功能(系统默认的格式)。HiveInputFormat没有对小文件合并功能
②merge
输出合并小文件
在这里插入图片描述
③开启JVM重用
在这里插入图片描述
(9)开启map端combiner(不影响最终业务逻辑)
在这里插入图片描述
(10)压缩(选择快的)
设置map端输出、中间结果压缩。(不完全是解决数据倾斜的问题,但是减少了IO读写和网络传输,能提高很多效率)
在这里插入图片描述
(11)使用tez或者spark引擎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值