Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 为什么Spark每个执行器只使用一个内核?它如何决定使用除分区数以外的核心?_Apache Spark_Apache Spark Standalone - Fatal编程技术网

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

Apache spark 为什么Spark每个执行器只使用一个内核?它如何决定使用除分区数以外的核心?,apache-spark,apache-spark-standalone,Apache Spark,Apache Spark Standalone,我正在slurm上的HPC环境中使用spark单机模式运行sparkspark版本1.6.1。问题是我的slurm节点在spark独立模式下没有完全使用。我在slurm脚本中使用spark submit。一个节点上有16个可用的内核,我在SPARK UI上看到,每个执行器都有16个内核。但实际上每个执行器只使用一个内核。运行executor进程的worker节点上的top+1命令显示16个cpu中只有一个cpu正在使用。我有255个分区,所以分区在这里似乎不是问题 $SPARK_HOME/bin

我正在slurm上的HPC环境中使用spark单机模式运行sparkspark版本1.6.1。问题是我的slurm节点在spark独立模式下没有完全使用。我在slurm脚本中使用spark submit。一个节点上有16个可用的内核,我在SPARK UI上看到,每个执行器都有16个内核。但实际上每个执行器只使用一个内核。运行executor进程的worker节点上的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个内核分配给executor,这是可以理解的,因为我们不再使用Spark独立群集模式。但现在,当我检查worker节点上的top+1命令时,所有的内核都被利用了,这提示问题不在于应用程序代码,而在于spark独立模式下的资源利用率

那么spark在有16个内核并且有足够的分区的情况下,如何决定每个执行器使用一个内核呢?我可以更改什么以使其能够利用所有内核?

我正在使用启动作业

两种情况下的火花配置如下:

——大师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.executor.cores(默认值为1)

根据Spark文档:

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


请参见

问题在于您只有一个工作节点。在spark standalone模式下,每个工作者实例启动一个执行器。要启动多个逻辑工作者实例以启动物理工作者中的多个执行器,您需要配置此属性: SPARK\u WORKER\u实例

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

您希望在执行器之间分配作业以正确利用资源,但实际情况是只有一个执行器被启动,无法利用核心数量和内存量。因此,您没有体验到spark分布式计算的味道

您可以设置SPARK\u WORKER\u实例=5 并为每个执行器分配2个内核;因此,10个核心将得到适当利用。
这样,您可以调整配置以获得最佳性能。

在spark cluster模式下,您应该使用命令--num executor“num\u tot\u cores*num\u of\u nodes”。例如,如果您有3个节点,每个节点有8个核,那么您应该编写--num executors 24

您正在运行哪种作业?数据来源是什么?有些作业不可并行化,有些数据源(如压缩文件)最初无法分区。该应用程序可并行化,在云环境中运行良好。因为云上的资源较少,我不得不搬到HPC。这些文件不是压缩的,它们是带有分子的SDF文件。对于版本1.6.1,它在独立模式下说全部,但我仍然会尝试。我玩了spark.executor.cores,它允许我制作更多的执行器,例如,我在一个节点上有16个核心。如果我将这个变量设置为5,那么我得到3个执行器,每个执行器有5个核心。但是当我看到top时,有三个java调用使用了大约33%,top+1只显示使用了CPU1,其余的15个CPU根本没有使用。在1.6.1中你是对的,这个属性应该没有用处。您能否提供更多关于如何启动独立群集的信息?您在executor选项卡的web ui(端口8080)上看到了什么?在executer选项卡上,我有一个executor和一个驱动程序。executor一次处理16个任务,但RDD块为0,当我将版本更改为spark 1.6.3时,RDD块为2。我想在这里补充一点,我不使用hdfs进行读写。我使用的是HPC系统附带的共享存储。