【问题标题】:Number of CPUs per Task in SparkSpark 中每个任务的 CPU 数量
【发布时间】:2016-04-17 01:48:39
【问题描述】:

我不太明白spark.task.cpus 参数。在我看来,“任务”对应于执行程序中的“线程”或“进程”,如果您愿意的话。假设我将“spark.task.cpus”设置为 2。

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

  2. 我正在查看 deploy/executor/Executor.scala 中的 launchTask() 函数,在这里我没有看到“每个任务的 CPU 数量”的任何概念。那么 Spark 最终在哪里/如何为独立模式下的任务分配多个 cpu?

【问题讨论】:

    标签: multithreading scala apache-spark


    【解决方案1】:

    据我所知,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,尽管它并没有真正在运行时强制执行(更多的资源利用提示而不是硬限制)
    • 您是否有任何示例说明如何在内部并行化任务? @ zero323,CPUS_PER_TASK 用于非常高级的调度内容,它永远不会传递给执行程序。所以,我的问题是“我们如何确保任务获得它请求的 spark.task.cpus 核心?”
    • 最简单的方法(不是很有用):rdd.mapPartitions(_.toVector.par.map(foo))。并回答您的第二个问题-我们根本不回答。它只是说如果你声明了四个执行器核心,并且spark.task.cpus 等于 2,那么它只能启动 2 个任务。但是有物理内核分配或类似的东西。 Spark 中的core 只是一个线程。
    • @marios 如何设置此属性 spark.task.cpus ?我可以在 spark-submit 命令中设置吗?
    • @Kishore 您可以通过 spark-submit 中的 --conf 参数传递它,
    猜你喜欢
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2020-03-15
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多