Spark应用程序不能只用一个内核工作
问题描述:
我目前正在部署两个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个内核?
答
您使用了多少个接收器?您必须确保有足够的内核来运行接收器和Spark作业:
DStream与单个接收器关联。为了获得读取并行性,需要创建多个接收器,即多个DS流。接收器在执行器内运行。它占据了一个核心。确保在预订接收机时隙后有足够的内核进行处理,即spark.cores.max应考虑接收机时隙。接收器以循环方式分配给执行者。
http://spark.apache.org/docs/latest/streaming-programming-guide.html#important-points-to-remember
我只用一个接收器。事实上,我创建直接流与使用此指令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});' –
你可以看看星火UI,并检查执行页上的免费代码。如果没有空闲核心,请检查正在运行的任务并在此处发帖。 – zsxwing
我一共有50个核心和13个使用。 –