解决spark中遇到的数据倾斜问题

标签: spark数据倾斜
11人阅读 评论(0) 收藏 举报
分类:

一. 数据倾斜的现象

多数task执行速度较快,少数task执行时间非常长,或者等待很长时间后提示你内存不足,执行失败。

二. 数据倾斜的原因

常见于各种shuffle操作,例如reduceByKey,groupByKey,join等操作。

数据问题

  1. key本身分布不均匀(包括大量的key为空)
  2. key的设置不合理

spark使用问题

  1. shuffle时的并发度不够
  2. 计算方式有误

三. 数据倾斜的后果

  1. spark中一个stage的执行时间受限于最后那个执行完的task,因此运行缓慢的任务会拖累整个程序的运行速度(分布式程序运行的速度是由最慢的那个task决定的)。
  2. 过多的数据在同一个task中执行,将会把executor撑爆,造成OOM,程序终止运行。

一个理想的分布式程序: 
理想的分布式程序

发生数据倾斜时,任务的执行速度由最大的那个任务决定: 
发生数据倾斜

四. 数据问题造成的数据倾斜

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

找出异常的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
  4. 使用map join。

举例:

如果使用reduceByKey因为数据倾斜造成运行失败的问题。具体操作如下:

  1. 将原始的 key 转化为 key + 随机值(例如Random.nextInt)
  2. 对数据进行 reduceByKey(func)
  3. 将 key + 随机值 转成 key
  4. 再对数据进行 reduceByKey(func)

tip1: 如果此时依旧存在问题,建议筛选出倾斜的数据单独处理。最后将这份数据与正常的数据进行union即可。

tips2: 单独处理异常数据时,可以配合使用Map Join解决。

五. spark使用不当造成的数据倾斜

1. 提高shuffle并行度

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

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

2. 使用map join 代替reduce join

在小表不是特别大(取决于你的executor大小)的情况下使用,可以使程序避免shuffle的过程,自然也就没有数据倾斜的困扰了。

局限性: 因为是先将小数据发送到每个executor上,所以数据量不能太大。

具体使用方法和处理流程参照:

Spark map-side-join 关联优化

https://blog.csdn.net/WYpersist/article/details/79968109

spark join broadcast优化

https://blog.csdn.net/WYpersist/article/details/79968079

查看评论

sqoop 导入导出数据倾斜问题优化

导入: PG => hive   :  sqoop import  --connect jdbc:postgresql://host:5432/test --username test -...
  • qq_20064245
  • qq_20064245
  • 2017年10月26日 13:53
  • 415

hive 数据倾斜实际问题中总结

1.数据倾斜原因 a.大表(2.8G)与小表关联(580K) b.大表(2.8G)与大表(3.0G)关联 首先谈论大表与小表的关联导致数据倾斜问题  实例如下: 大表数据格式: 小...
  • xiaoshunzi111
  • xiaoshunzi111
  • 2016年10月25日 13:16
  • 1503

spark数据倾斜处理

调优概述       有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性能会比期望差很多。数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保...
  • qq_38534715
  • qq_38534715
  • 2017年12月04日 11:16
  • 256

spark数据倾斜解决方案--原理及现象分析

数据倾斜解决方案 原理及现象分析 最最有含金量,最最有实战性,最最有价值,最最有意义的这么个部分 1、大数据开发流程(需求分析。。。性能调优) 2、用户行为分析的业务(聚合统计、...
  • qq_21835703
  • qq_21835703
  • 2017年03月25日 17:36
  • 864

Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势

本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自定义Partitioner,使用Map侧Join代替Reduce侧Join,给倾斜Key加上...
  • Habren
  • Habren
  • 2017年03月06日 06:45
  • 1852

Spark数据倾斜解决原理和方法总论

本博文主要包含以下内容:1、Spark数据倾斜解决的原理方法总论 2、Spark数据倾斜解决方法总论一:均衡数据是我们的目标,或者说我们要解决数据倾斜的发力点。一般说shuffle是产生数据倾斜的主...
  • erfucun
  • erfucun
  • 2016年09月10日 12:41
  • 2276

Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势 (详细)

摘要 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自定义Partitioner,使用Map侧Join代替Reduce侧Join,给倾斜K...
  • u010159842
  • u010159842
  • 2017年06月06日 11:40
  • 480

解决spark中遇到的数据倾斜问题

解决spark中遇到的数据倾斜问题一. 数据倾斜的现象多数task执行速度较快,少数task执行时间非常长,或者等待很长时间后提示你内存不足,执行失败。二. 数据倾斜的原因数据问题 key本身分布不均...
  • lsshlsw
  • lsshlsw
  • 2016年07月25日 17:52
  • 9947

Spark性能调优之道——解决Spark数据倾斜(Data Skew)的N种姿势

原文:http://www.infoq.com/cn/articles/the-road-of-spark-performance-tuning?utm_campaign=rightbar_v2&ut...
  • u013063153
  • u013063153
  • 2017年06月26日 17:15
  • 539

Spark调优-数据倾斜-四个解决方案

A,数据倾斜解决方案  使用随机key实现双重聚合 使用随机key实现双重聚合 1、原理 这个方案的核心实现思路就是进行两阶段聚合。第一次是局部聚合,先给每个key都打上一个随机...
  • u013939918
  • u013939918
  • 2017年03月09日 10:41
  • 580
    个人资料
    持之以恒
    等级:
    访问量: 6090
    积分: 1074
    排名: 4万+
    文章存档