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

时间:2016-03-15 11:01:55

标签: apache-spark apache-spark-sql partitioning

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:7)

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

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

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

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

另见How to calculate the best numberOfPartitions for coalesce?

答案 1 :(得分:1)

虽然我完全同意zero323,但您仍然可以实现某种启发式方法。在内部,我们将存储的数据大小作为avro键值和压缩和计算的分区数量,使每个分区不超过64MB(totalVolume / 64MB~分区数)。偶尔我们运行自动作业来重新计算每种输入类型的“最佳”分区数。在我们的例子中,它很容易做,因为输入来自hdfs(s3很可能工作)

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