Spark RDD的分区

通过网络资源,整理出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的限制。

  • 很多操作会影响分区,包括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。


你可能感兴趣的:(Spark RDD的分区)