我什么时候应该重新分配RDD?

时间:2017-08-18 03:43:05

标签: apache-spark rdd partitioning

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

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

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

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

1 个答案:

答案 0 :(得分:4)

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

例如:

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

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

假设您有一个包含4个核心的群集,并假设每个分区需要处理5分钟。在具有5个分区的上述RDD的情况下,4个分区进程将并行运行,因为有4个核,并且第5个分区进程将在5分钟后处理,其中4个核中的一个是空闲的。

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

  

确定RDD中分区数量的最佳方法是使分区数等于群集中的核心数,以便所有   分区将并行处理,资源将以最佳方式使用。

  

问题:是否重新分配了所有数据类型(即.txt,.parquet等)   默认情况下,如果没有提供分区?

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

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

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

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

  

(numOf executors * no of cores)*复制因子(可能是2或3倍)