通过网络资源,整理出Spark RDD分区的一些总结。
分区是为了更好的利用集群中的众多CPU,提高并行度。
实际分区应该考虑处理问题的类型,如果是IO密集型,考虑等待的时间,每个CPU上对应的分区可以适当多点,如果是计算密集型,每个CPU处理的分区就不能太多,不然相当于排队等待。是推荐的分区大小是一个CPU上面有2-4个分区。
Spark会自动根据集群情况设置分区的个数。参考spark.default.parallelism参数和defaultMinPartitions成员。
编程的时候可以通过parallelize函数设置分区数目(e.g. sc.parallelize(data, 10))。
对于来自HDFS的数据,默认一个块对应一个分区(默认快大小64M),你可以编程设置自己的分区,但不能少于块数。
Spark每个块的大小有2G的限制。
RDD的数据本地性。
很多操作会影响分区,包括cogroup, groupWith, join, leftOuterJoin, rightOuterJoin, groupByKey, reduceByKey, combineByKey, partitionBy, sort, mapValues (如果父RDD存在partitioner), flatMapValues(如果父RDD存在partitioner), 和 filter (如果父RDD存在partitioner)。其他的transform操作不会影响到输出RDD的partitioner,一般来说是None,也就是没有partitioner
从实现上看,每个RDD都有一个Partitioner。