我知道我可以repartition
一个RDD来增加它的分区并使用coalesce来减少它的分区。我有两个问题,在阅读不同的资源后我无法完全理解。
Spark生成RDD时将使用合理的默认值(每个块1个分区,第一个版本为64MB,现在为128MB)。但我也读过,建议使用运行作业的核心数量的2到3倍。所以问题就出现了:
我应该为给定文件使用多少个分区。例如,假设我有一个10GB的.parquet文件,3个执行器,每个有2个内核和3GB内存。 我应该重新分配吗?我应该使用多少个分区?做出这个选择的更好方法是什么?
如果没有提供分区,是否所有数据类型(即.txt
,.parquet
等)都会重新分区?
答案 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倍)