【问题标题】:How SPARK_WORKER_CORES setting impacts concurrency in Spark StandaloneSPARK_WORKER_CORES 设置如何影响 Spark Standalone 中的并发性
【发布时间】:2018-07-07 19:13:00
【问题描述】:

我正在使用以独立模式配置的 Spark 2.2.0 集群。 Cluster 有 2 台八核机器。该集群专门用于 Spark 作业,没有其他进程使用它们。我在这个集群上运行了大约 8 个 Spark Streaming 应用程序。
我明确地将 SPARK_WORKER_CORES(在 spark-env.sh 中)设置为 8,并使用 total-executor-cores 设置为每个应用程序分配一个内核。此配置降低了在多个任务上并行工作的能力。如果一个阶段在具有 200 个分区的分区 RDD 上工作,则一次只执行一个任务。我希望 Spark 做的是为每个作业和进程并行启动单独的线程。但是我找不到单独的 Spark 设置来控制线程数。
因此,我决定尝试将每台机器上的核心数(即 spark-env.sh 中的 SPARK_WORKER_CORES)增加到 1000。然后我为每个 Spark 应用程序分配了 100 个内核。我发现这次 spark 开始并行处理 100 个分区,这表明正在使用 100 个线程。
我不确定这是否是影响 Spark 作业使用的线程数的正确方法。

【问题讨论】:

    标签: apache-spark streaming distributed-computing apache-spark-standalone


    【解决方案1】:

    你把两件事搞混了:

    • 集群管理器属性 - SPARK_WORKER_CORES - worker 可以提供的内核总数。使用它来控制 Spark 总共应该使用的一小部分资源
    • 应用程序属性--total-executor-cores / spark.cores.max - 应用程序从集群管理器请求的核心数。使用它来控制应用内并行度。

    只要第一个不限制,只有第二个直接负责应用程序的并行性。

    Spark 中的CORE 也是线程的同义词。如果你:

    使用 total-executor-cores 设置为每个应用分配一个核心。

    然后你专门分配一个数据处理线程。

    【讨论】:

    • 是的,我知道这是两件不同的事情,但正如您在回答中所指出的那样,它们携手并进:total_executor_cores 必须小于 SPARK_WORKER_CORES。但是这一行回答了我的问题:“Spark 中的 CORE 是线程的同义词”
    猜你喜欢
    • 2019-12-27
    • 2017-02-28
    • 2022-10-02
    • 2012-02-24
    • 2019-01-09
    • 1970-01-01
    • 2015-07-14
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多