Spark Spark性能优化的10大问题及其解决方案


1. reduce task数目不合适

Application isn’t using all of the Cores: How to set the Cores used by a Spark App

解决方式:

需根据实际情况调节默认配置,调整方式是修改参数 spark.default.parallelism 。通常,reduce 数目设置为 core 数目的2到3倍。数量太大,造成很多小任务,增加启动任务的开销;数目太少,任务运行缓慢

spark-env.sh 里设置 spark.deploy.defaultCores 或 spark.cores.max

2. shuffle磁盘IO时间长

解决方式:

设置 spark.local.dir 为多个磁盘,并设置磁盘为 IO 速度快的磁盘,通过增加 IO 来优化 shuffle 性能;

3. map|reduce数量大,造成shuffle小文件数目多

解决方式:

默认情况下 shuffle 文件数目为 map tasks * reduce tasks

通过设置 spark.shuffle.consolidateFiles 为 true,来合并 shuffle 中间文件,此时文件数为 reduce tasks 数目;

4. 序列化时间长、结果大

解决方式:

Spark默认使.用JDK.自带的 ObjectOutputStream ,这种方式产生的结果大、CPU处理时间长,可以通过设置 spark.serializer 为org.apache.spark.serializer.KryoSerializer。

另外如果结果已经很大,可以使用广播变量;

5. 单条记录消耗大

解决方式:

使用 mapPartition 替换 map,mapPartition 是对每个 Partition 进行计算,而 map 是对 partition 中的每条记录进行计算;

6. collect输出大量结果时速度慢

解决方式:

collect 源码中是把所有的结果以一个 Array 的方式放在内存中,可以直接输出到分布式?文件系统,然后查看文件系统中的内容;

7. 任务执行速度倾斜

解决方式:

如果是数据倾斜,一般是 partition key 取的不好,可以考虑其它的并行处理方式 ,并在中间加上 aggregation 操作;

如果是 Worker 倾斜,例如在某些 worker 上的 executor 执行缓慢,可以通过设置 spark.speculation = true 把那些持续慢的节点去掉;

8. 通过多步骤的RDD操作后有很多空任务或者小任务产生

解决方式:

使用 coalesce 或repartition 去减少 RDD 中 partition 数量;

9. Spark Streaming吞吐量不高

解决方式:

可以设置 spark.streaming.concurrentJobs

10. Spark Executor OOM: How to set Memory Parameters on Spark

OOM是内存里堆的东西太多了

1、增加job的并行度,即增加 job 的 partition 数量,把大数据集切分成更小的数据,可以减少一次性load到内存中的数据量。InputFomart, getSplit 来确定。

2、spark.storage.memoryFraction

管理 executor 中 RDD 和运行任务时的内存比例,如果shuffle比较小,只需要一点点 shuffle memory,那么就调大这个比例。默认是0.6。不能比老年代还要大。大了就是浪费。

3、spark.executor.memory 如果还是不行,那么就要加 Executor 的内存了,改完 executor 内存后,这个需要重启。

5、Class Not Found: Classpath Issues

问题1、缺少jar,不在 classpath 里。

问题2、jar包冲突,同一个jar不同版本。

解决1:

将所有依赖 jar 都打入到一个 fatJar 包里,然后手动设置依赖到指定每台机器的DIR。

val conf = new SparkConf()
    .setAppName(appName)
    .setJars(Seq(System.getProperty("user.dir") + "/target/scala-2.10/sparktest.jar"))

解决2:

把所需要的依赖jar包都放到 default classpath 里,分发到各个 worker node 上。


文章作者: hnbian
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 hnbian !
评论
  目录