Spark性能优化——数据倾斜-groupByKey导致内存溢出

一、永磁同步电机矢量控制——电机数学模型 本文介绍了永磁同步电机(PMSM)的数学模型构建方法,重点分析了不同坐标系(三相静止、α-β静止、d-q旋转)下的电压方程、磁链表达式及电磁转矩计算方法。通过Clark和Park变换简化非线性耦合系统,推导了表贴式(SPMSM)与内置式(IPMSM)电机的电压方程差异,并给出α-β和d-q坐标系下的转矩公式,强调磁链与电流的正交性对转矩的影响。全文基于理想假设,为后续电机控制算法(如FOC、DTC)提供理论基础。 阅读详情

数据倾斜:shuffle操作时,由于相同key会被分配到同一个reduce端执行,而大部分数据的key值相同,导致部分task处理的数据量过大,分配不均。

触发shuffle的常见算子:distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup、repartition等。

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

根据执行操作的不同,可以有很多种查看key分布的方式:

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

  • 2、如果是Spark RDD执行shuffle算子导致的数据倾斜,那么可以在Spark作业中加入查看key分布的代码,比如RDD.countByKey()。然后对统计出来各个key出现的次数,collect、take到客户端打印一下,就可以看到key的分布情况。

原理:将原本相同的key通过附加随机前缀的方式,变成多个不同key,就可以让原本被一个task处理的数据分散到多个task上做局部聚合,进行解决单个task处理数据量过多的问题。接着去除随机前缀,再次进行全局的聚合,就可以得到最终的结果。

object _01SparkDataSkewTwoStageOps {
    def main(args: Array[String]): Unit = {
        Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN)
        Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
        Logger.getLogger("org.project-spark").setLevel(Level.WARN)
        val sc = SparkUtil.sparkContext("local[2]", "_01SparkDataSkewTwoStageOps")
        val list = List(
            "hello you hello hello me",
            "hello you hello hello shit",
            "oh hello she study"
        )

        val listRDD = sc.parallelize(list)

        val pairsRDD = listRDD.flatMap(line => line.split("\\s+")).map((_, 1))
        //step 1 找到发生数据倾斜key
        val sampleRDD = pairsRDD.sample(false, 0.6)
        val cbk= sampleRDD.countByKey()
        // cbkRDD.foreach(println)
        val sortedInfo = cbk.toBuffer.sortWith((t1, t2) => t1._2 > t2._2)
        val dataSkewKey = sortedInfo.head._1
        // sortedInfo.foreach(println)
        println("发生了数据倾斜的Key:" + dataSkewKey)
        //step 2 给对应的key打上N以内的随机前缀
        val prefixPairsRDD = pairsRDD.map{case (word, count) => {
            if(word.equals(dataSkewKey)) {
                val random = new Random()
                val prefix = random.nextInt(2)//0 1
                (s"${prefix}_${word}", count)
            } else {
                (word, count)
            }
        }}
        prefixPairsRDD.foreach(println)
        //step 3 局部聚合
        val partAggrInfo = prefixPairsRDD.reduceByKey(_+_)
        println("===============>局部聚合之后的结果:")
        partAggrInfo.foreach(println)
        //step 4 全局聚合
        //step 4.1 去掉前缀
        val unPrefixPairRDD = partAggrInfo.map{case (word, count) => {
            if(word.contains("_")) {
                (word.substring(word.indexOf("_") + 1), count)
            } else {
                (word, count)
            }
        }}
        println("================>去掉随机前缀之后的结果:")
        unPrefixPairRDD.foreach(println)
        // step 4.2 全局聚合
        val fullAggrInfo = unPrefixPairRDD.reduceByKey(_+_)
        println("===============>全局聚合之后的结果:")
        fullAggrInfo.foreach(println)
        sc.stop()
    }
}

先聚合小数据集,再聚合整体。

Post author: Tony Wang
Post link: https://www.yeah366.com/posts/3318546812.html
Copyright Notice: All articles in this blog are licensed under BY-NC-SA unless stating additionally.

ubuntu20.04屏幕亮度无法调节(亮度条调节无效)的简单靠谱解决方案及踩坑历程 0 前言   网上关于ubuntu系统亮度无法调节的问题的解决方法有很多,但是绝大部分并没有什么用(这也是我自己的亲身体会),或者并不靠谱。在遍尝各路方法过后,我终于解决了这一棘手的问题(毕竟最大亮度真的非常刺眼,无法长时间直视),在此记录一下踩坑历程以及最后的解决方案。 1 Naive方法   由于使用需要,最近在电脑原有的win10基础上安装了ubuntu双系统。我安装的是当前新版的ubuntu20.04.2.0,靠谱的安装教程可以参考这里。   之前师兄说双ssd安装双系统会有系统启动引导的问题出现, 阅读详情

