1.正确使用转换操作,明确何时应该减少shuffle,何时应该增加shuffle。
2.恰当的资源配置,资源配置不当会严重影响作业性能,哪怕你代码上无懈可击。
以上是粗略的小结,具体请看Cloudera的两篇关于Spark调优的博客, How-to: Tune Your Apache Spark Jobs (Part 1)
————————————————————————————————————————————————————————————————————
spark作为一个将大部分中间数据扔在内存里做中间辗转地的分布式框架,为人所熟知的是它优秀灵活的计算能力,但越是灵活的东西越需要一些奇技淫巧。
这里说一些在处理大量数据时一些提速以及安全的方式╮(╯▽╰)╭。
1.join操作。不要用join操作*10086。如果一定需要join完成操作,请用group后再map模拟join操作。这样不仅安全可靠,而且速度有很大提升。distinct同理。
2.这个有人提到了,spark的速度和你设置executor数目和任务细分数相关。由于shuffle操作会将stage切成两段,一个shuffle之前的任务全部结束前后面的任务不会开始,调节一个恰当的executor(可以或略大于被任务整除的数目)数目可以显著提高效率。
3.cache方法和persist方法在对中间数据很大时资源浪费比较大,如果可以建议用save把中间rdd放到hdfs硬盘上。
4.少用shuffle操作,优化的时候尤其注意UI上shuffle write数据量过大的操作,它是导致任务缓慢的最大原因。
5.在可以用reduce解决问题的时候,不要用group。因为reduce会先处理当前节点的所有分片同key进行合并再对不同节点同样的key进行合并,而group会将所有相同的key整合后再处理。对内存的消耗显而易见。
6.注意!由于在用flatmap输出的出参是list。如果list里面放同一个对象非原始类型的多次引用,那么在下一步rdd处理时,它们之间会相互影响,像你在单机内存里一样!即使它们被分到了不同节点!
这个小特性可以完成一些微妙的操作,具体就看使用者了。
————————————————————————————————————————————————————————————————————
在使用Java/Scala的一些“工具类”之前,一定要确认工具类是否是线程安全的。
比如SimpleDateFormat
比如SimpleDateFormat
默认配置通常不理想。设置恰当的worker数量和内存可以减少总体时间。
TOP 5 MISTAKES WHEN WRITING SPARK APPLICATIONS
https://spark-summit.org/2016/events/top-5-mistakes-when-writing-spark-applications/