spark并行度调优提供了两种方法:
方法一:在数据混洗操作的时候,用参数设置的方式为混洗后的RDD指定并行度。
方法二:对于任何已有的RDD,可以进行重新分区来获取更多或者更少的分区数。重新分区操作可以通过repartition()这个函数实现,这个函数可以将RDD随机打乱并分为设定的分区数目。如果是要减少RDD分区数目的话,可以使用coalesce()操作。由于这个函数没有打乱数据,所以该操作比repartition()更为高效。如果你认为并行度过低或者过高,可以采用这些方法去对数据分布进行调整
来个实例:
假设从某个文件中读取了大量的数据,然后用filter()操作筛选掉数据集中的绝大部分数据(我们认为的无效数据)。在默认的情况下,filter()返回的RDD分区数与其父节点的分区数一致,这样就可能出现很多空的分区或者说某些分区里面只有很少的数据,这种情况下,我们就可以通过合并分区得到分区更少的RDD来提高性能。
>>>input = sc.textFile("s3n://log-files/2014/*.log")
>>>input.getNumPartitions()
35154
#排除掉大部分无效数据的筛选方法
>>> lines = lines.filter(lambda line:line.startswith("2014-10-17"))
>>>lines.getPartitions()
35154
#在缓存lines之前对其合并操作
>>>lines = lines.coalesce(5).cache()
>>>lines.getNumPartitions()
4
#可以在合并之后的RDD上进行后续分析了
>>>lines.count()