数据倾斜问题

article/2025/8/25 21:50:21

一、什么是数据倾斜

简单来说,就是在数据计算的时候,数据会分配到不同的task上执行,当数据分配不均匀导致某些大批量数据分配到某几个task上就会造成计算不动或者异常的情况。

二、数据倾斜表现形式

1、大部分的task在计算的时候计算的特别快,耗时很短就计算完,但是就剩下那么几个task一直卡着,要执行很长很长时间,这就是出现数据倾斜了
2、还有一种情况就是,大部分的task很快计算完了,某些task在计算的时候总是报OOM,即使再提交好几次还是报内存溢出一类的异常,这就是出现数据倾斜了

三、产生原因

数据倾斜都是出现在任务执行shuffle操作的时候。因为shuffle的原理就是按照key来进行values的数据的输出、拉取和聚合,同一个key的values一定会被分配到同一个reduce task上进行处理。当某些key的values数据量特别特别大,但是其它多数key的values数据量相比却挺少,那么就会造成某些reduce task上数据量特别特别大,那么在计算的时候就会出现某些task执行的时候特别慢,这就是数据倾斜

四、如何定位问题的位置

1、因为产生shuffle的原因就是你使用了会产生shuffle的算子,就在你的代码中找找 groupByKey、countByKey、reduceByKey、join这类算子
2、要是找不到相应容易产生shuffle的算子,就直接看执行日志,看看到底是哪行代码导致报错的

五、解决方法

对于shuffle算子,主要有 *ByKey和Join这两类,咱们分别对他们做优化

一、*ByKey类算子
1、提高reduce的并行度

这种方法治标不治本
提高reduce task的数量,就可以让每个reduce task能分配到更少的数据量,这样就能缓解数据倾斜的问题,在 groupByKey、countByKey、reduceByKey调用的时候在括号里最后一个参数传入一个并行度的值

2、随机Key实现双重聚合

这种方法比较治本
第一步:先将Key进行hash打散,也就是平时说的加盐处理,就是在key的前边拼上一个hash过的字符串,这样就能将原本相同的key转换成不一样的key,这样就把一个values数据量特别大的key分成了好多个values数据量比较小的key,然后对这些key进行聚合(这叫做局部聚合)
第二步:将这些key的hash前缀去掉,还原成原来的key,然后对这些数据再进行聚合(这叫做全局聚合)

二、Join类算子

对于join操作有以下三种方法,注意每种的使用场景

1、将reduce join转换为map join

普通的join都是将相同的key对应的values汇聚到同一个task中再进行join,所以都会执行shuffle操作,当然也很容易产生数据倾斜问题
在这里插入图片描述
这种情况是适用于某一个数据集(RDD)的数据量比较小的情况,因为这样才能将小数据集广播到每个executor上,在其中block manager缓存一份,这样当与大数据集的每个task上的数据进行join的时候就不会执行shuffle操作了,杜绝了数据倾斜的发生。
注意:这种操作能治本,但是首先得确保其中的一个数据集数据量比较小才行,这样才能加载到内存中
比如一个RDD是100万数据,一个是1万数据;一个是1亿数据,一个是100万数据
在这里插入图片描述

2、sample采样倾斜的Key进行两次join

这个首先得用countByKey的方式看一下数据集(RDD)中各个key对应的数据量是多大,当你发现整个数据集中就某几个key数据量特别大,那就将这几个单独拉出来,放到一个单独的RDD中让它单独join,这样这些数据就有可能被分配到多个task中进行执行,最后和不倾斜key的join后的数据进行union
注意:这种只能适用于引起数据倾斜的Key比较少的情况,要是大数据量的Key确实挺多,那就用最后一种方法
在这里插入图片描述

3、使用随机数以及扩容表进行join

这样是前边两种执行效果不大好才做这种操作,就是将一个数据集的key的前缀拼上hash字符串前缀,另一个数据集进行flatmap扩容,这样进行join,就能将数据打散避免汇集到某几个task上执行
第一步、选择一个比较大的数据集,将每条数据的Key都打上一个10以内的随机数
第二步、选择一个比较小的数据集,将每条数据使用flatmap,映射成多条数据(比如10条,这个你得看第一步你用的是多大值以内的随机数),每个映射出来的数据,key值都带有10以内的随机数
第三步、将两个处理后的数据集进行join操作
第四步、将join后的数据的key值还原成原来的key
注意:具体需要扩容多大,就得看数据量了,如果两个RDD数据量都很大,就少扩容点

六、参考文章

面试必问&数据倾斜


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

相关文章

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

数据倾斜在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处理…

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

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

缓存穿透和缓存击穿

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

缓存穿透,缓存雪崩,缓存击穿