相关推荐

【SAP PO】SAP PO 接口配置完整教程之一RFC服务发布

SAP RFC开发,PO接口配置

XLevon的博客 2万+

Spark sql 连续join次数太多导致内存溢出

通过一次内存溢出问题,教你使用jvisualvm来分析堆存储文件。spark多次join导致内存溢出,java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOf(Arrays.java:3332) at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)。

ilyomind的博客 2855

从零搭建VGGNet

在 forward 方法中实现了前向传播过程,包括卷积、激活、池化和平铺操作,最后通过全连接层得到分类结果。使用 torch.onnx.export 将模型导出为 ONNX 格式的文件 vgg.onnx。导出 ONNX:将模型导出为 ONNX 格式,便于在其他平台或框架中使用。定义 VGG 网络:构建了一个包含多个卷积层、池化层和全连接层的网络。使用 torch.save 将整个模型保存为 vgg.pth 文件。前向传播:对输入数据进行前向传播,得到输出结果。保存模型:将模型保存为 .pth 文件。

开源驱动,创造价值;坦诚清晰,快速失败;让复杂可计算。 520

记一次奇葩的Spark内存溢出OOM

错误信息如下: org.apache.spark.memory.SparkOutOfMemoryError: Unable to acquire 1048576 bytes of memory, got 65536 内存溢出的位置:做JOIN操作的时候,内存溢出了。 首先,定位下任务使用的资源, 其次,调参数 --driver-cores 4 \ --driver-memory 8G \ --executor-cores 4 \ --executor-memory 16G \ -..

Toby的博客 2129

突破NER性能瓶颈:BERT与LLM协同的混合架构实践

性能卓越:在多个测试集上,F1分数比单一模型提升5-15%成本可控:相比纯LLM方案,成本降低60%以上易于落地:架构清晰,便于调试和优化这种"专才+通才"的组合思路可以扩展到其他NLP任务中,如关系抽取、事件提取、文本分类等。更精细的流水线优化多模型投票机制在线学习与自适应调整不追求单一模型的万能,而是通过精心设计的组合,让每个组件发挥其独特优势,最终实现系统性能的最优化。欢迎在评论区分享你在NER任务中的实践经验,或者对这个混合架构的改进建议!

Ven%的博客 1020

避开PSRR仿真三大坑:用Cadence psspxf分析分频器时,这些设置错了白忙活

本文深入探讨了使用Cadence psspxf工具进行分频器PSRR仿真时常见的三大技术陷阱,包括扰动信号参数设置、收敛性优化和后处理信号提取。通过详细的参数推荐和实战技巧,帮助工程师避免仿真误差,提升PSRR分析效率与准确性,特别适用于16分频器等数字-模拟混合电路设计。

weixin_29258297的博客 299

Spark基本的RDD算子之groupBy,groupByKey,mapValues

