当前位置: 首页 > 知识库问答 >
问题:

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

贝财
2023-03-14
$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个内核分配给executor,这是可以理解的,因为我们不再使用Spark独立集群模式。但是现在,当我在worker节点上检查top+1命令时,所有的内核都被利用了,这表明问题不在于应用程序代码,而在于spark独立模式对资源的利用。

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

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

(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)

谢谢,

共有1个答案

隆向晨
2023-03-14

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

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

您希望您的工作在执行器之间分配,以便正确地利用资源,但现在发生的情况是,只有一个执行器启动,它无法利用内核的数量和您拥有的内存量。因此,您没有得到spark分布式计算的味道。

 类似资料:
  • 但是我仍然不能强迫spark使用100个内核,这是我在对早期测试进行基准测试时所需要的。 我使用的是Apache Spark 1.6.1。集群上的每个节点包括驱动程序都有16个内核和112GB内存。它们在Azure(hdinsight集群)上。2个驱动节点+7个工作节点。

  • Apache Spark:核心数与执行器数 由于每个案例都不一样,我又问了一个类似的问题。 我正在运行一个cpu密集型的应用程序,具有相同数量的核心和不同的执行器。以下是观察结果。 更新 案例3:执行器-12个,每个执行器的核心数-1个,执行器内存-3个,数据处理量-10 GB,分区-36个,作业持续时间:81分钟

  • 假设我每个执行器有36个核心,每个节点有一个执行器,以及3个节点,每个节点有48个可用核心。我注意到的基本要点是,当我将每个任务设置为使用1个内核(默认值)时,我对workers的CPU利用率约为70%,每个执行器将同时执行36个任务(正如我所预期的那样)。然而,当我将配置更改为每个任务有6个内核时(conf spark.task.cpus=6),每个执行器一次会减少到6个任务(如预期的那样),但

  • 问题内容: 我读到每个应用程序都在自己的JVM中运行。为什么会这样呢?他们为什么不让一个JVM运行2个或更多应用程序? 我说的是通过公共静态void main(String [])方法启动的应用程序…) 问题答案: (我假设您正在谈论通过方法启动的应用程序…) 理论上,您可以在JVM中运行多个应用程序。实际上,它们可以以各种方式相互干扰。例如: JVM具有一组System.in/out/err,一

  • 我正在实现一个自定义消费者的主题/分区分配在Kafka。为此,我将重写抽象类,该类又实现接口。 作为自定义赋值器的一部分,我希望发送一个关于消费者订阅的每个主题的每个分区的单个(浮动)信息。 我知道可以通过重写接口的默认方法向赋值器发送自定义数据。 但是,问题是,从上面的方法签名中,我无法获得为使用者注册的每个主题分配给带下划线使用者的分区列表。 谢谢你。