Spark 与执行者和核心数量的关系

Posted

技术标签:

【中文标题】Spark 与执行者和核心数量的关系【英文标题】:Spark coalesce relationship with number of executors and cores 【发布时间】:2016-07-19 18:12:34 【问题描述】:

我提出了一个关于 Spark 的非常愚蠢的问题,因为我想澄清我的困惑。我是 Spark 的新手,仍在尝试了解它在内部是如何工作的。

假设我有一个输入文件列表(假设为 1000),我想在某处处理或写入这些文件,并且我想使用合并将我的分区数减少到 100。

现在我用 12 个执行器运行这个作业,每个执行器有 5 个核心,这意味着它运行时有 60 个任务。这是否意味着,每个任务都将在一个单独的分区上独立工作?

回合:1 12 个执行器,每个执行器有 5 个核心 => 60 个任务进程 60 分区 轮次:2 8 个执行器,每个执行器有 5 个核心 => 40 个任务

处理剩下的 40 个分区和 4 个执行器从不放置 第二次工作

或者来自同一个执行器的所有任务都将在同一个分区上工作?

回合:1:12 执行者 => 处理 12 个分区 回合:2:12 执行者 => 处理 12 个分区 回合:3:12 执行者 => 处理 12 个分区 .... .... .... 回合:9(96个分区 已处理):4 个执行者 => 处理剩余的 4 个 分区

【问题讨论】:

【参考方案1】:

假设我有一个输入文件列表(假设为 1000),我想在某处处理或写入这些文件,并且我想使用合并将我的分区数减少到 100。

在spark中默认number of partitions = hdfs blocks,由于指定了coalesce(100),Spark会将输入数据分成100个分区。

现在我用 12 个执行器运行这个作业,每个执行器有 5 个核心,这意味着它运行时有 60 个任务。这是否意味着,每个任务都将在一个单独的分区上独立工作?

如果你通过了,可能会通过。

--num-executors 12:在应用程序中启动的执行器数量。

--executor-cores 5 :每个执行程序的核心数。 1 个核心 = 1 个任务一次

所以分区的执行会是这样的。

第一轮

12 个分区将由 12 个执行器处理,每个执行器有 5 个任务(线程)

第二轮

12 个分区将由 12 个执行器处理,每个执行器有 5 个任务(线程)。 ...

回合:9(已处理 96 个分区):

4 个分区将由 4 个执行器处理,每个执行器有 5 个任务(线程)

注意: 通常,一些执行器可能会很快完成分配的工作(各种参数,如data locality、网络 I/O、CPU 等)。因此,它将通过等待配置的调度时间来选择下一个要处理的分区。

【讨论】:

以上是关于Spark 与执行者和核心数量的关系的主要内容,如果未能解决你的问题,请参考以下文章

Spark 独立数量执行器/核心控制

为啥 Spark 每个执行器只使用一个核心?它如何决定使用分区数量以外的核心?

Apache Spark:核心数与执行程序数

在 spark 中,我可以定义比可用内核更多的执行程序吗?

《深入理解Spark-核心思想与源码分析》第五章任务提交与执行

Spark核心机制总结