spark典型优化方式

1:reduce task数目不合适

    解决方式:

        设置合理的并行度有利于充分利用集群资源,提升spark应用的性能。Spark官方的推荐,给集群中的每个cpu core设置2~3个task。数量太大造成很多小任务,增加启动任务的开销;数目太少,任务运行缓慢。

    设置方法:

        手动使用textFile()、parallelize()等方法的第二个参数来设置并行度

        也可以使用spark.default.parallelism参数,来设置统一的并行度

        比如说,spark-submit设置了executor数量是10个,每个executor分配2个core,那么application总共会有20个core。此时可以设置new SparkConf().set("spark.default.parallelism", "60")来设置合理的并行度,从而充分利用资源。

2:shuffle磁盘IO时间长

    解决方式:

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

3:map|reduce task数量大,造成shuffle过程小文件数目多

    解决方式:

        默认情况下shuffle文件数目为map tasks * reduce tasks,通过设置spark.shuffle.consolidateFiles为true,来合并shuffle中间文件。每个计算核心只产生一批文件,同一个核心后面运行的task复用前面task产生的中间文件,此时文件数为cores * reduce tasks数目;

    设置方法:

        new SparkConf().set("spark.shuffle.consolidateFiles", "true")

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 Streaming 运行速度突然下降了,经常会有任务延迟和阻塞

    解决方案:

        这是因为我们设置job启动interval时间间隔太短了,导致每次job在指定时间无法正常执行完成,换句话说就是创建的windows窗口时间间隔太密集了;

转载于:https://my.oschina.net/puwenchao/blog/729708

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值