rdd.repartition() 和 sc.parallelize(data, partitions) 中的分区大小有什么区别

ans*_*vas 5 python apache-spark rdd

我正在浏览 spark 的文档。我对 rdd.repartition() 函数和我们在 sc.parallelize() 中的上下文初始化期间传递的分区数感到有些困惑。

我的机器上有 4 个内核,如果我 sc.parallelize(data, 4) 一切正常,但是当我 rdd.repartition(4) 并应用 rdd.mappartitions(fun) 有时分区没有数据并且我的功能失败这样的情况。

所以,只是想了解这两种分区方式有什么区别。

Hol*_*den 3

通过调用repartition(N)Spark 将进行洗牌来更改分区数量(并且默认情况下会生成具有该分区数量的 HashPartitioner)。当您使用所需数量的分区进行调用时sc.parallelize,它会将您的数据(或多或少)在切片之间平均分割(实际上类似于范围分区器),您可以在函数ParallelCollectionRDD内部看到这一点slice

话虽这么说,这两者(sc.parallelize(data, N)以及rdd.reparitition(N)实际上几乎任何形式的数据读取)都可能导致 RDD 具有空分区(这是代码中非常常见的错误来源,mapPartitions因此我在 Spark 测试中对 RDD 生成器产生了偏见-base 创建带有空分区的 RDD)。对于大多数函数来说,一个非常简单的修复方法就是检查是否传入了一个空迭代器,并在这种情况下返回一个空迭代器。