spark性能优化: shuffle调优,数据倾斜调优

spark性能优化: shuffle调优,数据倾斜调优

在日常开发spark任务的过程中,我们有时会发现在某个Stage中一个task或是几个task相对于其它的task的执行速度慢,那这个stage的执行时间就取决于最慢的task的执行时间,这个时候可能就发生了数据倾斜。

何谓数据倾斜?数据倾斜指的是,并行处理的数据集中,某一部分(如Spark或Kafka的一个Partition)的数据显著多于其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈。

shuffle过程产生数据倾斜的原理:在shuffle的过程中,会把各个节点上相同的key拉取到某个节点上的某个分区中,在对应的生成task,此时如果某个key对应的数据量比较大的话,就会导致数据倾斜。在spark UI中我们可以观察到每个stage的task的运行情况,如果发现了数据倾斜的情况我们可以使用些简单的手段定位到是那些key导致了数据倾斜下面是个例子,取出key对应数据量最大的前十个key。

    // 取样 查看导致数据倾斜的key
    val countSkewRDD = bigRDD.mapValues(_ => 1L).reduceByKey(_ + _)
    val skewArr: Array[Int] = countSkewRDD.sortBy(item => {
      item._2
    }, false).take(10).map(item => {
      item._1
    })

下面介绍下数据倾斜的几种解决方案

数据的预处理

根据业务情况,如果任务的数据源是Hive的话,在Hive中某些key数据量过大,业务场景是需要频繁的进行spark计算,可以考虑这种方案。具体实现是在Hive中先进行聚合操作或是join操作,说白了也就是要在spark中进行的会导致数据倾斜的运算提前到了Hive中,spark只需要读取hive处理好的数据。但是这样的优化方案也只是治标不治本,在hive中仍然会发生数据倾斜,虽然缓解了spark中数据倾斜的问题。

过滤掉导致数据倾斜的key

这个方案呢,前提是通过取样或是一些统计手段观察到了导致数据倾斜的key,并且这些key对计算结果并没有影响,才可以使用,具体实现方案也很简单就是过滤掉一部分数据就可以了,但是适用的场景很少。

提高s

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值