RDD包含的元素数量与理想的分区数量之间是否存在任何关系?
我有一个拥有数千个分区的RDD(因为我是从一个由多个小文件组成的源文件中加载的,这是我无法修复的约束所以我必须处理它)。我想重新分区(或使用coalesce
方法)。但我事先并不知道RDD将包含的事件的确切数量
所以我想以自动化的方式做到这一点。看起来像:
val numberOfElements = rdd.count()
val magicNumber = 100000
rdd.coalesce( numberOfElements / magicNumber)
关于RDD的最佳分区数量及其元素数量是否有任何经验法则?
感谢。
答案 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很可能工作)
再次取决于您的计算和数据,因此您的数字可能完全不同。