When should I repartition an RDD?

Mar*_*cos 5 partitioning apache-spark rdd

I know that I can repartition an RDD to increase its partitions and use coalesce to decrease its partitions. I have two questions regarding this that I cannot completely understand after reading different resources.

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

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

  2. 如果未提供分区,默认情况下是否对所有数据类型(即.txt.parquet等)进行重新分区?

Ram*_*ram 6

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

例如 :

val rdd= sc.textFile ("file.txt", 5)
Run Code Online (Sandbox Code Playgroud)

上面的代码行将创建一个具有5个分区的名为textFile的RDD。

假设您有一个具有4个核心的集群,并假设每个分区需要处理5分钟。对于具有5个分区的上述RDD,由于有4个内核,因此将并行运行4个分区进程,而当4个内核之一空闲时,第5个分区进程将在5分钟后处理。

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

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


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

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

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

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

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

(numOf执行程序*内核数)*复制系数(可能是原来的2或3倍)

  • 是的,在这种情况下需要更多数量的分区,但它会像上述方法一样工作。因为它不是单一的答案...我建议您查看 [top-5-mistakes-to-avoid-when-writing-apache-spark-applications](https://www.slideshare.net/cloudera/编写 apache-spark-applications 时要避免的前 5 个错误)和 [调整资源分配](https://blog.cloudera.com/blog/2015/03/how-to-tune-your -apache-spark-jobs-part-2/) (2认同)