Spark调优(并行度调优、序列化格式优化、内存管理优化、Spark SQL性能优化)
*以下内容由《Spark快速大数据分析》整理所得。
读书笔记的第五部分是讲的是Spark调优相关的知识点。
一、并行度调优
二、序列化格式优化
三、内存管理优化
四、Spark SQL性能优化
一、并行度调优
并行度调优有两种方法:
1. 是在数据混洗操作时,使用参数的方式为混洗后的RDD指定并行度。
2. 对于任何已有的RDD,可以进行重新分区来获取更多或者更少的分区数。重新分区操作通过 repartition() 实现,该操作会把 RDD随机打乱并分成设定的分区数目。如果你确定要减少RDD分区,可以使用 coalesce() 操作。由于没有打乱数据,该操作比 repartition()
例子:在PySpark shell中合并分区过多的RDD
# 以可以匹配数千个文件的通配字符串作为输入
>>> input = sc.textFile("s3n://log-files/2014/*.log")
>>> input.getNumPartitions() # 得到分区数
35154
# 排除掉大部分数据的筛选方法
>>> lines = input.filter(lambda line: line.startswith("2014-10-17"))
>>> lines.getNumPartitions()
35154
# 在缓存lines之前先对其进行合并分区操作(即:合并分区->缓存转化操作)
>>> lines = lines.coalesce(5).cache()
>>> lines.getNumPartitions()
4
# 可以在合并之后的RDD上进行后续分析(即:行为操作)
>>> lines.count()
二、序列化格式优化
序列化会在数据进行混洗操作时发生。使用Kryo序列化工具,可以提供比Java的序列化工具更短的序列化时间和更高压缩比的二进制表示。你只需要设置 spark.serializer 为 org.apache.spark.serializer.KryoSerializer
例子:使用 Kryo 序列化工具并注册所需类
val conf = new SparkConf()
conf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
三、内存管理优化
内存管理的优化可以从三块地方下手:
1. RDD存储:当调用RDD的 persist() 或cache()方法时,这个RDD的分区会被存储到缓存区中。Spark会根据 spark.storage.memoryFraction
2. 数据混洗与聚合的缓存区:当进行数据混洗操作时,Spark会创建出一些中间缓存区来存储数据混洗的输出数据。根据 spark.shuffle.memoryFraction
3. 用户代码:Spark可以执行任意的用户代码,所以用户的函数可以自行申请大量内存。用户代码可以访问JVM堆空间中除分配给 RDD存储和数据混洗存储以外的全部剩余空间(默认20%)。
注意:如果用户代码中分配了大量的对象,那么降低RDD存储和数据混洗存储所占用的空间可以有效避免程序内存不足的情况。
四、Spark SQL性能调优
beeline> set spark.sql.codegen=true;
曼彻斯特大学 数据科学研究生 已毕业
现居地:深圳
兴趣领域:数据挖掘,机器学习及计算机视觉