我目前正在部署两个spark应用程序,我想限制每个应用程序的内核和执行程序。我的配置如下:
spark.executor.cores=1
spark.driver.cores=1
spark.cores.max=1
spark.executor.instances=1
现在的问题是,通过这种精确配置,一个流应用程序可以正常工作,而另一个则不然。无效的应用程序保持状态:RUNNING并在日志中连续打印以下消息:
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个核心?
答案 0 :(得分:1)
您使用了多少接收器?您必须确保有足够的内核来运行接收器和Spark作业:
DStream与单个接收器关联。为了获得读并行性,需要创建多个接收器,即多个DStream。接收器在执行器内运行。它占据一个核心。确保在预订接收器插槽后有足够的内核进行处理,即spark.cores.max应考虑接收器插槽。接收者以循环方式分配给执行者。
http://spark.apache.org/docs/latest/streaming-programming-guide.html#important-points-to-remember