登录
首页大数据时代Hadoop数据倾斜产生的原因是什么?如何进行处理?
Hadoop数据倾斜产生的原因是什么?如何进行处理?
2020-07-20
收藏

大数据处理时我们经常会遇到数据倾斜的问题,尤其是在数据量过大时,数据倾斜可能会导致各种各样的问题。Hadoop数据倾斜主要表现为:ruduce阶段卡在99.99%,而且是一直99.99%不能结束。

具体来说就是:mapreduce程序执行时,reduce节点大部分已经执行完毕,但是其中会有一个或者几个reduce节点运行速度很慢,从而使得整个程序的处理时间很长。原因是:某一个key的条数比其他key多出太多,因此这条key所在的reduce节点所处理的数据量就比其他节点就大很多,这也就造成了某几个节点迟迟运行不完。由于Hive是分阶段执行的,map处理数据量的差异,取决于上一个stage的reduce输出,因此将数据均匀的分配到各个reduce中,这一点是解决数据倾斜的关键。

一、Hadoop数据倾斜常见情形

二、Hadoop数据倾斜产生原因

1.Hadoop框架的特性

A、Hadoop不怕数据大,但是怕数据倾斜

B、Jobs 数多的作业运行效率会相对比较低

C、countdistinct、group by、join等操作,触发了Shuffle动作,导致全部相同key的值聚集在一个或几个节点上,很容易发生单点问题。

2.具体原因

A:key 分布不均匀,某一个key的条数比其他key多太多

B:业务数据自带的特性

C:建表时考虑不全面

D:可能某些 HQL 语句自身就存在数据倾斜 问题

三、Hadoop数据倾斜处理

1、从业务和数据方面解决数据倾斜

(1)有损的方法:找到异常数据。

(2)无损的方法:

对分布不均匀的数据,进行单独计算

首先对key做一层hash,把数据打散,让它的并行度变大,之后进行汇集

(3)数据预处理

2、Hadoop平台的解决方法

(1)针对join产生的数据倾斜

A.大表和小表join产生的数据倾斜

a.在多表关联情况下,将小表(关联键记录少的表)依次放到前面,这样能够触发reduce端减少操作次数,从而减少运行时间。

b.同时使用Map Join让小表缓存到内存。在map端完成join过程,这样就能省掉redcue端的工作。需要注意:这一功能使用时,需要开启map-side join的设置属性:set hive.auto.convert.join=true(默认是false)

还可以对使用这个优化的小表的大小进行设置:set hive.mapjoin.smalltable.filesize=25000000(默认值25M)

B.大表和大表的join产生的数据倾斜

a.j将异常值赋一个随机值,以此来分散key,均匀分配给多个reduce去执行

b.如果key值都是有效值的情况下,需要设置以下几个参数来解决

set hive.exec.reducers.bytes.per.reducer = 1000000000

也就是每个节点的reduce,其 默认是处理数据地大小为1G,如果join 操作也产生了数据倾斜,那么就在hive 中设定

set hive.optimize.skewjoin = true;

set hive.skewjoin.key = skew_key_threshold (default = 100000)

(2)group by 造成的数据倾斜

解决方式相对简单:

hive.map.aggr=true  (默认true) 这个配置项代表是否在map端进行聚合,相当于Combiner

hive.groupby.skewindata

(3)count(distinct)或者其他参数不当造成的数据倾斜

A.reduce个数太少

set mapred.reduce.tasks=800

B.HiveQL中包含count(distinct)时

使用sum...group byl来替代。例如select a,sum(1) from (select a, b from t group by a,b) group by a;

数据分析咨询请扫描二维码

最新资讯
更多
客服在线
立即咨询