美文网首页
Spark性能优化的10大问题及其解决方案

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

作者: felix_feng | 来源:发表于2016-09-07 14:49 被阅读325次

    (转载 http://book.51cto.com/art/201409/453045.htm)

    问题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 把那些持续慢的节点去掉;

    问题9: 通过多步骤的RDD操作后有很多空任务或者小任务产生

    解决方式:

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

    问题10:Spark Streaming吞吐量不高

    解决方式:

    可以设置spark.streaming.concurrentJobs

    问题11、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上。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/poujettx.html