【问题标题】:How many concurrent tasks in one executor and how Spark handles multithreading among tasks in one executor?一个执行器中有多少并发任务,Spark 如何处理一个执行器中的任务之间的多线程?
【发布时间】:2020-11-30 14:01:09
【问题描述】:

在 Spark 中,一次并行执行多少个任务?讨论见于 How are stages split into tasks in Spark?How DAG works under the covers in RDD?

但我没有找到明确的结论。

考虑以下场景(假设spark.task.cpus = 1,为简单起见忽略vcore 概念):

  • 10个执行器(2核/执行器),10个分区=>我认为一次并发任务的数量是10
  • 10个执行器(2核/执行器),2个分区=>我认为一次并发任务的数量是2
  • 10个执行器(2核/执行器),20个分区=>我认为一次并发任务的数量是20
  • 10个executors(1 cores/executor),20个partitions =>我认为一次并发任务数是10

我说的对吗?关于第三种情况,在一个执行器内部考虑多线程(即2个线程,因为有2个内核)会是20吗?


更新1

如果第三种情况正确,则表示:

  • 当执行器中的空闲内核可用时,Spark 可以自动决定触发该执行器中的多线程
  • 当执行器中只有一个核心时,该执行器中不会发生多线程。

如果这是真的,Spark 在执行器中的行为是不是有点不确定(单线程与多线程)?

请注意,从驱动程序发送到执行程序的代码可能没有考虑使用例如自动性问题。 同步关键字。

Spark 是如何处理的?

【问题讨论】:

  • 你是对的(包括第三种情况)。要考虑的另一个因素是 vcore。在 Hortonworks/Cloudera 上,管理员可以选择将单个物理核心拆分为设置的虚拟核心。每个虚拟核心都可以在分区上执行任务。
  • 最常见的情况更正。然而,有一个 spark.task.cpus 设置可以改变它。 stackoverflow.com/questions/36671832/…
  • @mazaneicha 感谢您的评论。但我认为spark.task.cpus 是关于 nb 的。 cpus 每个任务,而我的问题是关于 nb。任务,这是不同的,但你的链接也很有趣。 :)
  • 如果你为每个任务分配 2 个 cpu,那么一个有 4 个核心的 executor 将只能同时运行 2 个任务,而通常它会运行 4 个。
  • @mazaneicha 有道理,我将假设spark.task.cpus = 1 放在问题中。但是这里你说的是一个任务中的多线程(1个任务有2个线程),问题更多的是任务之间的多线程(1个任务有1个线程,但是2个任务在一个执行器中同时运行)

标签: java multithreading apache-spark concurrency hadoop-yarn


【解决方案1】:

我认为你是对的,这取决于你的执行者数量和核心,一个分区创建一个在一个核心上运行的任务。

【讨论】:

  • 谢谢。这是否意味着,如果 nb.分区数大于 nb。节点数(假设每个节点 1 个核心),通常没有意义?考虑第4种情况..
【解决方案2】:

我认为所有 4 种情况都是正确的,第 4 种情况在现实中是有意义的(“超额预订”核心)。我们通常应该为 nb 考虑 2 到 4 的系数。分区数,即 nb。分区数等于 nb 的 2 到 4 倍。集群中的 CPU 内核总数。

关于线程,一个 executor 中的 2 个任务并发运行不应该有关于多线程的问题,因为每个任务都在处理自己的一组 RDD

如果设置了spark.task.cpus = 2,这意味着每个任务有2个cpu核心,那么IMO可能存在竞争条件问题(如果有var),但通常我们正在处理像RDD这样的不可变值,所以有也应该只是有问题。

【讨论】:

    猜你喜欢
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多