spark处理数据倾斜的案例

article/2025/8/25 17:52:52

在前期的工作遇到了很多数据倾斜的案例,在此记录下解决的心得

1) 大表join小表:

       执行某段sql,出现了Executor OOM的现象,查看其stage的状况:

       第3个stage读取了21.1G的数据,并shuffle写入了2.6G的数据,由于两个表根据字段进行join,因此必然会触发shuffle操作。最后的stage4 需要从stage3 shuffle read 2.6G的数据,再写入到本地,从图中可知,stage4只shuffle读取了1.2G的数据,然后就失败,因此剩余的1.4G数据倾斜到了一个分区中。

       查看下sql执行计划:

       从图中可知,左边只读取了107条记录,而右表读取了10亿条数据,但最终执行的join方式为sort merge join。

       sort merge join是sparksql中对两张大表进行join的方式之一,基本原理如图所示:

        1) 在shuffle阶段,将两张大表根据join key进行重新分区,key相同的记录会被划分到一个分区中
        2) 在sort阶段,对单个分区节点的两表数据,按照key进行重新排序
        3) 在merge阶段,对排序好的两张表进行join操作,通过顺序移动两边指针,遇到相同的key就merge输出

      这是一个很典型的小表join大表的例子,因此很容易想到对小表进行广播,sparksql中对小表进行广播的阈值是10M,在这里我们通过sparksql hint手动对小表进行广播:

        /*+ mapjoin(t_point)*/ 表示对表t_point进行广播

        执行该sql,查看spark的执行stage情况:

       从stage情况来看,没有出现shuffle情况,因为小表被广播到了大表所在节点上,因此不会产生跨节点数据传输。

       从sql的执行计划来看,执行了broadcast join。

 

2) 两张大表join

        sql逻辑时两张大表根据appid进行join,并且最终提取相关字段,但执行时出现了数据倾斜现象:

        从图中可以看出,其中一个task的shuffle数据量明显比其它task多。

        经过分析,发现是由于appid为 100IME这个条件的记录非常多,导致该记录出现了数据膨胀的现象。

        由于两张表都是大表,因此不能采用第一种对表进行广播的方式。

        我们将数据输出分为两步,首先在两张表中过滤掉appid为100IME的记录,过滤之后的appid分布较为均匀,因此数据很快跑出;

        第二步也就是在两张表中筛选appid为100IME的记录,注意这时两张表不能直接进行join,否则所有的数据会落到一个分区中(因为key都是一样)

        我们首先将两张表筛选appid为100IME的记录得到两个rdd,然后在两个rdd进行join的地方指定分区函数,见下图的代码:

        

        我们在该分区函数中指定分区数量为200,同时对key进行随机路由,因为这里的key都是100IME,所以我们通过random函数让当前记录随机路由到200个分区中任意一个分区中。

         执行该代码后,观察执行图:

       从图中可以看到,每个task处理的数据都很均匀,没有出现数据倾斜现象。

       最后将两部分的数据合并到一起就完成了整个业务流程。


http://chatgpt.dhexx.cn/article/hY4a3jxd.shtml

相关文章

redis之数据倾斜如何处理

写在前面 我们在使用Redis分片集群时,集群最好的状态就是每个实例可以处理相同或相近比例的请求,但如果不是这样,则会出现某些实例压力特别大,而某些实例特别空闲的情况发生,本文就一起来看下这种情况是如何发生的以及…

实操 | Hive 数据倾斜问题定位排查及解决

Hive 数据倾斜怎么发现,怎么定位,怎么解决 多数介绍数据倾斜的文章都是以大篇幅的理论为主,并没有给出具体的数据倾斜案例。当工作中遇到了倾斜问题,这些理论很难直接应用,导致我们面对倾斜时还是不知所措。 本文首发在…

数据倾斜原理及解决方案

导读 相信很多接触MapReduce的朋友对数据倾斜这四个字并不陌生,那么究竟什么是数据倾斜?又该怎样解决这种该死的情况呢? 何为数据倾斜? 在弄清什么是数据倾斜之前,我想让大家看看数据分布的概念: 正常的数据分布理论上都是倾斜的,就是我们所说的20-80原理&…

spark 数据倾斜调优

数据倾斜应该算是一个比较麻烦的问题,笔者也是刚刚开始学习相关的调优,将看到的比较全面、清晰的几种解决方案整合了一下,并加上了一些理解与心得,供参考! 首先,需要对spark执行计划有一定的基础与理解&am…

如何解决mysql数据倾斜_数据倾斜解决方案

1)聚合原数据(主要操作的是hive数据库中的数据,先通过hive sql将相同key的数据聚合成一条数据,再进行map操作) 当没办法聚合成一条数据时:增大key粒度,从而key的数量会减少,但是每个key对应的数据量会增大&#xff0c…

