spark 性能调优

spark sql 性能调优
https://endymecy.gitbooks.io/spark-programming-guide-zh-cn/content/spark-sql/performance-tuning.html
http://blog.csdn.net/book_mmicky/article/details/40394081

spark 优化
http://litaotao.github.io/boost-spark-application-performance?s=inner

spark使用总结:里边有一些分区的优化以及原理
http://smallx.me/2016/06/07/spark%E4%BD%BF%E7%94%A8%E6%80%BB%E7%BB%93/

Apache Spark Jobs 性能调优(一)
https://www.zybuluo.com/xiaop1987/note/76737#什么时候不发生-shuffle

请在action之后unpersisit!
http://bourneli.github.io/scala/spark/2016/06/17/spark-unpersist-after-action.html

一、并行度
Spark 提供了两种方法来对操作的并行度进行调优。第一种方法是在数据混洗操作时,使用参数的方式为混洗后的 RDD 指定并行度。第二种方法是对于任何已有的 RDD,可以进行重新分区来获取更多或者更少的分区数。重新分区操作通过 repartition() 实现,该操作会把 RDD 随机打乱并分成设定的分区数目。如果你确定要减少 RDD 分区,可以使用coalesce() 操作。由于没有打乱数据,该操作比 repartition() 更为高效。如果你认为当前的并行度过高或者过低,可以利用这些方法对数据分布进行重新调整。

repartition vs coalesce
https://blog.csdn.net/high2011/article/details/78842739

二、序列化格式
Spark 需要通过网络传输数据,或是将数据溢写到磁盘上时,Spark 需要把数据序列化为二进制格式。序列化会在数据进行混洗操作时发生,此时有可能需要通过网络传输大量数据。要使用 Kryo 序列化工具,你需要设置 spark.serializer 为 org.apache.spark.serializer.KryoSerializer。为了获得最佳性能,你还应该向 Kryo 注册你想要序列化的类,注册类可以让 Kryo 避免把每个对象的完整的类名写下来,成千上万条记录累计节省的空间相当可观。如果你想强制要求这种注册,可以把 spark.kryo.registrationRequired 设置为 true,这样 Kryo 会在遇到未注册的类时抛出错误

很多 JVM 都支持通过一个特别的选项来帮助调试这一情况:"-Dsun.io.serialization.extended DebugInfo=true”。你可 以 通 过 设 置 spark-submit 的 --driver-java-options 和 --executor-java-options 标 记来打开这个选项。

conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
conf.set("spark.kryo.registrationRequired", "true")
conf.registerKryoClasses(Array(classOf[MyClass], classOf[MyOtherClass]))

3种rdd的存储策略:未序列化的Java对象存在内存中,序列化的数据存于内存中以及存储于磁盘中,对于内存使用LRU回收算法(最近最久未使用)

三、 内存管理
(1)RDD存储,调用 RDD 的 persist() 或 cache() 方法时,spark.storage.memoryFraction
(2)数据混洗与聚合的缓存区,spark.shuffle.memoryFraction
(3)用户代码,用户的函数可以自行申请大量堆内存

缓存序列化后的对象而非直接缓存,MEMORY_ONLY_SER 或者 MEMORY_AND_DISK_SER 的存储等级,显著减少 JVM 的垃圾回收时间,垃圾回收的代价与堆里的对象数目相关,而不是和数据的字节数相关。这种缓存方式会把大量对象序列化为一个巨大的缓存区对象

四、硬件
影响集群规模的主要参数包括分配给每个执行器节点的内存大小(spark.executor.memory)、每个执行器节点占用的核心数(spark.executor.cores)、执行器节点总数(–numexecutors),以及用来存储临时数据的本地磁盘数量(在数据混洗操作中存储临时数据,一般的做法是在磁盘的每个分卷中都为Spark 设置一个本地目录。写操作会被均衡地分配到所有提供的目录中。磁盘越多,可以提供的总吞吐量就越高)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值