Hive的数据倾斜及优化

本文探讨了Hive中的数据倾斜问题,特别是在group by、reduce join和count(distinct)场景下。提出了优化方案,包括模型设计、避免数据倾斜、减少job数、设置合理task数、小文件合并、优化reducetask个数、合理设计分桶和分区,以及高效使用join和group by。同时强调了mapjoin的使用和文件存储格式选择的重要性。
摘要由CSDN通过智能技术生成


hive不怕数据多,就怕数据倾斜。

1. 数据倾斜

hive容易产生数据倾斜的场景:
1)group by 不和聚合函数一起使用
2)reduce join
3) count(distinct )

2.hive的优化:

1 好的模型设计
2 解决数据倾斜
在map端进行join,减少reducetask数据量
聚合函数和group by结合使用
null值不参与连接
3 减少job数
4 设置合理的map reduce的task数,手动指定一般不超过datanode的95%
5 对小文件进行合并,减少maptask
6 单个作业最优不如整体最优

1)排序的选择:

order by   性能比较低的
sort by   局部排序
distribute by   分桶|分区
cluster by    分+排序

2)尽量避免使用笛卡尔积

hive 笛卡尔积是没有关联建的关联  转换为MR的时候  mapkey
	select * from a,b; select * from a join b;
	若需求中必须做笛卡尔积,最好自己设定一个关联建
		表1:1000万 条数据
		表2:20万   条数据    1-1000
		1)对小表额外添加一个建  作为关联使用的建  随机产生
		大表进行复制操作    小表有多少个不同的关联建   大表就复制多少份  大表的每一个复本的关联建就是小表中其中一个数据的关联建
		2)大表随机生成一个关联建
		小表进行复制   大表的不同的关联建的份数
		第二种方式更加合理
			1)reducetask的并行度高  分区数量更多
			2)每一个reducetask中数据量不是太大
		select cast(rabd()*1000 as int),* from stu;

3)使用join替代in/exists

	hive 1.2.1  1.2.2   不支持
	hive 2.3.2 支持   但是性能低  mapkey
	select * from stu where age in(18,20,30,34);
	mapkey  null  value:表的所有数据
	
高效替代方案:
		left semi join
		inner join 

4)多重查询| 数据插入

能使用多重查询  不使用单重查询
数据插入:能使用多重插入    不使用单重插入
减少对表的扫描次数  提升性能的
	from 表
	insert into table ... where 
	insert into ......

使用multi group by࿱

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值