首页 > 解决方案 > 所有连接表的分区数是否会影响最大执行者?

问题描述

我有一个 Spark SQL

select ...
from A 
join B on A.k = B.k
join C on A.k = C.k

A有2k个分区;B有7个分区;而 C 未分区。

我将最大动态执行程序数设置为 50。但是,应用程序的执行程序数小于 20。当两个阶段并行运行时,一个阶段使用 5 个执行器,而另一个使用 6 个。

我应该增加 B 和 C 的分区数以使查询更多地并行化吗?

标签: apache-sparkpysparkapache-spark-sql

解决方案


当然,由于分区不均匀会产生影响,它们是: 并发性降低 - 您没有使用并行性的优势。可能存在理想的工作节点。数据倾斜和资源利用不当。您的数据可能会偏斜在一个分区上,因此您的一名工作人员可能比其他工作人员做得更多,因此资源问题可能会出现在该工作人员身上。

由于分区计数之间存在权衡,因此它们应该是正确的数量,否则任务调度可能需要比实际执行时间更多的时间。您通常应该有 100 到 10K 个分区,具体取决于集群大小和数据。

下限 - 集群中可供应用程序使用的核心数量的 2 X 上限 - 任务应该花费 100 多毫秒的时间来执行。如果它花费的时间少于您的分区数据太小并且您的应用程序可能会花费更多时间来调度任务。


推荐阅读