火花在RDD中创建的分区数量超过数据大小

时间:2020-11-04 18:40:23

标签: apache-spark rdd

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

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

我了解分区的目的是有效地使用群集的CPU内核,并且使分区太小涉及调度开销,而不是受益于分布式计算。我很好奇的是,spark是否仍在此处创建8个分区或将其优化为内核数?如果要创建8个分区,那么每个分区中都有数据复制吗?

1 个答案:

答案 0 :(得分:0)

关于RDD的问题是,当我们尝试创建更多内容时会发生什么 分区超过数据大小

通过使用,您可以轻松查看给定RDD有多少个分区 data.getNumPartitions。我尝试创建您提到的RDD并运行此命令,它显示出有8个分区。 4个分区各有一个数字,其余4个为空。

如果要创建8个分区,则每个分区中都有数据复制 分区?

您可以尝试以下代码并检查执行程序输出,以查看每个分区中有多少条记录。请注意以下代码中的第一个打印语句。我必须返回API要求的内容,因此返回每个元素乘以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

我很好奇的是,spark是否还在这里创建了8个分区? 优化内核数量?

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