一,缓存穿透 原因:一个请求来访问某个数据,发现缓存中没有,直接去DB中访问。此种情况就是穿透。(正常情况下缓存跟数据库中数据都是存在,异常情况下会导致) 特点:因传递了非法的key,导致缓存跟数据库中都无法查询 方…

如何避免缓存穿透、缓存击穿、缓存雪崩?

如何避免缓存穿透、缓存击穿、缓存雪崩? 缓存穿透 先来看一下缓存穿透,顾名思义,是指业务请求穿过了缓存层,落到持久化存储上。在大多数场景下,我们应用缓存是为了承载前端业务请求,缓存被击穿以后&#x…

缓存穿透、缓存击穿、缓存雪崩解决方案

微信搜索【程序员囧辉】,关注这个坚持分享技术干货的程序员。 前言 ​ 我一个QPS不到10的项目,天天问我缓存穿透、缓存击穿、缓存雪崩,我是真滴难。 可能大家经常会有这种感受,但是只要是面试要问的题目,就算用不上&…

缓存穿透 缓存击穿 缓存雪崩 这三者是什么 如何处理

通常我们使用缓存中间件的方式 将数据库的热点数据缓存到Redis中 尽量去缓存中查找数据,目的就是为了减轻数据库的压力 那什么是 缓存穿透,缓存击穿 与 缓存雪崩 呢 ? 缓存穿透 当Redis中不存在某个key时,将对数据库进行查询操作 但如果数据库也不存在 就会造成每一个请求即…

应对缓存击穿的解决方法

一.什么样的数据适合缓存? 分析一个数据是否适合缓存,我们要从访问频率、读写比例、数据一致性等要求去分析. 二.什么是缓存击穿 在高并发下,多线程同时查询同一个资源,如果缓存中没有这个资源,那么这些线程都会去数据库查找,对数据库造成极大压力,缓存失去存在的意义.打个…

redis缓存击穿

缓存击穿: 缓存击穿是指,针对某个访问非常频繁的热点数据的请求,无法在缓存中进行处理,紧接着,访问该数据的大量请求,一下子都发送到了后端数据库,导致了数据库压力激增,会影响数据…

【缓存】缓存穿透、缓存击穿、缓存雪崩及其解决方案

文章目录 缓存穿透缓存击穿缓存雪崩大量数据同时过期Redis 故障宕机 总结来源 用户的数据一般都是存储于数据库,数据库的数据是落在磁盘上的,磁盘的读写速度可以说是计算机里最慢的硬件了。 当用户的请求,都访问数据库的话,请求数…

Redis 缓存击穿,缓存穿透,缓存雪崩原因+解决方案

一、前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者…

Redis缓存击穿、雪崩、穿透!(超详细)

缓存的击穿、穿透和雪崩应该是再熟悉不过的词了,也是面试常问的高频试题。 不过,对于这三大缓存的问题,有很多人背过了解决方案,却少有人能把思路给理清的。 而且,网络上仍然充斥着,大量不太靠谱的解决方案…

缓存穿透、缓存击穿、缓存雪崩如何应对

参考连接:redis避免缓存穿透为什么缓存空对象而不是null? - 知乎 缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的…

缓存穿透、缓存击穿、缓存雪崩区别和解决方案

一、缓存处理流程 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。 二、缓存穿透 描述: …

缓存穿透,缓存雪崩,缓存击穿的超详解

文章目录 1、缓存穿透问题的解决思路2、缓存雪崩问题及解决思路3、缓存击穿问题及解决思路 1、缓存穿透问题的解决思路 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库,失去了缓存的…

redis 缓存穿透,缓存击穿,缓存雪崩

虽然我们在使用 redis 缓存的时候非常的爽,它大大的提高了我们应用程序的性能和效率,尤其是数据查询方面,咱们不用直接去持久化的数据库中查询数据,而是到内存中查询数据即可 事物总是有两面的,用的爽的同时&#xff…

缓存穿透、缓存击穿、缓存雪崩的理解和解决方案

目录 一、缓存穿透 二、缓存击穿 三:缓存雪崩 在生产环境中,会因为很多的原因造成访问请求绕过了缓存,都需要访问数据库持久层,虽然对Redsi缓存服务器不会造成影响,但是数据库的负载就会增大,使缓存的作…

详解缓存穿透、缓存雪崩、缓存击穿

背景 在现代软件架构中,缓存的应用已经非常普及。缓存的使用在面试和实践中都是避不开的硬技能、硬知识,如果你说还不太熟悉缓存的使用,可能都不好意思说自己是程序员。 这篇文章,带大家进一步学习在缓存使用中不得不考虑三个特…