Spark数据倾斜解决方案

SparkSQL自定义bitmap udf操作函数 文章目录简介源码实现SparkSQL使用示例 简介 Bitmap是用来实现基数统计的一种常用方法,它可以实现精确的基数统计。为了提高bitmap对稀疏位图的压缩率,提出了RoaringBitmap(RBM)对稀疏位图进行压缩,减少了内存占用并提高了使用效率。 在Java中实现RBM的常用库是RoaringBitmap,其已经在Spark、Kylin和Druid等系统中得到了应用。那是不是可以将RoaringBitmap库封装成SparkSQL的udf函数,从而可以对bitmap结构数据进行方便的计算操作,实 阅读详情

1、执行流程

1.1、MapReduce执行流程

        核心思想:大问题拆分成多个小问题,然后分布式的并行执行

两个阶段:
1、mapper阶段: 提取数据,赋予特征 映射 value ====> key, value
        mapreducce框架是怎么把相同特征的数据组合到一起来,然后交给reduceTask执行一次聚合操作的呢
2、reducer阶段: 把相同特征的数据进行聚合操作 key, (value, value, ...)

1.2、Spark应用程序执行流程

        sparkContext.rextFile().flatMap().map().reduceByKey()

        首先让你确认,导致分布式计算应用改程序出现数据倾斜的原因就是 Shuffle 数据倾斜的调优,都是围绕着: 

  1. 要么就不要使用shuffle
  2. 要么就让shuffle在执行过程中均匀分发数据

        最终的目的:Spark 中的同一个 stage 中的多个 Task 处理的数据量大小几乎是一致的。

2、数据倾斜解决方案

2.1、使用Hive ETL预处理数据

  • 优点:实现起来简单便捷,效果还非常好,完全规避掉了数据倾斜,Spark作业的性能会大幅度提升。
  • 缺点:治标不治本,Hive ETL中还是会发生数据倾斜。

2.2、调整shuffle操作的并行度

  • 实用场景:大量不同的Key被分配到了相同的Task造成该Task数据量过大。
  • 实现思路:在对RDD执行Shuffle算子时,给Shuffle算子传入一个参数,比如reduceByKey(1000),该参数就设置了这个shuffle算子执行时shuffle read task的数量。对于Spark SQL中的Shuffle类语句,比如group by、join等,需要设置一个参数,即spark.sql.shuffle.partitions,该参数代表了shufflereadTask的并行度,该值默认是200,对于很多场景来说都有点过小。
  • 优点:实现起来比较简单,可以有效缓解和减轻数据倾斜的影响。实现简单,可在需要Shuffle的操作算子上直接设置并行度或者使用spark.default.parallelism设置。如果是Spark SQL,还可通过SET spark.sql.shuffle.partitions=[num_tasks]设置并行度。可用最小的代价解决问题。一般如果出现数据倾斜,都可以通过这种方法先试验几次,如果问题未解决,再尝试其它方法。
  • 缺点:只是缓解了数据倾斜而已,没有彻底根除问题,根据实践经验来看,其效果有限。适用场景少,只能将分配到同一Task的不同Key分散开,但对于同一Key倾斜严重的情况该方法并不适用。并且该方法一般只能缓解数据倾斜,没有彻底消除问题。从实践经验来看,其效果一般。

2.3、过滤少数导致倾斜的key

  • 优点:实现简单,而且效果也很好,可以完全规避掉数据倾斜。
  • 缺点:适用场景不多,大多数情况下,导致倾斜的key还是很多的,并不是只有少数几个。

2.4、将reduce join转为map join

        普通的join是会走shuffle过程的,而一旦shuffle,就相当于会将相同key的数据拉取到一个shuffle read task中再进行join,此时就是reduce join。但是如果一个RDD是比较小的,则可以采用广播小RDD全量数据+map算子来实现与join同样的效果,也就是map join,此时就不会发生shuffle操作,也就不会发生数据倾斜。

  • 优点:对join操作导致的数据倾斜,效果非常好,因为根本就不会发生shuffle,也就根本不会发生数据倾斜。
  • 缺点:适用场景较少,因为这个方案只适用于一个大表和一个小表的情况。毕竟我们需要将小表进行广播,此时会比较消耗内存资源,driver和每个Executor内存中都会驻留一份小RDD的全量数据。如果我们广播出去的RDD数据比较大,比如10G以上,那么就可能发生内存溢出了。因此并不适合两个都是大表的情况。

