虽然我只设置了1个线程,但Spark使用了所有可用的内核

时间:2016-02-22 08:23:12

标签: apache-spark

我想只用1个线程运行Spark。但无论我尝试什么选项,Spark总是在我的CPU中使用所有8个内核。

我尝试了--master local--master local[1]--executor-cores 1--total-executor-cores 1--conf spark.max.cores=1选项的各种混合,但没有任何效果。当我在Ubuntu 14.04上看到top结果时,CPU使用率总是大约600%(大约75%* 8个核心)。

我的目标是通过改变使用的核心数来比较Spark任务的运行时间。请帮忙!

**已添加

我正在处理来自https://github.com/amplab/SparkNet/blob/master/src/main/scala/apps/CifarApp.scala的代码。真诚地感谢大家的帮助。

2 个答案:

答案 0 :(得分:1)

首先,您要混合属于不同部署模式的选项。 spark.cores.max(非spark.max.cores)或spark.executor.cores等参数仅在独立模式(与本地模式不同)和纱线上有意义。

在本地模式的情况下,唯一真正重要的是与主定义(local[n])一起传递的参数 n 。它并不意味着local[1]只能使用一个线程运行。单独的Spark使用了许多不同的线程(如果我没记错的话,大约20个)用于簿记,监督,随机播放,UI和其他内容。

有限的是执行程序线程的数量。它仍然并不意味着单个执行程序不能启动多个线程,这很可能是这里的情况。您正在使用专为并行执行而设计的库。如果您不使用GPU,则计算很可能在CPU上并行执行。所有这些都是独立的,不受Spark本身控制。如果您想要完全控制,则应在受限制的环境(如VM或容器)中执行应用程序。

答案 1 :(得分:-2)

您引用的代码使用SparkContext.parallelize(...)而未设置numPartitions参数。这意味着spark.default.parallelism(请参阅docs)的值用于确定要使用的部件数==核心。

从文档中,此参数默认为:

  

对于没有父RDD并行化的操作,它取决于集群管理器:

     
      
  • 本地模式:本地计算机上的核心数
  •   

因此,在命令中添加--conf spark.default.parallelism=1应该使这些RDD使用单个分区,因此使用单个核心。