在一个spark作业内部,多个并行的job是可以同时运行的。对于job,就是一个spark action操作触发的计算单元。spark的调度器是完全线程安全的,而且支持一个spark application来服务多个网络请求,以及并发执行多个job。
默认情况下,spark的调度会使用FIFO的方式来调度多个job。每个job都会被划分为多个stage,而且第一个job会对所有可用的资源获取优先使用权,并且让它的stage的task去运行,然后第二个job再获取资源的使用权,以此类推。如果队列头部的job不需要使用整个集群资源,之后的job可以立即运行,但是如果队列头部的job使用了集群几乎所有的资源,那么之后的job的运行会被推迟。
从spark 0.8开始,我们是可以在多个job之间配置公平的调度器的。在公平的资源共享策略下,spark会将多个job的task使用一种轮询的方式来分配资源和执行,所以所有的job都有一个基本公平的机会去使用集群的资源。这就意味着,即使运行时间很长的job先提交并在运行了,之后提交的运行时间较短的job,也同样可以立即获取到资源并且运行,而不会等待运行时间很长的job结束之后才能获取到资源。这种模式对于多个并发的job是最好的一种调度方式。
网友评论