我什么时候应该重新分区一个RDD?

When should I repartition an RDD?

我知道我可以 repartition 一个 RDD 来增加它的分区并使用 coalesce 来减少它的分区。我有两个问题,在阅读不同的资源后我无法完全理解。

Spark 在生成 RDD 时将使用合理的默认值(每个块 1 个分区,在第一个版本中为 64MB,现在为 128MB)。但我也读到建议使用 2 或 3 倍的内核数 运行 作业。那么问题来了:

  1. 我应该为给定文件使用多少个分区?例如,假设我有一个 10GB 的 .parquet 文件,3 个执行器,每个执行器有 2 个内核和 3GB 内存。 我应该重新分区吗?我应该使用多少个分区?做出该选择的更好方法是什么?

  2. 如果不提供分区,所有数据类型(即.txt.parquet等)是否默认重新分区?

Spark 可以 运行 为 RDD 的每个分区执行一个并发任务,最多可达集群中的核心总数。

例如:

val rdd= sc.textFile ("file.txt", 5)

上面的代码行将创建一个名为 textFile 的 RDD,其中包含 5 个分区。

假设你有一个4核的集群,假设每个分区需要处理5分钟。在上述具有 5 个分区的 RDD 的情况下,4 个分区进程将 运行 并行,因为有 4 个核心,第 5 个分区进程将在 5 分钟后处理,当 4 个核心之一空闲时。

整个处理将在10分钟内完成,在第5个分区过程中,资源(剩余3个核心)将保持空闲状态。

The best way to decide on the number of partitions in a RDD is to make the number of partitions equal to the number of cores in the cluster so that all the partitions will process in parallel and the resources will be utilized in an optimal way.


Question : Are all data types (ie .txt, .parquet, etc..) repartitioned by default if no partitioning is provided?

每个rdd默认没有分区。 检查您可以在 rdd 创建后立即使用 rdd.partitions.length

为了以最佳方式使用现有集群资源并加快速度,我们必须考虑重新分区以确保所有核心都得到利用,并且所有分区都有足够数量的均匀分布的记录。

为了更好地理解,还可以查看 https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-rdd-partitions.html

注意:这个没有固定的公式。他们中的大多数人遵循的一般惯例是

(numOf executors * no of cores) * replicationfactor (which may be 2 or 3 times more )