|NO.Z.00038|——————————|BigDataEnd|——|Hadoop&Spark.V12|——|Spark.v12|sparkcore|RDD编程高阶&spark原理初探&RDD编程优化|
一、RDD编程优化
### --- RDD复用
~~~ 避免创建重复的RDD。在开发过程中要注意:
~~~ 对于同一份数据,只应该创建一个RDD,不要创建多个RDD来代表同一份数据。
### --- RDD缓存/持久化
~~~ 当多次对同一个RDD执行算子操作时,每一次都会对这个RDD以之前的父RDD重新计算一次,
~~~ 这种情况是必须要避免的,对同一个RDD的重复计算是对资源的极大浪费
~~~ 对多次使用的RDD进行持久化,通过持久化将公共RDD的数据缓存到内存/磁盘中,
~~~ 之后对于公共RDD的计算都会从内存/磁盘中直接获取RDD数据RDD的持久化是可以进行序列化的,
~~~ 当内存无法将RDD的数据完整的进行存放的时候,
~~~ 可以考虑使用序列化的方式减小数据体积,将数据完整存储在内存中
### --- 巧用 filter
~~~ 尽可能早的执行filter操作,过滤无用数据
~~~ 在filter过滤掉较多数据后,使用 coalesce 对数据进行重分区
### --- 使用高性能算子
~~~ 避免使用groupByKey,根据场景选择使用高性能的聚合算子 reduceByKey、aggregateByKey
~~~ coalesce、repartition,在可能的情况下优先选择没有shuffle的操作
~~~ foreachPartition 优化输出操作
~~~ map、mapPartitions,选择合理的选择算子mapPartitions性能更好,但数据量大时容易导致OOM
~~~ 用 repartitionAndSortWithinPartitions 替代 repartition + sort 操作
~~~ 合理使用 cache、persist、checkpoint,选择合理的数据存储级别
~~~ filter的使用
~~~ 减少对数据源的扫描(算法复杂了)
### --- 设置合理的并行度
~~~ Spark作业中的并行度指各个stage的task的数量
~~~ 设置合理的并行度,让并行度与资源相匹配。
~~~ 简单来说就是在资源允许的前提下,并行度要设置的尽可能大,达到可以充分利用集群资源。
~~~ 合理的设置并行度,可以提升整个Spark作业的性能和运行速度
### --- 广播大变量
~~~ 默认情况下,task中的算子中如果使用了外部变量,
~~~ 每个task都会获取一份变量的复本,这会造多余的网络传输和内存消耗
~~~ 使用广播变量,只会在每个Executor保存一个副本,Executor的所有task共用此广播变量,
~~~ 这样就节约了网络及内存资源
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv016-spark.v01
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」