首页 > 编程语言> > |NO.Z.00038|——————————|BigDataEnd|——|Hadoop&Spark.V12|------------------------------------------|Spa
|NO.Z.00038|——————————|BigDataEnd|——|Hadoop&Spark.V12|------------------------------------------|Spa
作者:互联网
[BigDataHadoop:Hadoop&Spark.V12] [BigDataHadoop.Spark内存级快速计算引擎][|章节二|Hadoop|spark|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共用此广播变量,
~~~ 这样就节约了网络及内存资源
===============================END===============================
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
来自为知笔记(Wiz)
标签:编程,并行度,---,RDD,内存,Spark,### 来源: https://www.cnblogs.com/yanqivip/p/16134657.html