当提交多个作业以同时运行或稍后提交较小的作业时测试 spark 作业的行为。我在 spark ui 中遇到了两个设置。一种是 spark 可用的调度模式,如下图所示
我想了解两种设置和抢占的区别。我的要求是,在运行较大的作业时,中间提交的小作业必须获得资源而无需等待更长时间。
最佳答案
让我解释一下 Spark On Yarn 模式。
当您向 spark 提交 scala 代码时,spark 客户端将与 yarn 交互并启动 yarn 应用程序。此应用程序将负责您的 Scala 代码中的所有作业。在大多数情况下,每个作业都对应一个reduce()、collect()这样的Spark Action。那么问题来了,如何在这个应用程序中调度不同的作业,例如,在你的应用程序中,有3个并发作业出来并且等待执行?为了应对,Spark为作业制定了调度器规则,包括FIFO和Fair。也就是说,spark调度器,包括FIFO和Fair,是在作业层面的,它是spark ApplicationMaster 做调度工作。
但是 yarn 的调度器,是容器级别的。Yarn 不关心这个容器中运行的是什么,也许容器是一个 Mapper 任务,一个 Reducer 任务,一个 Spark Driver 进程或 Spark 执行程序进程等。例如,您的 MapReduce 作业当前要求 10 个容器,每个容器需要(10g 内存和 2 个 vcores),而您的 spark 应用程序当前要求 4 个容器,每个容器需要(10g 内存和 2 个 vcores)。 Yarn 必须通过一条规则来决定集群中现在有多少个容器可用以及应该为每个请求分配多少资源,这条规则就是 Yarn 的调度器,包括 FairScheduler 和 CapacityScheduler。
一般来说,你的spark应用会向yarn请求几个container,yarn会由它的scheduler决定当前可以为你的spark应用分配多少container。分配完这些container后,Spark ApplicationMaster会决定如何分配这些container它的工作。
下面是关于spark scheduler的官方文档:https://spark.apache.org/docs/2.0.0-preview/job-scheduling.html#scheduling-within-an-application
关于java - spark中的spark调度模式和应用队列有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38874777/