SPARK_WORKER_CORES 设置如何影响 Spark Standalone 中的并发性

How SPARK_WORKER_CORES setting impacts concurrency in Spark Standalone

我正在使用以独立模式配置的 Spark 2.2.0 集群。集群有 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 作业使用的线程数的正确方法。

你混淆了两件事:

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

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

另外CORE在Spark中是thread的同义词。如果你:

allocate one core to each app using total-executor-cores setting.

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