我不太了解spark.task.cpus
参数。在我看来,“任务”对应于“线程”或“进程”,如果您愿意,则在执行程序中。假设我将“spark.task.cpus”设置为2.
线程如何同时使用两个CPU?它不能需要锁定并导致同步问题吗?
我正在查看deploy / executor / Executor.scala中的launchTask()
函数,我在这里看不到任何“每个任务的cpus数”的概念。那么Spark最终在独立模式下如何/如何为一个任务分配多个cpu?
答案 0 :(得分:16)
据我所知spark.task.cpus
,在已知某些特定任务具有自己的内部(自定义)并行性的情况下,控制群集中任务的并行性。
更详细:
我们知道spark.cores.max
定义了您的应用程序需要多少线程(也称为核心)。如果您离开spark.task.cpus = 1
,那么您将同时运行#splace.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
定义)。