最详细10招Spark数据倾斜调优

数据量大并不可怕,可怕的是数据倾斜 。

数据倾斜发生的现象

绝大多数 task 执行得都非常快,但个别 task 执行极慢。

数据倾斜发生的原理

在进行 shuffle 的时候,必须将各个节点上相同的 key 的数据拉取到某个节点

上的一个 task 来进行处理,比如按照 key 进行聚合或 join 等操作。此时如果某个 key 对应的数据量特

别大的话,就会发生数据倾斜。

数据倾斜的危害

当出现数据倾斜时,小量任务耗时远高于其它任务,从而使得整体耗时过大,未能充分发

挥分布式系统的并行计算优势。另外,当发生数据倾斜时,少量部分任务处理的数据量过大,可能造成

内存不足使得任务失败,并进而引进整个应用失败。

1、整体耗时过大(整个任务的完成由执行时间最长的那个Task决定)
2、应用程序可能异常退出(某个Task执行时处理的数据量远远大于正常节点,则需要的资源容易出现瓶颈, 当资源不足,则应用程序退出)
3、资源闲置(处理等待状态的Task资源得不到及时的释放,处于闲置浪费状态)

数据倾斜是如何造成的

Stage 的数据来源主要分为如下两类:

1、数据源本身分布有问题:从数据源直接读取。如读取HDFS,Kafka,有可能出现,大概率不会
2、自己指定的分区规则:读取上一个 Stage 的 Shuffle 数据

如何消除或缓解数据倾斜

1. 避免数据源倾斜-HDFS

2. 定位处理逻辑 -Stage 和 Task

我们知道了导致数据倾斜的问题就是 shuffle 算子,所以我们先去找到代码中的 shuffle 的算子,比如

distinct、groupByKey、reduceByKey、aggergateByKey、join、cogroup、repartition 等,

3. 查看导致倾斜的key的数据分布情况

可以有很多种查看key分布的方式:

1、如果是Spark SQL中的group by、join语句导致的数据倾斜,那么就查询一下 SQL 中使用的表的key

分布情况。

2、如果是对 Spark RDD执行shuffle算子导致的数据倾斜,那么可以在Spark作业中加入查看 key 分布

的代码,比如 RDD.countByKey()。然后对统计出来的各个key出现的次数,collect/take到客户端打印

一下,就可以看到key的分布情况。

数据倾斜解决方案

1. 方案一:使用 Hive ETL 预处理数据

2. 方案二:调整 shuffle 操作的并行度

3. 方案三:过滤少数导致倾斜的 key

4. 方案四:将 reduce join 转为 map join

5. 方案五:采样倾斜 key 并分拆 join 操作

6. 方案六:两阶段聚合(局部聚合 + 全局聚合)

7. 方案七:使用随机前缀和扩容 RDD 进行 join

8. 方案八:任务横切,一分为二,单独处理

9. 方案九:多种方案组合使用

10. 方案十:自定义 Partitioner

最详细10招Spark数据倾斜调优的更多相关文章

  1. Spark 数据倾斜调优

    一.what is a shuffle? 1.1 shuffle简介 一个stage执行完后,下一个stage开始执行的每个task会从上一个stage执行的task所在的节点,通过网络传输获取tas ...

  2. Spark学习之路 (九)SparkCore的调优之数据倾斜调优

    摘抄自:https://tech.meituan.com/spark-tuning-pro.html 数据倾斜调优 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Sp ...

  3. Spark(十)Spark之数据倾斜调优

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

  4. Spark性能优化:数据倾斜调优

    前言 继<Spark性能优化:开发调优篇>和<Spark性能优化:资源调优篇>讲解了每个Spark开发人员都必须熟知的开发调优与资源调优之后,本文作为<Spark性能优化 ...

  5. Spark学习之路 (九)SparkCore的调优之数据倾斜调优[转]

    调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的 ...

  6. Spark性能优化--数据倾斜调优与shuffle调优

    一.数据倾斜发生的原理 原理:在进行shuffle的时候,必须将各个节点上相同的key拉取到某个节点上的一个task来进行处理,比如按照key进行聚合或join等操作.此时如果某个key对应的数据量特 ...

  7. Spark面试题(五)——数据倾斜调优

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

  8. 【转】数据倾斜是多么痛?spark作业/面试/调优必备秘籍

    原博文出自于: http://sanwen.net/a/gqkotbo.html 感谢! 来源:数盟 调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性 ...

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

    原创文章,同步首发自作者个人博客转载请务必在文章开头处注明出处. 摘要 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自定义Partitio ...

随机推荐

  1. Guitar Pro吉他指弹入门——双手泛音

    曾经有一段时间在琴行里经常遇到有人来试琴,很多人试弹得曲子就是郑成河的<Flaming>,直译过来就是热情的意思.这首曲子里面有很多泛音存在,吉他泛音类似于钟鸣或者摇铃的声音,是一种令人耳 ...

  2. leetcode152. 乘积最大子序列

    给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数).示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6.示例 2:输入: ...

  3. 解决-Chrome插件安装时程序包无效:"CRX_HEADER_INVALID"

    最近安装新的谷歌插件出现 :程序包无效:"CRX_HEADER_INVALID" 原因如下: 在地址栏输入chrome://settings/help 如果,你的 Chrome 浏 ...

  4. python3基础3

    # 匿名函数: bbb = lambda a, b: a + b print(bbb(1,1)) # 函数 def add(a=None, b=None): """ 接收 ...

  5. Mybatis【2.2】-- Mybatis关于创建SqlSession源码分析的几点疑问?

    代码直接放在Github仓库[https://github.com/Damaer/Mybatis-Learning ],可直接运行,就不占篇幅了. 目录 1.为什么我们使用SQLSessionFact ...

  6. netty&websocket

    1.先判断是不是http 消息,不是返回400,是则remove之前添加的http组件,动态添加websocket组件 添加WebSocket Encoder和WebSocket Decoder之后, ...

  7. 利用反射获取对象中的值等于x的字段

    Field[] field = behavior.getClass().getDeclaredFields(); for (int i = 0; i < field.length; i++) { ...

  8. vs2019 Com组件初探-通过IDispatch接口调用Com

    vs2019 Com组件初探-简单的COM编写以及实现跨语言调用 上一篇实现了如何编写基于IDipatch接口的COM以及vbs如何调用编写的COM 本次主要是实现VBS的CreateObject函数 ...

  9. 010 editor的使用

    原文链接:http://www.cnblogs.com/vendanner/p/4939444.html 注意事项:之前一直在虚拟机winxp中添加template一直失败,原因可能是因为虚拟机的版本 ...

  10. Spring Cloud Alibaba 初体验(二) Nacos 服务注册与发现 + 集成 Spring Cloud Gateway

    一.服务注册 添加依赖: <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>s ...