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 每个执行器只使用一个核心?它如何决定使用分区数量以外的核心?