spark的parallelize()方法,可以指定分区数量。在coding阶段,对此没有引起重视,只是随意填了一个很大的数,认为分区当然是越多越好。但是到了性能测试阶段,发现并不是。 1.分区数太多意味着任务数太多,每次调度任务也是很耗时的,所以分区数太多会导致总体耗时增多。 2.分区数太少的话,会导致一些结点没有分配到任务;另一方面,分区数少则每个分区要处理的数据量就会增大,从而对每个结点的内存要求就会提高;还有分区数不合理,会导致数据倾斜问题。 3.对一个RDD数据集,处理的分区数尽量和集群节点数对应,一般是集群节点的2-3倍。(可以在配置文件中加入node-size,和partition-number)。 当然,到了这一步,感觉自己的设置真的很合理了。但是代码运行就发现掉进了一个大坑。有的task对这种分区方式并不适用。 例如:List<String> types = .... 节点数有8个,按分区数是节点数2倍计算,分区数为16;如果types.size小于16,就会浪费计算资源。有的分区就没有分配到数据集。 所以要进一步对分区进行控制和优化。即分数和和数据集的size数,取最小值,作为最终分区数。
转载于:https://my.oschina.net/u/3957231/blog/3051445