我不太理解 spark.task.cpus
参数。在我看来,“任务”对应于执行器中的“线程”或“进程”(如果你愿意的话)。假设我将“spark.task.cpus”设置为 2。
一个线程如何同时使用两个CPU?难道它不需要锁并导致同步问题吗?
我正在查看deploy/executor/Executor.scala中的
launchTask()
函数,我在这里没有看到任何“每个任务的CPU数量”的概念。那么Spark最终是在哪里/如何为独立模式下的任务分配多个CPU的呢?
最佳答案
据我所知,在已知某些特定任务具有自己的内部(自定义)并行性的情况下,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
定义) 。
关于multithreading - Spark 中每个任务的 CPU 数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36671832/