2.5、采样倾斜key并分拆join操作

  • 优点:对于join导致的数据倾斜,如果只是某几个key导致了倾斜,采用该方式可以用最有效的方式打散key进行join。而且只需要针对少数倾斜key对应的数据进行扩容n倍,不需要对全量数据进行扩容。避免了占用过多内存。
  • 缺点:如果导致倾斜的key特别多的话,比如成千上万个key都导致数据倾斜,那么这种方式也不适合。

2.6、两阶段聚合(局部聚合+全局聚合)

  • 适用场景: 对RDD执行reduceByKey等聚合类shuffle算子或者在Spark SQL中使用group by语句进行分组聚合时,比较适用这种方案。
  • 实现原理:将原本相同的key通过附加随机前缀的方式,变成多个不同的key,就可以让原本被一个task处理的数据分散到多个task上去做局部聚合,进而解决单个task处理数据量过多的问题。接着去除掉随机前缀,再次进行全局聚合,就可以得到最终的结果。
  • 优点:对于聚合类的shuffle操作导致的数据倾斜,效果是非常不错的。通常都可以解决掉数据倾斜,或者至少是大幅度缓解数据倾斜,将Spark作业的性能提升数倍以上。
  • 缺点:仅仅适用于聚合类的shuffle操作,适用范围相对较窄。如果是join类的shuffle操作,还得用其他的解决方案。

2.7、使用随机前缀和扩容RDD进行join

  • 适用场景:如果在进行 join 操作时,RDD 中有大量的 key 导致数据倾斜,那么进行分拆 key 也没什么意义。
  • 实现原理:将原先一样的 key 通过附加随机前缀变成不一样的key,然后就可以将这些处理后的“不同key”分散到多个task中去处理,而不是让一个task处理大量的相同key。该方案与“解决方案六”的不同之处就在于,上一种方案是尽量只对少数倾斜key对应的数据进行特殊处理,由于处理过程需要扩容RDD,因此上一种方案扩容RDD后对内存的占用并不大;而这一种方案是针对有大量倾斜key的情况,没法将部分key拆分出来进行单独处理,因此只能对整个RDD进行数据扩容,对内存资源要求很高。
  • 优点:对join类型的数据倾斜基本都可以处理,而且效果也相对比较显著,性能提升效果非常不错。
  • 缺点:该方案更多的是缓解数据倾斜,而不是彻底避免数据倾斜。而且需要对整个RDD进行扩容,对内存资源要求很高。

2.8、任务横切,一分为二,单独处理

  • 适用场景:导致数据倾斜的因素比较多,比较复杂的场景中。
  • 实现思路:在了解清楚数据的分布规律,以及确定了数据倾斜是由何种原因导致的,那么按照这些原因,进行数据的拆分,然后单独处理每个部分的数据,最后把结果合起来。
  • 优点:将多种简单的方案综合起来,解决一个复杂的问题。可以算上一种万能的方案。
  • 缺点:确定数据倾斜的因素比较复杂,导致解决该数据倾斜的方案比较难实现落地。代码复杂度也较高。

2.9、多种方案组合使用

        即使用上述方案的组合。

2.10、自定义Partitioner

        使用自定义的 Partitioner 实现类代替默认的 HashPartitioner,尽量将所有不同的 Key 均匀分配到不同的 Task中。

  • 适用场景:大量不同的Key被分配到了相同的Task造成该Task数据量过大。
  • 实现思路:先通过抽样,了解数据的key的分布规律,然后根据规律,去定制自己的数据分区规则,尽量保证所有的Task的数据量相差无几。
  • 实现原理:使用自定义的Partitioner(默认为HashPartitioner),将原本被分配到同一个Task的不同Key分配到不同Task。
  • 实现方案选择:
    • 随机分区
      • 优点:数据分布均匀
      • 缺点:具有相同特点的数据不会保证被分配到相同的分区
    • 轮询分区
      • 优点:确保一定不会出现数据倾斜
      • 缺点:无法根据存储/计算能力分配存储/计算压力
    • Hash散列
      • 优点:具有相同特点的数据保证被分配到相同的分区
      • 缺点:极容易产生数据倾斜
    • 范围分区
      • 优点:相邻的数据都在相同的分区
      • 缺点:部分分区的数据量会超出其他的分区,需要进行裂变以保持所有分区的数据量是均匀的,如果每个分区不排序,那么裂变就会非常困难
  • 优点:灵活,通用。
  • 缺点:必须根据对应的场景设计合理的分区方案。没有现成的方案可用,需临时实现。

