Apache spark Spark应用程序不能仅使用一个内核

Apache spark Spark应用程序不能仅使用一个内核,apache-spark,spark-streaming,Apache Spark,Spark Streaming,我目前正在部署两个spark应用程序,我想限制每个应用程序的核心和执行器。我的配置如下: spark.executor.cores=1 spark.driver.cores=1 spark.cores.max=1 spark.executor.instances=1 现在的问题是,使用这种精确的配置,一个流应用程序可以工作,而另一个不能。不工作的应用程序保持状态:正在运行并在日志中连续打印以下消息: 17/03/06 10:31:50 INFO JobScheduler: Added jobs

我目前正在部署两个spark应用程序,我想限制每个应用程序的核心和执行器。我的配置如下:

spark.executor.cores=1
spark.driver.cores=1
spark.cores.max=1
spark.executor.instances=1
现在的问题是,使用这种精确的配置,一个流应用程序可以工作,而另一个不能。不工作的应用程序保持状态:正在运行并在日志中连续打印以下消息:

17/03/06 10:31:50 INFO JobScheduler: Added jobs for time 1488814310000 ms
17/03/06 10:31:55 INFO JobScheduler: Added jobs for time 1488814315000 ms
令人惊讶的是,如果我将配置更改为以下内容,那么现在不工作的同一个应用程序将毫无问题地继续运行

spark.executor.cores=3
spark.driver.cores=1
spark.cores.max=3
spark.executor.instances=3
注意:应用程序不使用值2。这就是我至少使用3的原因。


因此,一些流媒体应用程序似乎比其他应用程序需要更多的内核。我的问题是什么决定了应用程序需要多少资源?为什么一个应用程序不能使用一个单核运行,而可以使用三个核运行?

您使用了多少个接收器?您必须确保有足够的内核用于运行接收器和Spark作业:

数据流与单个接收器相关联。为了实现读取并行性,需要创建多个接收器,即多个数据流。接收器在执行器中运行。它占据一个核心。确保在预订接收器插槽后有足够的内核进行处理,即spark.cores.max应考虑接收器插槽。接收器以循环方式分配给执行者


我只使用一个接收器。事实上,我使用以下指令使用MQTT创建了一个直接流:
JavaReceiverInputDStream results=MQTTUtils.createStream(jssc、brokerUrl、mqttTopic、clientID、用户名、密码、false)基本上,之后我使用以下行获取流数据并进行进一步分析:
JavaDStream lines=results.flatMap(新FlatMapFunction(){public Iterator call(String x){return array.asList(x.Iterator();}})您可以查看Spark UI并在executor页面上查看免费代码。如果没有可用的内核,那么检查正在运行的任务并在这里发布。我总共有50个内核和13个已使用的内核。即使在你设置了问题中提到的不起作用的配置之后?是的!我真的有这些核心,但它不工作!