spark - 数据倾斜 - Partitioner源码分析

本文探讨了Spark中数据倾斜的原因及其对任务执行的影响,深入分析了Partitioner的作用,特别是HashPartitioner和RangePartitioner的工作原理。通过源码解读`reduceByKey`和`defaultPartitioner`,揭示了数据分配机制。并提出了三种解决数据倾斜的方法:数据去重、key加盐分组和调整分区数。此外,还建议根据业务需求选择或定制Partitioner策略。
摘要由CSDN通过智能技术生成

spark - 数据倾斜 - Partitioner源码分析

为何会出现数据倾斜, 如何处理数据倾斜问题?

有大数据处理经验的朋友应该都遇到过数据倾斜的问题,即数据分布不均匀导致任务分配不均匀,从而造成 "一个人累死,其他人闲死" 的情况。

其他人在处理完任务之后,要一直等待这个未完成的任务,从而导致总任务时间很长,或者这个任务没有做完,这个人扛不住病倒了,那么整个任务也就失败了,也就是可能引发了内存问题。所以出现内存问题的时候不必盲目调参,在清楚症状之后,对症下药,才能有更好的效果。

 

那么为什么数据不均匀会导致任务分配不均匀呢? 数据是如何分配给各个执行者的? 这里就要提到partitioner。

partitioner 根据分布键来将数据分配给不同的partition。

其分配算法有两种: HashPartitioner 和 RangePartitioner,在未指定的情况下,默认使用HashPartitioner。

 

我们通过一段reduceBykey 的案例来帮助我们理解:

  val list = List(1,2,2,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6)
  val rdd = sc.parallelize(list)
  val pairRdd = rdd.map((_,1))
  pairRdd.reduceByKey(_+_)

 我们看看reduceByKey  的源码,这里使用了defaultPartitioner

  def reduceByKey(func: (V, V) &
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值