1.groupby def groupBy[K: ClassTag](f: T => K): RDD[(K, Iterable[T])] def groupBy[K: ClassTag](f: T => K, numPartitions: Int): RDD[(K, Iterable[T])] def groupBy[K: ClassTa...

weixin_34375054的博客 1424

EduCoder 计算机网络实验 IP协议分析

第1关:跟踪抓包 任务描述 相关知识 IPV4数据包 截获数据报 分析截获结果 使用git将本地文件推送到远程仓库永久保存 操作要求 任务描述 本关任务:使用 Ping 命令发送数据报,用 Wireshark 截获数据报,分析 IP 数据报的格式,理解 IPV4 地址的编址方法,加深对 IP 协议的理解。 相关知识 为了完成本关任务,你需要掌握: 截获数据报; 简单分析数据包格式。 IPV4数据包 网际协议第 4 版(Internet Protocol version 4

qq_41975868的博客 1万+

大数据之Spark:spark shuffle的优化

目录1.问题:spark shuffle如何优化?2.分析:3.优化方案3.1:算子方面3.2:参数调优 1.问题:spark shuffle如何优化? 2.分析: 可以从两方面考虑,第一方面宽依赖算子可以产生shuffle,我们可以从算子的角度,进行优化; 第二方面产生shuffle了怎么半,我们可以从参数调优方面考虑; 3.优化方案 3.1:算子方面 1)当进行联合的规约操作时,避免使用 groupByKey。 举个例子,rdd.groupByKey().mapValues(_ .sum) 与 rdd.

weixin_43597208的博客 385

NAO V6 开发环境的配置(附所有文件)

NAO V6开发环境配置前言环境Robot SettingsChoregraphe 2.8.5.10python2.7+naoqi2.8+opencv4.1.0putty与FileZilla 前言 学校的机器人摸索了一段时间,之前摸爬滚打探索环境,之前没接触这类机器人可能会非常艰辛,希望能给需要的人一些帮助。Nao与pepper通用 环境 win10(x64)+naoqi2.8 1、Robot S...

wbhhello的博客 3217

走向审计4.0:内部审计数字化转型的路径与方法

企业的内部审计人员可以以数字化为手段,建立内部审计新生态,在数字化过程中引进战略审计、服务审计、开放审计、敏捷审计、数字审计、智慧审计等理念、方法和工具,完成数智生态审计转型。内部审计的审计对象远比国家审计和公众审计丰富和多元化,理论上企业经营管理和日常操作的各个方面都可以成为内部审计的对象,此外还可以开展独立咨询活动。由于内部审计的数字化或数字化的内部审计是实现审计数字化转型的必要条件,是实现“数字引领、数据强审”目标的核心手段,因此企业内部审计部门势必要投入足够的资金和人才来打造一支数字化审计新队伍。

一键难忘的博客 6735

解决spark streaming 聚合算子(shuffle)并行度200及缓存buffer不断增大的问题

问题现象: spark流式计算中做聚合需要使用 group by算子,我在使用过程中遇到一些问题,通过stage图可以看出2个问题: 1. 聚合算子每个批次shuffle write的数据量直线上升,这样会导致算子得效率逐渐降低,甚至会导致oom 2.聚合算子(shuffle)的并行度是200,即使设置spark.sql.shuffle.partitions=10也不生效。200并行度会增加调度压力,并且会把并行度传递到下游(如果不做repartition)。我的业务中会把数据写入iceberg..

大数据开发实践者 2247

广东省道路工程检测练习试题(判断题)真题

按下式计算小于某粒径颗粒质量百分数:X=(A/B)x100( )49.、挖坑灌砂法适用于在现场测定基层(或底基层)、砂石路面及路基土的各种材料压实层的密度和压实度,但不适用于填石路堤等有大孔洞或大孔隙材料的压实度检测。95.挖坑灌砂法适用于在现场测定基层(或底基层)、砂石路面及路基土的各种材料压实层的密度和压实度,但不适用于填石路堤等有大孔洞或大孔隙材料的压实度检测( )107.以干密度 pd 为纵坐标,含水率w为横坐标,绘 pd-w 关系曲线,曲线上峰值点的纵、横坐标分别为最大干密度和最佳含水率( )

ZShy001238的博客 681

Spark数据倾斜及解决方案

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

weixin_37789219的博客 5136

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

spark rdd之groupByKey

GroupByKey操作可能非常昂贵。如果您正在分组以便对每个键执行聚合(例如求和或平均),则使用 `aggregateByKey` 或` reduceByKey` 将提供更好的性能。 >注意:按照目前的实现,groupByKey 必须能够保存内存中任何键的所有键值对。如果一个键的值太多,造成数据倾斜,可能会导致 `OutOfMemoryError`

南风知我意 1345

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spark性能优化【三】- 数据倾斜调优

调优概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题——数据倾斜,此时Spark作业的性能会比期望差很多。数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能。 数据倾斜发生时的现象 绝大多数task执行得都非常快,但个别task执行极慢。比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时。这种情况很常见。 原本能够正常执行的Spark作业,某天突然报出OOM(内存溢出)异常,观察异常

Rnan_prince的博客 340

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spark中Data skew(数据倾斜)Java+Python+Scala三种接口完整代码

---------------------------------------------------------起因---------------------------------------------------------------------- 代码中shuffle的算子存在的地方,groupByKey、countByKey、reduceByKey、join等 ----------...

微电子学与固体电子学-俞驰 1097

Spark优化大全总结实操,含数据格式/数据倾斜/算子优化/Join优化/参数调优等

Spark优化总结大全,含数据格式/数据倾斜/算子优化/Join优化/参数调优等,spark任务重RDD持久化数据在Executor内存中占用比例为60%,当数据量较大内存放不下时,就会溢写到磁盘,如果spark任务中有较多需持久化的RDD,建议调大此参,避免内存不足时数据只能写磁盘的情况.若没有或者发现作业频繁gc或者运行较慢时,则可适当调小此比例。如果觉得数据发生了倾斜(数据分布不均,很多数据都打到了一个分区中),建议在Join之前先进行Repartition操作,增加分区数,这样可以将分区内的数据打散

qq_39285950的博客 4083

spark数据倾斜解决方案

现象        当你的应用程序发生以下情况时你该考虑下数据倾斜的问题了: 绝大多数task都可以愉快的执行,总有那么个别task比较慢。比如,假设有10000个task,其中9998个task都很快的给出了结果,还剩那两个慢的拖慢了整个应用,这种情况很常见。 原本能够正常执行的Spark作业,某天突然报出OOM(内存溢出)异常,这种情况比较少见。 为什么会出现数据倾斜发生?   在进行sh...

weixin_43087634的博客 317

大数据系列之Spark性能优化案例详细《转载》

​ 大数据系列之Spark性能优化案例分析 ​

weixin_48978790的博客 1089

Spark 解决数据倾斜

数据倾斜是大数据计算中一个最棘手的问题,出现数据倾斜后,Spark 作业的性能会比期望值差很多。数据倾斜的调优,就是利用各种技术方案解决不同类型的数据倾斜问题,保证 Spark 作业的性能。 一,数据倾斜原理 一个 Spark 作业,会根据其内部的 Action 操作划分成多个 job,每个 job 内部又会根据 shuffle 操作划分成多个 stage,然后每个 stage 会分配多个 task 去执行任务。每个 task 会领取一个 partition 的数据处理。 同一个 stage 内的 t

xiaopeigen的专栏 249

从‘分组’到‘聚合’:图解Spark算子reduceByKey与groupByKey的核心差异与选型指南

本文深入解析Spark算子reduceByKey与groupByKey的核心差异,通过可视化流程图和场景化决策树,帮助开发者在统计指标计算、数据去重等业务场景中做出最优选择。重点揭示reduceByKey的预聚合优势,对比Shuffle阶段性能差异,并提供高级优化技巧与数据倾斜应对策略。

weixin_30876945的博客 618

Spark零基础入门第十课:spark数据倾斜后怎么办??

Spark零基础入门第九课:spark数据倾斜 没有看前面的同学可以回顾一下: 9.Spark性能优化-开发调优 8.SparkCore 调优之内存模型 8.SparkCore 调优之内存模型 7.SparkCore 核心知识复习与核心机制详解 6.Spark共享变量之累加器和广播变量的使用!!! 5.RDD常用算子用法训练(附习题答案)(aggregateByKey与combineByKey)!!! 4.Spark Rdd常用算子和RDD必备知识 3.spark core 核心知识 2.spark 之

蛋蛋淡淡定的庄园 1122

【云计算大数据】Spark数据倾斜解决方案

1、原理以及现象分析 1.1、数据倾斜怎么出现的 在执行shuffle操作的时候,是按照key,来进行values的数据的输出、拉取和聚合的。 同一个key的values,一定是分配到一个reduce task进行处理的。 多个key对应的values,比如一共是90万。可能某个key对应了88万数据,被分配到一个task上去面去执行。 另外两个task,可能各分配到了1万数据,可能是数百个key,对应的1万条数据。 这样就会出现数据倾斜问题。 想象一下,出现数据倾斜以后的运行的情况。很糟糕! 其中两个ta

技术专家 212

从Shuffle到性能:深度剖析Spark中reduceByKey与groupByKey的底层差异

本文深度剖析了Spark中reduceByKey与groupByKey的底层差异,重点解析了Shuffle性能优化的关键。通过对比两种操作在预聚合、内存管理和执行计划上的区别,揭示了reduceByKey如何通过本地聚合大幅减少数据传输量,同时探讨了groupByKey在特定场景下的不可替代性。文章还提供了实用的性能调优技巧,帮助开发者优化Spark作业效率。

weixin_30621959的博客 420

spark 数据倾斜

一. 数据倾斜的现象1、spark中一个stage的执行时间受限于最后那个执行完的task,因此运行缓慢的任务会拖累整个程序的运行速度(分布式程序运行的速度是由最慢的那个task决定的)比如,总共有1000个task,997个task都在1分钟之内执行完了,但是剩余两三个task却要一两个小时。这种情况很常见。  2、原本能够正常执行的Spark作业,某天突然报出OOM(内存溢出)异常,观察异常栈...

zhuiqiuuuu的博客 1099
上一篇: Spark代码可读性与性能优化——示例六(groupBy、reduceByKey、aggregateByKey)
下一篇: Delta Lake
Accelerating
博客等级 码龄9年 3220粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值