如何确定输入数据大小和群集资源所需的分区数?

use*_*662 11 hadoop apache-spark

我的用例如下所述.

  1. 使用sparkContext.textFile(输入路径)从本地文件系统读取输入数据.
  2. 在将输入数据提交到mapper/reducer函数之前,使用RDD.coalesce(numberOfPArtitions)将输入数据(8000万条记录)分区为分区.如果不对输入数据使用coalesce()或repartition(),则执行的速度非常慢,并且会因内存不足而失败.

我在这里面临的问题是决定要在输入数据上应用的分区数.输入数据大小每次都在变化,硬编码特定值不是一种选择.只有当某些最佳分区应用于我必须执行大量迭代(试验和错误)的输入数据时,spark才能很好地执行.这不是生产环境中的选项.

我的问题:根据输入数据大小和可用的集群资源(执行程序,核心等等),是否有拇指规则来决定所需的分区数量?如果是,请指出我的方向.任何帮助深表感谢.

我在纱线上使用火花1.0.

谢谢,AG

Far*_*ian 5

来自Spark官方文档中的Tuning Spark的两个注释:

1-通常,我们建议群集中每个CPU核心有2-3个任务.

2- Spark可以有效地支持短至200毫秒的任务,因为它在多个任务中重用了一个执行程序JVM,并且任务启动成本低,因此您可以安全地将并行度提高到超过群集中的核心数.

这两个tumb规则可以帮助您估计分区的数量和大小.因此,拥有小任务(可以在几百毫秒内完成)会更好.


Hol*_*den 1

确定分区的数量有点棘手。Spark 默认情况下会尝试推断合理的分区数量。注意:如果您将 textFile 方法与压缩文本一起使用,那么 Spark 将禁用拆分,然后您将需要重新分区(听起来这可能是发生的情况?)。对于非压缩数据,当您使用 sc.textFile 加载时,您还可以指定最小分区数(例如 sc.textFile(path, minPartitions) )。

coalesce 函数仅用于减少分区数量,因此您应该考虑使用 repartition() 函数。

至于选择一个“好的”数字,您通常需要至少与并行执行器的数量一样多。已经存在一些逻辑来尝试确定“良好”的并行度,您可以通过调用 sc.defaultParallelism 来获取该值