mar*_*tin 6 apache-spark rdd pyspark
假设我创建了这样一个RDD(我正在使用Pyspark):
list_rdd = sc.parallelize(xrange(0, 20, 2), 6)
Run Code Online (Sandbox Code Playgroud)
然后我用glom()方法打印分区元素并获取
[[0], [2, 4], [6, 8], [10], [12, 14], [16, 18]]
Run Code Online (Sandbox Code Playgroud)
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]]
Run Code Online (Sandbox Code Playgroud)
使用较小范围的9个元素
list_rdd = sc.parallelize(xrange(0, 10, 2), 6)
[[], [0], [2], [4], [6], [8]]
Run Code Online (Sandbox Code Playgroud)
所以我推断Spark是通过将列表拆分为一个配置来生成分区,其中最小可能后跟更大的集合,并重复.
问题是这个选择背后是否有原因,这是非常优雅的,但它是否也提供了性能优势?
除非您指定特定的分区器,否则这是“随机的”,因为它取决于该 RDD 的特定实现。在这种情况下,您可以前往ParallelCollectionsRDD进一步深入研究。
getPartitions定义为:
val slices = ParallelCollectionRDD.slice(data, numSlices).toArray
slices.indices.map(i => new ParallelCollectionPartition(id, i, slices(i))).toArray
Run Code Online (Sandbox Code Playgroud)
其中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.
*/
Run Code Online (Sandbox Code Playgroud)
请注意,有一些与内存有关的注意事项。因此,这又将取决于具体的实施。
| 归档时间: |
|
| 查看次数: |
742 次 |
| 最近记录: |