spark 算子优化 filter + coalecse

文章讨论了Spark中RDDpartition数据量不均导致的任务资源浪费和数据倾斜问题,提出使用coalesce算子在filter操作后压缩partition数量,确保数据均匀分布,以提高性能并避免数据倾斜。同时,强调了在本地测试环境(local模式)中coalesce的使用和设置并行度的注意事项。
摘要由CSDN通过智能技术生成

默认情况下,经过了这种filter之后,RDD中的每个partition的数据量,可能都不太一样了。
(原本每个partition的数据量可能是差不多的)

问题:

1、每个partition数据量变少了,但是在后面进行处理的时候,还是要跟partition数量一样数量的task,
来进行处理;有点浪费task计算资源。

2、每个partition的数据量不一样,会导致后面的每个task处理每个partition的时候,
每个task要处理的数据量就不同,这个时候很容易发生什么问题?数据倾斜。。。。
比如说,第二个partition的数据量才100;但是第三个partition的数据量是900;
那么在后面的task处理逻辑一样的情况下,不同的task要处理的数据量可能差别达到了9倍,
甚至10倍以上;同样也就导致了速度的差别在9倍,甚至10倍以上。
这样的话呢,就会导致有些task运行的速度很快;有些task运行的速度很慢。这,就是数据倾斜。

针对上述的两个问题,我们希望应该能够怎么样?

1、针对第一个问题,我们希望可以进行partition的压缩吧,因为数据量变少了,
那么partition其实也完全可以对应的变少。比如原来是4个partition,现在完全可以变成2个partition。
那么就只要用后面的2个task来处理即可。就不会造成task计算资源的浪费。
(不必要,针对只有一点点数据的partition,还去启动一个task来计算)

2、针对第二个问题,其实解决方案跟第一个问题是一样的;也是去压缩partition,
尽量让每个partition的数据量差不多。那么这样的话,后面的task分配到的partition的数据量
也就差不多。不会造成有的task运行速度特别慢,有的task运行速度特别快。避免了数据倾斜的问题。

有了解决问题的思路之后,接下来,我们该怎么来做呢?实现?
coalesce算子

主要就是用于在filter操作之后,针对每个partition的数据量各不相同的情况,来压缩partition的数量。
减少partition的数量,而且让每个partition的数据量都尽量均匀紧凑。
从而便于后面的task进行计算操作,在某种程度上,能够一定程度的提升性能。

893行
我们不对它来做,因为它比较复杂,里面还有聚合的东西,但是下面

1658行
说明一下:

这儿,是对完整的数据进行了filter过滤,过滤出来点击行为的数据
点击行为的数据其实只占总数据的一小部分
所以过滤以后的RDD,每个partition的数据量,很有可能跟我们之前说的一样,会很不均匀
而且数据量肯定会变少很多

所以针对这种情况,还是比较合适用一下coalesce算子的,在filter过后去减少partition的数量
coalesce(100)
这个就是说经过filter之后再把数据压缩的比较紧凑,压缩为100个数据分片

对这个coalesce操作做一个说明

我们在这里用的模式都是local模式,主要是用来测试,所以local模式下,
不用去设置分区和并行度的数量
local模式自己本身就是进程内模拟的集群来执行,本身性能就很高
而且对并行度、partition数量都有一定的内部的优化

这里我们再自己去设置,就有点画蛇添足

但是就是跟大家说明一下,coalesce算子的使用,即可

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值