2.11、Spark整合BitMap求Join

  • 优点:占用内存少,处理速度高,
  • 缺点:维护BitMap要求高。

SparkSQL & ClickHouse RoaringBitmap使用实践 文章目录简介ClickHouse简介RoaringBitmap(RBM)原理ClickHouse中使用RBM存在的问题RoaringBitmap(RBM)定制序列化实现ClickHouse中RoaringBitmap的结构解析Spark中RoaringBitmap的实现定制RBM序列化方式以兼容ClickHouseByte(1) - 类型标识生成VarInt(SerializedSizeInBytes) - 序列化后的字节长度ByteArray(RoaringBitmap) - RBM序列化定制序列化的整体 阅读详情

相关推荐

Spark数据倾斜问题+解决方案

1、数据倾斜 数据倾斜指的是,并行处理的数据集中,某一部分(如Spark或Kafka的一个Partition)的数据显著多于 其它部分,从而使得该部分的处理速度成为整个数据集处理的瓶颈 数据倾斜俩大直接致命后果 1)数据倾斜直接会导致一种情况:Out Of Memory 2)运行速度慢 主要是发生在Shuffle阶段。同样Key的数据条数太多了。导致了某个key(下图中的80亿条)所在的Task数 据量太大了。远远超过其他Task所处理的数据量 一个经验结论是:一般情况下,OOM的原因都是数据倾斜 2、如

诸葛搏毅 6771

Spark多维分析去重计数场景优化案例【BitMap精确去重的应用与踩坑】

场景 前几天遇到一个任务,从前也没太注意过这个任务,但是经常破9点了,执行时长正常也就2个小时。 看逻辑并不复杂,基本是几段SQL的JOIN操作,其中一个最耗时间的就是要根据底表数据Lateral view explode(array(字段, ‘all’)),一共lateral了4个字段,相当于数据量要扩大16倍。并且可怕的场景,lateral view之后还对11个字段进行了去重。 select a22 as a, b22 as b, c22 as c, d22 as

weixin_43272605的博客 5170

Spark之数据倾斜完美解决方案

前面给大家讲过MapReduce的数据倾斜解决方案以及优化,今天就给大家说下Spark的数据倾斜解决方案。 简单来说数据倾斜就是数据的 key 的分化严重不均,造成一部分数据很多,一部分数据很少的局面,即数据分布不均。如下图所示: 以 WordCount 为例,它的 map 阶段形成 (“xxxx”,1)的形式,然后在 reduce 阶段进行 value 相加,得出 “xxxx” 出现的次数。若进行 WordCount 的文本有100G,其中 80G 全部是 “xxxx”, 剩下 20G 是其余单词,那就

zp17834994071的博客 2293

不得不掌握的三种BitMap

点击箭头处“蓝色字”,关注我们哦!!BitMapBitmap是大数据里面常见的数据结构,简单来说就是按位存储,为了解决在去重场景里面大数据量存储问题,目前在Druid/Spark等使...

张普的专栏 4233

Spark 数据倾斜及其解决方案

本文从数据倾斜的危害、现象、原因等方面,由浅入深阐述Spark数据倾斜及其解决方案。 一、什么是数据倾斜 对 Spark/Hadoop 这样的分布式大数据系统来讲,数据量大并不可怕,可怕的是数据倾斜。 对于分布式系统而言,理想情况下,随着系统规模(节点数量)的增加,应用整体耗时线性下降。如果一台机器处理一批大量数据需要120分钟,当机器数量增加到3台时,理想的耗时为120 ...

乔治大哥的博客 976

Spark数据倾斜深度解析与实战解决方案

数据倾斜是分布式计算中因导致的性能瓶颈现象。当某些Key对应的数据量远超其他Key时,这些"热点Key"所在的Task会消耗80%以上的计算时间,成为整个作业的。

Aaron_PHPer的博客 1686

left join优化_字节跳动 SparkSQL 优化的一些建议

场景描述:面对大量复杂的数据分析需求,提供一套稳定、高效、便捷的企业级查询分析服务具有重大意义。本次演讲介绍了字节跳动基于SparkSQL建设大数据查询统一服务TQS(Toutiao Query Service)的一些实践以及在执行计划调优、数据读取剪枝、SQL兼容性等方面对SparkSQL引擎的一些优化。关键词:SparkSQL优化 字节跳动作者: 来自字节跳动数据平台查询分析团队。目标和能力为...

