apache-spark - 为什么 Spark 每个执行器只使用一个内核?它如何决定使用分区数量以外的核心?

标签 apache-spark apache-spark-standalone

我使用 Spark 独立模式 spark 版本 1.6.1 在 slurm 上的 HPC 环境中运行 spark。问题是我的 slurm 节点没有在 spark 独立模式下完全使用。我在我的 slurm 脚本中使用 spark-submit。一个节点上有 16 个可用内核,我在 SPARK UI 上看到每个执行程序都有 16 个内核。但实际上每个执行者只使用一个核心。运行执行程序进程的工作节点上的 top + 1 命令显示 16 个 cpu 中只有一个 cpu 被使用。我有 255 个分区,所以分区在这里似乎不是问题。

$SPARK_HOME/bin/spark-submit \
            --class se.uu.farmbio.vs.examples.DockerWithML \
            --master spark://$MASTER:7077 \
            --executor-memory 120G \
            --driver-memory 10G \

当我将脚本更改为

$SPARK_HOME/bin/spark-submit \
            --class se.uu.farmbio.vs.examples.DockerWithML \
            --master local[*] \
            --executor-memory 120G \
            --driver-memory 10G \

我在 Spark UI 上看到 0 个核心分配给执行程序,这是可以理解的,因为我们不再使用 spark 独立集群模式。但是现在,当我在工作节点上检查 top + 1 命令时,所有内核都被利用了,这表明问题不在于应用程序代码,而在于 spark 独立模式对资源的利用。

那么当 spark 有 16 个核心并且有足够的分区时,它如何决定每个执行器使用一个核心?我可以更改什么以便它可以利用所有内核?

我正在使用 spark-on-slurm用于启 Action 业。

两种情况下的 Spark 配置都是休闲的:

--master spark://MASTER:7077

(spark.app.name,DockerWithML)                       
(spark.jars,file:/proj/b2015245/bin/spark-vs/vs.examples/target/vs.examples-0.0.1-jar-with-dependencies.jar)                        
(spark.app.id,app-20170427153813-0000)                      
(spark.executor.memory,120G)                        
(spark.executor.id,driver)                      
(spark.driver.memory,10G)                       
(spark.history.fs.logDirectory,/proj/b2015245/nobackup/eventLogging/)                       
(spark.externalBlockStore.folderName,spark-75831ca4-1a8b-4364-839e-b035dcf1428d)                        
(spark.driver.maxResultSize,2g)                     
(spark.executorEnv.OE_LICENSE,/scratch/10230979/SureChEMBL/oe_license.txt)                      
(spark.driver.port,34379)                       
(spark.submit.deployMode,client)                        
(spark.driver.host,x.x.x.124)                       
(spark.master,spark://m124.uppmax.uu.se:7077)

--本地大师[*]

(spark.app.name,DockerWithML)                                   
(spark.app.id,local-1493296508581)                                  
(spark.externalBlockStore.folderName,spark-4098cf14-abad-4453-89cd-3ce3603872f8)                                    
(spark.jars,file:/proj/b2015245/bin/spark-vs/vs.examples/target/vs.examples-0.0.1-jar-with-dependencies.jar)                                    
(spark.driver.maxResultSize,2g)                                 
(spark.master,local[*])                                 
(spark.executor.id,driver)                                  
(spark.submit.deployMode,client)                                    
(spark.driver.memory,10G)                                   
(spark.driver.host,x.x.x.124)                                   
(spark.history.fs.logDirectory,/proj/b2015245/nobackup/eventLogging/)                                   
(spark.executorEnv.OE_LICENSE,/scratch/10230648/SureChEMBL/oe_license.txt)                                  
(spark.driver.port,36008)

谢谢,

最佳答案

问题是您只有一个工作节点。在 spark 独立模式下,每个工作实例启动一个执行程序。要启动多个逻辑 worker 实例以在物理 worker 中启动多个执行程序,您需要配置此属性: SPARK_WORKER_INSTANCES

默认情况下,它设置为 1。您可以根据您在代码中进行的计算相应地增加它,以利用您拥有的资源量。

您希望将您的工作分配给执行程序以正确利用资源,但实际情况是只有一个执行程序启动,无法利用您拥有的核心数量和内存量。所以,你没有得到 spark 分布式计算的味道。

您可以设置 SPARK_WORKER_INSTANCES = 5 并为每个executor分配2个core;因此,10 个核心将得到适当利用。 像这样,您可以调整配置以获得最佳性能。

关于apache-spark - 为什么 Spark 每个执行器只使用一个内核?它如何决定使用分区数量以外的核心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43668146/

相关文章:

apache-spark - 无法加载 Parquet 文件(不支持 Parquet 类型 : INT32 (UINT_8);) with pyspark

apache-spark - 使用 Spark SQL 的 SELECT 语句中的 cassandra uuid

apache-spark - Apache Spark独立调度程序-为什么驱动程序需要在 'cluster'模式下使用整个内核?

windows - Windows机器上Spark应用如何搭建集群环境?

apache-spark - 如何在特定节点上运行 Spark 作业

java - 在 Spark StandAlone 上使用 Logback 进行日志记录

python - pyspark 和 HDFS 命令

logging - Spark 输出: log-style vs progress-style

scala - 使用 sbt 测试运行时 Spark 测试失败

apache-spark - 为什么 Apache Livy session 显示应用程序 ID 为 NULL?