Spark是否有关于RDD的最佳分区数量及其元素数量的经验法则?

jmv*_*llt 7 partitioning apache-spark apache-spark-sql

包含RDD的元素数量与理想的分区数量之间是否存在任何关系?

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

val numberOfElements = rdd.count()
val magicNumber = 100000
rdd.coalesce( numberOfElements / magicNumber)
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

zer*_*323 7

没有,因为它高度依赖于应用程序,资源和数据.有一些硬性限制(如各种2GB限制),但其余的你必须调整任务基础.需要考虑的一些因素:

  • 单行/元素的大小
  • 典型操作的成本.如果小分区和操作便宜,那么调度成本可能远高于数据处理的成本.
  • 执行分区(例如,排序)操作时处理分区的成本.

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

sc.hadoopFile(
  path,
  classOf[CombineTextInputFormat],
  classOf[LongWritable], classOf[Text]
).map(_._2.toString)
Run Code Online (Sandbox Code Playgroud)

另请参见如何计算合并的最佳numberOfPartitions?