gpt4 book ai didi

apache-spark - Spark 如何决定如何对 RDD 进行分区?

转载 作者:行者123 更新时间:2023-12-04 05:09:05 28 4
gpt4 key购买 nike

假设我创建了这样一个 RDD(我正在使用 Pyspark):

list_rdd = sc.parallelize(xrange(0, 20, 2), 6)

然后我用 glom() 打印分区元素方法和获得
[[0], [2, 4], [6, 8], [10], [12, 14], [16, 18]]

Spark 如何决定如何对我的列表进行分区?元素的特定选择从何而来?它可以将它们以不同的方式耦合,单独留下一些其他元素而不是 0 和 10,以创建 6 个请求的分区。在第二次运行时,分区是相同的。

使用更大的范围,包含 29 个元素,我以 2 个元素后跟三个元素的模式得到分区:
list_rdd = sc.parallelize(xrange(0, 30, 2), 6)
[[0, 2], [4, 6, 8], [10, 12], [14, 16, 18], [20, 22], [24, 26, 28]]

使用较小范围的 9 个元素,我得到
list_rdd = sc.parallelize(xrange(0, 10, 2), 6)
[[], [0], [2], [4], [6], [8]]

所以我推断 Spark 是通过将列表拆分成一个配置来生成分区的,在该配置中,最小的可能跟随着更大的集合,并重复。

问题是这种选择背后是否有原因,很优雅,但它是否也提供了性能优势?

最佳答案

除非您指定特定的分区器,否则这是“随机的”,因为它取决于该 RDD 的特定实现。在这种情况下,您可以前往 ParallelCollectionsRDD进一步深入研究。
getPartitions定义为:

val slices = ParallelCollectionRDD.slice(data, numSlices).toArray
slices.indices.map(i => new ParallelCollectionPartition(id, i, slices(i))).toArray

哪里 slice被评论为(重新格式化以更好地适应):
/**
* Slice a collection into numSlices sub-collections.
* One extra thing we do here is to treat Range collections specially,
* encoding the slices as other Ranges to minimize memory cost.
* This makes it efficient to run Spark over RDDs representing large sets of numbers.
* And if the collection is an inclusive Range,
* we use inclusive range for the last slice.
*/

请注意,有一些关于内存的注意事项。所以,同样,这将特定于实现。

关于apache-spark - Spark 如何决定如何对 RDD 进行分区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35797758/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com