Spark中每个任务的CPU数量

smz*_*smz 18 multithreading scala apache-spark

我不太了解spark.task.cpus参数.在我看来,"任务"对应于"线程"或"进程",如果您愿意,则在执行程序中.假设我将"spark.task.cpus"设置为2.

  1. 线程如何同时使用两个CPU?它不能需要锁定并导致同步问题吗?

  2. 我正在查看launchTask()deploy/executor/Executor.scala 中的函数,我在这里看不到任何"每个任务的cpus数"的概念.那么Spark最终在独立模式下如何/如何为一项任务分配多个cpu?

mar*_*ios 18

据我所知spark.task.cpus,在已知某些特定任务具有自己的内部(自定义)并行性的情况下,控制群集中任务的并行性.

更详细: 我们知道spark.cores.max定义应用程序需要多少个线程(也称为核心).如果您离开,spark.task.cpus = 1那么您将同时运行#spark.cores.max并发Spark任务数.

spark.task.cpus如果您知道自己的任务本身是并行化的(或许每个任务产生两个线程,与外部工具交互等)spark.task.cpus,您只需要更改.通过相应设置,您将成为一个好的"公民".现在如果你有spark.cores.max = 10和spark.task.cpus = 2 Spark只会创建10/2 = 5个并发任务.鉴于您的任务在内部需要(比方说)2个线程,执行线程的总数将永远不会超过10.这意味着您永远不会超过您的初始合同(由定义spark.cores.max).

  • 我想补充一点,它在整个源代码中用作`CPUS_PER_TASK`虽然它在运行时没有真正强制执行(更多的资源利用率暗示比硬限制) (4认同)
  • 最简单的方法(不是很有用):`rdd.mapPartitions(_.toVector.par.map(foo))`。并回答您的第二个问题 - 我们根本没有。它只是说如果你声明了四个执行器核心,并且 `spark.task.cpus` 等于 2 那么它只能启动 2 个任务。但是有物理内核分配或类似的东西。Spark 中的`core` 只是一个线程。 (2认同)