weixin_39622398的博客 1463

大数据面试题 —— Spark数据倾斜及其解决方案

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

hu_wei123的博客 2223

Spark数据倾斜定位及解决方案

因为自己编写的代码的bug,以及偶然出现的数据异常,也可能会导致内存溢出。此外,倒数第一列显示了每个task处理的数据量,明显可以看到,运行时间特别短的task只需要处理几百KB的数据即可,而运行时间特别长的task需要处理几千KB的数据,处理的数据量差了10倍。:该方案通常无法彻底解决数据倾斜,因为如果出现一些极端情况,比如某个key对应的数据量有100万,那么无论你的task数量增加到多少,这个对应着100万数据的key肯定还是会分配到一个task中去处理,因此注定还是会发生数据倾斜的。

m0_48457267的博客 2646

步进电机励磁模式

1. 励磁模式 步进电机的基本操作模式称为 励磁模式,能够使步进电机工作在全步模式,半步模式和微步模式,其中微步模式能够有效的降低步进电机相电流的噪声,能够改善步进电机固有的噪声震动问题。下面将介绍 3 种励磁模式。 2. 全步励磁模式 所谓全步模式,就是依据电机固有结构设计固定的步距角工作,一个电脉冲,步进电机前进一个步距角。这个步距角使电机设计结构所决定的,也可以理解为电机以最大的步距角旋转。 3. 半步励磁模式 半步模式是以电机固有的结构决定的步距角的一半角度进行步进旋转。如下图所示,步进

zhbi98 的技术 Blogs 5550

如何利用URDF文件表示并联结构(仅适用于支持SDF格式的仿真环境)

介绍了一种使用URDF文件在Gazebo中表示并联结构的方法,该方法使用了URDF的SDF拓展。在一个具有并联结构的双足机器人上应用并演示了此方法的有效性。

RobotFreak的博客 3853

Spark数据倾斜及解决方案

一,数据倾斜现象及原理 发生数据倾斜以后的现象: 1、你的大部分的task,都执行的特别特别快,刷刷刷,就执行完了(你要用client模式,standalone client,yarn client,本地机器只要一执行spark-submit脚本,就会开始打印log),task175 finished;剩下几个task,执行的特别特别慢,前面的task,一般1s可以执行完5个;最后发现1000个t...

weixin_37789219的博客 5136

Simulink Test Sequence自动化测试实战:从Excel到模型验证

本文详细介绍了如何利用Excel和MATLAB脚本实现Simulink Test Sequence的自动化测试。通过设计结构化Excel模板管理测试数据,并调用Simulink Test API批量创建与执行测试用例,该方法能显著提升复杂模型单元测试的效率,便于集成到CI/CD流程,实现从数据到验证的全自动化。

weixin_29261711的博客 144

Spark数据倾斜的七种解决方案(全)

RDD数据倾斜的解决方案1、什么是数据倾斜2、数据倾斜的表现3、如何确定数据倾斜的原因所在4、数据倾斜的解决方案方案一方案二方案三方案四方案五方案六方案七 1、什么是数据倾斜   如上图所示,在执行shuffle操作时,会根据key进行value的聚合、拉取、输出。相同的key一定会分配到同一个分区内进行处理。如上图,同一个key的values,最后一定是分配到一个reduceTask进行处理的...

我爱大数据 2333

电力电子技术复习笔记

通常在开关过程前后加入谐振,使开关开通前电压先降到0,关断前电流先降到0,消除开关过程电压、电流的重叠,降低它们的变化率,从而大大减小甚至消除开关损耗。小信号线性化模型的原理:忽略开关频率分量和开关频率谐波分量及其边频分量,建立占空比、输入电压等的低频扰动对变换器中的电压、电流影响的模型。解:可以利用变压器的变比改变输出电压大小,避免控制过程的占空比过小或过大,提高控制精度,同时有利于减轻输出电路中电力电子器件的耐压要求。驱动电路:用于控制功率半导体器件的开关,从而控制电路的电流和电压。

Miracle Fan的博客 1万+

INMP441麦克风与ESP32的I2S音频采集实战指南

本文提供了INMP441数字麦克风与ESP32开发板通过I2S接口进行高质量音频采集的完整实战指南。详细讲解了硬件连接、软件配置、数据读取及基础处理,并分享了常见的避坑技巧与性能优化建议,帮助开发者快速构建物联网音频应用。