数据倾斜及其解决方式

数据倾斜是大数据领域绕不开的拦路虎,当你所需处理的数据量到达了上亿甚至是千亿条的时候,数据倾斜将是横在你面前一道巨大的坎。很可能有几周甚至几月都要头疼于数据倾斜导致的各类诡异的问题。 数据倾斜是指:mapreduce程序执行时&#xff0…

Hive 数据倾斜

数据倾斜,即单个节点任务所处理的数据量远大于同类型任务所处理的数据量,导致该节点成为整个作业的瓶颈,这是分布式系统不可能避免的问题。从本质来说,导致数据倾斜有两种原因,一是任务读取大文件,二是任务…

Spark数据倾斜解决

一、数据倾斜表现 数据倾斜就是数据分到各个区的数量不太均匀,可以自定义分区器,想怎么分就怎么分。 Spark中的数据倾斜问题主要指shuffle过程中出现的数据倾斜问题,是由于不同的key对应的数据量不同导致的不同task所处理的数据量不同的问题。 例如,redu…

大数据篇--数据倾斜

文章目录 一、什么是数据倾斜二、结合Shuffle1.结合mapreduce的shshuffle来说:(1)Shuffle 机制(2)Shuffle 阶段的优化 2.结合spark的shshuffle来说:(1)Spark任务调度:&am…

spark 数据倾斜

一. 数据倾斜的现象 1、spark中一个stage的执行时间受限于最后那个执行完的task,因此运行缓慢的任务会拖累整个程序的运行速度(分布式程序运行的速度是由最慢的那个task决定的)比如,总共有1000个task,997个task都在1分…

Spark处理数据倾斜问题

写在前面:有博主的文章写的很好,很详细,推荐! 参考:Spark如何处理数据倾斜(甚好,甚详细,很有逻辑,强推!) spark数据倾斜解决方案汇总 1、什么是数…

如何处理Spark数据倾斜

一、什么是数据倾斜 在分布式集群计算中,数据计算时候数据在各个节点分布不均衡,某一个或几个节点集中80%数据,而其它节点集中20%甚至更少数据,出现了数据计算负载不均衡的现象。 数据倾斜在MR编程模型中是十分常见的&#xff0…

数据倾斜

数据倾斜 转载声明 本文大量内容系转载自以下文章,有删改,并参考其他文档资料加入了一些内容: Spark性能优化指南——高级篇 作者:李雪蕤 出处:美团技术团队博客漫谈千亿级数据优化实践:数据倾斜&#x…

大数据常见问题:数据倾斜的原理及处理方案

什么是数据倾斜 Hadoop能够进行对海量数据进行批处理的核心,在于它的分布式思想,通过多台服务器(节点)组成集群,共同完成任务,进行分布式的数据处理。 理想状态下,一个任务是由集群下所有机器…

数据倾斜问题

一、什么是数据倾斜 简单来说,就是在数据计算的时候,数据会分配到不同的task上执行,当数据分配不均匀导致某些大批量数据分配到某几个task上就会造成计算不动或者异常的情况。 二、数据倾斜表现形式 1、大部分的task在计算的时候计算的特别…

数据倾斜常见原因和解决办法

数据倾斜在MapReduce编程模型中十分常见,多个节点并行计算,如果分配的不均,就会导致长尾问题(大部分节点都完成了任务,一直等待剩下的节点完成任务),本文梳理了常见的发生倾斜的原因以及相应的解…

数据倾斜产生,原因及其解决方案

目录 第七章 数据倾斜 7.1 数据倾斜的产生,表现与原因 7.1.1 数据倾斜的定义 7.1.2 数据倾斜的危害 7.1.3 数据倾斜发生的现象 7.2 数据倾斜倾斜造成的原因 7.3 几种常见的数据倾斜及其解决方案 7.3.1 空值引发的数据倾斜 7.3.2 不同数据类型引发的数据倾斜…

数据倾斜原理与解决方法

数据倾斜的概念 数据倾斜这四个字经常会在学习MapReduce中遇到。所谓数据分区,就是数据分区分布因为数据本身或者分区方法的原因变得极为不一致,大量的数据被划分到了同一个区。由于Reducer Task每次处理一个区的数据,这导致Reducer Task处理…

什么是缓存穿透、缓存雪崩、缓存击穿

缓存穿透 缓存穿透 :缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库,失去了缓存保护后端存储的意义。 解决方案 缓存空值 如果访问数据库后还未命中,则把一…

缓存穿透和缓存击穿

一、背景介绍 几乎所有互联网公司都采用缓存的方案来解决瞬时流量超高,或者长期流量过高的问题。但使用缓存存在风险——缓存穿透和缓存击穿:简单的讲就是如果该数据原本就不存在,那么就会发生缓存穿透;如果缓存内容因为各种原因…