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

时间:2017-04-27 21:23:49

标签: apache-spark apache-spark-standalone

我使用 Spark独立模式 spark版本1.6.1 在slurm中运行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独立模式下利用资源。

那么当它有16个核心并且还有足够的分区时,每个执行器使用一个核心的火花怎么决定?我可以更改哪些内容可以利用所有内核?

我正在使用spark-on-slurm来启动这些工作。

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

- 掌握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)

谢谢,

3 个答案:

答案 0 :(得分:2)

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

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

你希望你的工作能够在执行者之间分配,以便正确地利用资源,但是发生了什么只是一个执行者正在启动,它不能利用核心的数量和你拥有的内存量。所以,你没有得到火花分布计算的味道。

您可以设置 SPARK_WORKER_INSTANCES = 5 并为每个执行者分配2个核心;所以,10个核心将被正确使用。 像这样,您可以调整配置以获得最佳性能。

答案 1 :(得分:0)

尝试设置spark.executor.cores(默认值为1)

根据Spark文档:

  

每个执行程序使用的核心数。仅适用于YARN和独立模式。在独立模式下,设置此参数允许应用程序在同一工作程序上运行多个执行程序,前提是该工作程序上有足够的核心。否则,每个应用程序只会运行一个执行程序。

请参阅https://spark.apache.org/docs/latest/configuration.html

答案 2 :(得分:0)

在星火群集模式下,应使用命令--num-executor“ numb_tot_cores * num_of_nodes”。例如,如果您有3个节点,每个节点有8个核心,则应编写--num-executors 24