我想只用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的代码。真诚地感谢大家的帮助。
答案 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使用单个分区,因此使用单个核心。