spark中的数据倾斜的现象

spark中的数据倾斜的现象、原因、后果
(1)、数据倾斜的现象
多数task执行速度较快,少数task执行时间非常长,或者等待很长时间后提示你内存不足,执行失败。
(2)、数据倾斜的原因
数据问题
1、key本身分布不均衡(包括大量的key为空)
2、key的设置不合理
spark使用问题
1、shuffle时的并发度不够
2、计算方式有误
(3)、数据倾斜的后果
1、spark中的stage的执行时间受限于最后那个执行完成的task,因此运行缓慢的任务会拖垮整个程序的运行速度(分布式程序运行的速度是由最慢的那个task决定的)。
2、过多的数据在同一个task中运行,将会把executor撑爆。
10、如何解决spark中的数据倾斜问题

发现数据倾斜的时候,不要急于提高executor的资源,修改参数或是修改程序,首先要检查数据本身,是否存在异常数据。
1、数据问题造成的数据倾斜

找出异常的key
如果任务长时间卡在最后最后1个(几个)任务,首先要对key进行抽样分析,判断是哪些key造成的。 选取key,对数据进行抽样,统计出现的次数,根据出现次数大小排序取出前几个。
比如: df.select(“key”).sample(false,0.1).(k=>(k,1)).reduceBykey(+).map(k=>(k._2,k._1)).sortByKey(false).take(10)
如果发现多数数据分布都较为平均,而个别数据比其他数据大上若干个数量级,则说明发生了数据倾斜。
经过分析,倾斜的数据主要有以下三种情况:
1、null(空值)或是一些无意义的信息()之类的,大多是这个原因引起。
2、无效数据,大量重复的测试数据或是对结果影响不大的有效数据。
3、有效数据,业务导致的正常数据分布。
解决办法
第1,2种情况,直接对数据进行过滤即可(因为该数据对当前业务不会产生影响)。
第3种情况则需要进行一些特殊操作,常见的有以下几种做法
(1) 隔离执行,将异常的key过滤出来单独处理,最后与正常数据的处理结果进行union操作。
(2) 对key先添加随机值,进行操作后,去掉随机值,再进行一次操作。
(3) 使用reduceByKey 代替 groupByKey(reduceByKey用于对每个key对应的多个value进行merge操作,最重要的是它能够在本地先进行merge操作,并且merge操作可以通过函数自定义.)
(4) 使用map join。
案例
如果使用reduceByKey因为数据倾斜造成运行失败的问题。具体操作流程如下:
(1) 将原始的 key 转化为 key + 随机值(例如Random.nextInt)
(2) 对数据进行 reduceByKey(func)
(3) 将 key + 随机值 转成 key
(4) 再对数据进行 reduceByKey(func)
案例操作流程分析:
假设说有倾斜的Key,我们给所有的Key加上一个随机数,然后进行reduceByKey操作;此时同一个Key会有不同的随机数前缀,在进行reduceByKey操作的时候原来的一个非常大的倾斜的Key就分而治之变成若干个更小的Key,不过此时结果和原来不一样,怎么破?进行map操作,目的是把随机数前缀去掉,然后再次进行reduceByKey操作。(当然,如果你很无聊,可以再次做随机数前缀),这样我们就可以把原本倾斜的Key通过分而治之方案分散开来,最后又进行了全局聚合
注意1: 如果此时依旧存在问题,建议筛选出倾斜的数据单独处理。最后将这份数据与正常的数据进行union即可。
注意2: 单独处理异常数据时,可以配合使用Map Join解决。
2、spark使用不当造成的数据倾斜

提高shuffle并行度
dataFrame和sparkSql可以设置spark.sql.shuffle.partitions参数控制shuffle的并发度,默认为200。

rdd操作可以设置spark.default.parallelism控制并发度,默认参数由不同的Cluster Manager控制。

局限性: 只是让每个task执行更少的不同的key。无法解决个别key特别大的情况造成的倾斜,如果某些key的大小非常大,即使一个task单独执行它,也会受到数据倾斜的困扰。

使用map join 代替reduce join

在小表不是特别大(取决于你的executor大小)的情况下使用,可以使程序避免shuffle的过程,自然也就没有数据倾斜的困扰了.
局限性: 因为是先将小数据发送到每个executor上,所以数据量不能太大

Spark数据倾斜是指在分布式计算过程,某些分区的数据量远远超过其他分区,导致任务执行速度变慢,甚至导致整个作业失败的现象数据倾斜可能会发生在各种操作,如join、group by、aggregation等。 数据倾斜的原因可能有多种,比如数据分布不均匀、键的选择不合适、哈希冲突等。为了解决数据倾斜问题,可以采取以下几种方法: 1. 重新选择键:如果数据倾斜是由于某些键的数量远远超过其他键导致的,可以尝试重新选择键。可以考虑使用一些更加均匀分布的键,或者对原始键进行一些处理,如hash、取模等。 2. 增加分区数:可以尝试增加RDD或DataFrame的分区数,使得数据能够更均匀地分布在不同的分区。 3. 使用随机前缀:通过给键添加随机前缀,可以降低数据倾斜的概率。这样做可以将原本倾斜的数据均匀分散到不同的分区。 4. 聚合操作优化:对于出现倾斜的聚合操作,可以尝试使用两阶段聚合(two-stage aggregation)来解决。首先,将数据按键进行初步聚合,然后再进行全局聚合。这样可以减小倾斜节点上的数据量。 5. 广播变量:对于小表与大表的join操作,可以将小表使用广播变量的方式发送到各个节点上,减少网络传输的开销。 这些是常见的解决数据倾斜问题的方法,根据具体情况选择合适的方法来解决数据倾斜问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值