Spark 对于 RDD 的最佳分区数及其元素数,是否有任何经验法则?

Spark Is there any rule of thumb about the optimal number of partition of a RDD and its number of elements?

一个RDD包含的元素个数和理想的分区个数有关系吗?

我有一个有数千个分区的 RDD(因为我从一个由多个小文件组成的源文件加载它,这是一个我无法修复的约束,所以我必须处理它)。我想重新分区(或使用 coalesce 方法)。但是我事先并不知道 RDD 将包含的事件的确切数量。
所以我想以自动化的方式进行。看起来像的东西:

val numberOfElements = rdd.count()
val magicNumber = 100000
rdd.coalesce( numberOfElements / magicNumber)

对于RDD的最佳分区数及其元素数,是否有任何经验法则?

谢谢。

没有,因为它对应用程序、资源和数据的依赖性很强。有一些硬限制(like various 2GB limits),但其余的你必须根据任务调整。需要考虑的一些因素:

  • 单个行/元素的大小
  • 典型操作的成本。如果分区小,操作成本低,那么调度成本可能比数据处理成本高得多。
  • 执行分区(例如排序)操作时处理分区的成本。

如果这里的核心问题是一些初始文件,那么使用 CombineFileInputFormat 的一些变体可能比重新分区/合并更好。例如:

sc.hadoopFile(
  path,
  classOf[CombineTextInputFormat],
  classOf[LongWritable], classOf[Text]
).map(_._2.toString)

另见

虽然我完全同意 zero323,但您仍然可以实施某种启发式方法。在内部,我们将存储的数据大小作为 avro key-value 并压缩和计算分区数,以便每个分区不会超过 64MB(totalVolume/64MB~分区数)。偶尔我们 运行 自动作业重新计算 "optimal" 每种输入类型的分区数等。在我们的例子中,这很容易做到,因为输入来自 hdfs(s3 很可能会工作)

再次强调,这取决于您的计算和数据,因此您的数字可能完全不同。