2017-03-06 43 views
0

我目前正在部署两个Spark应用程序,我想限制每个应用程序的内核和执行程序。我的配置如下: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

这样看来,一些流媒体应用需要比别人更多的内核。我的问题是什么决定了应用程序需要多少资源?为什么一个应用程序无法使用一个单核运行,同时它可以运行3个内核?

回答

1

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

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

http://spark.apache.org/docs/latest/streaming-programming-guide.html#important-points-to-remember

+0

我只用一个接收器。事实上,我创建直接流与使用此指令MQTT: 'JavaReceiverInputDStream 结果= MQTTUtils.createStream(JSSC,brokerUrl,mqttTopic,clientID的, \t \t \t \t用户名,密码,FALSE);' 基本上,后我使用下面的行来获取流数据,并做进一步的分析: 'JavaDStream 线= results.flatMap(新FlatMapFunction <字符串,字符串>(){ \t \t \t公共迭代呼叫(串x){ \t \t \t \t return Arrays.asList(x).iterator(); \t \t \t} \t \t});' –

+0

你可以看看星火UI,并检查执行页上的免费代码。如果没有空闲核心,请检查正在运行的任务并在此处发帖。 – zsxwing

+0

我一共有50个核心和13个使用。 –

相关问题