在实际的基于Spark平台的大数据分析项目中,为提高程序的运行效率,对程序进行优化是必不可少的,本文基于个人在大数据项目中使用Spark进行编程实现的实践经历,针对Spark程序优化问题进行总结,具体内容如下所述。
1. 代码层优化
(1)避免创建多个相同的RDD对象
(2)DAG划分的多个stage中存在相同的RDD对象,则需要将该RDD对象进行缓存,避免重复计算。
(3)代码中存在大小表关联逻辑时,建议使用广播变量(Broadcast)解决。
(4)涉及广播变量的map过程,强烈建议使用mapPartitions函数替代map函数,否则在大规模数据场景下,容易导致集群节点内存溢出甚至节点宕掉。
(5)涉及聚合操作时,合理选择groupByKey()和reduceByKey()、combineBykey()函数,三者的具体差异及使用详见文档(链接:http://blog.csdn.net/zylove2010/article/details/78577333)
(6)使用repartition()函数合理调整RDD的分区数,特别是在涉及shuffle操作时,需根据shuffle过程中map和reduce阶段的计算复杂度,增大或减少RDD的分区数,以提高程序的运行效率。总体原则是:合理调整RDD的分区值,充分利用集群分配的计算资源。