spark 在 RDD 中创建的分区数超过数据大小

spark creating num of partitions in RDD more than the data size

我是菜鸟,现在正在学习 Pyspark。我关于 RDD 的问题是当我们尝试创建比数据大小时更多的分区时会发生什么。例如,

data = sc.parallelize(range(5), partitions = 8)

我理解分区的目的是有效地使用集群的 CPU 个核心,分区太小涉及调度开销,而不是从分布式计算中获益。我很好奇的是spark是否仍然在这里创建8个分区或将其优化为核心数?如果它创建 8 个分区,那么每个分区中都有数据复制?

My question about RDD is what happens when we try to create more partitions than the data size

你可以很容易地看到一个给定的 RDD 有多少分区,使用 data.getNumPartitions。我尝试创建你提到的 RDD 和 运行 这个命令,它告诉我有 8 个分区。 4个分区各有一个数字,其余4个空。

If it's creating 8 partitions then there is data replication in each partition?

您可以尝试以下代码并检查执行程序输出以查看每个分区中有多少条记录。请注意以下代码中的第一个打印语句。我必须 return 按照 API 的要求做一些事情,所以 return 将每个元素乘以 2。

data.mapPartitionsWithIndex((x,y) => {println(s"partitions $x has ${y.length} records");y.map(a => a*2)}).collect.foreach(println)

我得到了上面代码的以下输出 -

partitions 0 has 0 records
partitions 1 has 1 records
partitions 2 has 0 records
partitions 3 has 1 records
partitions 4 has 0 records
partitions 5 has 1 records
partitions 6 has 0 records
partitions 7 has 1 records

I am curious about is does spark still create 8 partitions here or optimize it to the number of cores?

分区数定义了您希望 spark 在一项任务中处理多少数据。如果有 8 个分区和 4 个虚拟核心,那么 spark 将立即启动 运行 4 个任务(对应于 4 个分区)。当这些任务完成时,它将安排剩余的那些核心。