weixin_28396629的博客 598

Spark 优化——数据倾斜解决方案

目录 一、什么是数据倾斜 数据倾斜的表现: 定位数据倾斜问题: 二、解决方案 解决方案一:聚合原数据 1) 避免 shuffle 过程 2) 缩小 key 粒度(增大数据倾斜可能性,降低每个 task 的数据量) 3) 增大 key 粒度(减小数据倾斜可能性,增大每个 task 的数据量) 解决方案二:过滤导致倾斜的 key 解决方案三:提高 shuffle 操作中的 reduce 并行度 reduce 端并行度的设置 reduce 端并行度设置存在的缺陷 解决方案四:使用随机 k

TRX的博客 1181

ESP-IDF下载配合MQTT协议接入云平台实例

通过ESP-IDF下载环境搭建,结合MQTT协议实现设备与云平台通信,详解从配置到连接的完整流程,助力物联网应用开发。重点涵盖espidf下载和MQTT集成关键步骤。

weixin_28913879的博客 454

hive/spark数据倾斜解决方案

数据倾斜主要表现在,mapreduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条Key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完。

运维仙人 2346

今日头条面试——iOS开发面试题

layoutIfNeeded和setNeedsLayout的区别。* Pod update和pod install的区别。* 10、autoreleasepool的使用场景。* 如何hook一个对象的方法,而不影响其它对象。* 数组cop后里面的元素会复制一份新的吗。* 介绍项目,主要介绍自己强项一点的地方。* assing可以使用在对象中吗。* isEquel和hash的关系。* 4、谈谈runtime的理解。* 8、谈谈runloop的理解。* copy和strong的区别。

FPGA/MATLAB学习教程/源码/项目合作开发 594

408 | 408常用计算公式与方法 —— 计组篇 汇总

408常用计算公式与方法 —— 计算机组成原理篇 汇总

"You are worthy! You can do it!" 4656

Spark(34):Spark之数据倾斜和解决方案

Spark 中的数据倾斜问题主要指 shuffle 过程中出现的数据倾斜问题,是由于不同的 key 对应的数据量不同导致的不同 task 所处理的数据量不同的问题。例如,reduce 点一共要处理 100 万条数据,第一个和第二个 task 分别被分配到了 1 万条数据,计算 5 分钟内完成,第三个 task 分配到了 98 万数据,此时第三个 task 可能需要 10 个小时完成,这使得整个 Spark 作业需要 10 个小时才能运行完成,这就是数据倾斜所带来的后果。

yang_shibiao的博客 4278

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spark 数据倾斜解决方案

Spark 数据倾斜解决方案

super_chenzhou 276

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spark中常见的数据倾斜现象及解决方案

在Spark中,数据倾斜(Data Skew)是一个常见的问题,它会导致某些任务处理的数据量远大于其他任务,从而引发性能瓶颈,降低整个作业的执行效率。以下是Spark中常见的数据倾斜现象及其解决方案。‌某些任务执行时间过长‌:‌资源利用率不均衡‌:‌Shuffle阶段性能瓶颈‌:‌作业失败或内存溢出‌:‌数据分布不均‌:‌Join操作中的倾斜‌:‌数据预处理不当‌:‌加盐(Salting)‌:‌自定义Partitioner‌:‌避免使用‌:‌使用代替‌:‌过滤异常数据‌:‌重新分区(Repartitioni

Made In SQL 2126

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Spark 数据倾斜的解决方案

Spark 数据倾斜的解决方案Shuffle 时导致的数据倾斜第一种解决方案:使用 Hive ETL 对数据进行预处理 Shuffle 时导致的数据倾斜 当 Shuffle 时出现了数据倾斜,我们一般的问题排查步骤 ① 查看 WEB-UI 页面,查看各个 Job 的 Stage 中 Task 的执行情况,是否有明显执行时间过长的情况 ② 如果任务报错,查看对应的日志异常堆栈信息,是否有内存溢出的情况 第一种解决方案:使用 Hive ETL 对数据进行预处理 如果 Spark 的计算数据是从 Hive 的

半吊子Kyle的博客 401
上一篇: Spark源码解析(八)Spark Shuffle发展历程
下一篇: Flink源码解析(四)Flink应用程序的提交
Yuan_CSDF
博客等级 码龄10年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值