我找官方文档 https://spark.apache.org/docs/2.4.0/job-scheduling.html#scheduling-within-an-application非常全面,涵盖了您所有的问题。然而,人们可能会觉得从第一次开始就很难消化。
在深入研究细节之前,让我们先给出一些定义和粗略的类比。application
是什么创建了 SparkContextsc
并且可能被称为您部署的东西火花提交. job
是 Spark 定义中的一个动作转变与行动意思是类似的东西count, collect etc.
有两个主要且在某种意义上是独立的主题:application
以及内部调度application
。前者更多地与资源管理器相关,包括 Spark Standalone 仅 FIFO 模式以及static and dynamic分配。
后者,Spark 内的调度application
正如我从你的评论中了解到的,这是你的问题的问题。让我尝试在某种抽象层面上描述那里发生的事情。
假设您提交了您的application
你有两个job
s
sc.textFile("..").count() //job1
sc.textFile("..").collect() //job2
如果这段代码恰好在同一个线程中执行,那么这里就不会发生太多有趣的事情,job2及其所有的tasks获取资源仅在那之后 job1已经完成了。
现在假设您有以下内容
thread1 { job1 }
thread2 { job2 }
这越来越有趣了。默认情况下,在您的application
调度程序将使用FIFO将资源分配给任何一个的所有任务job
碰巧首先出现在调度程序中。给对方的任务job
仅当有空闲核心并且没有来自更多“优先级”优先的任务时才会获取资源job
.
现在假设你设置spark.scheduler.mode=FAIR
为您application
。从现在起每job
有一个概念pool
它属于。如果你什么都不做,那么对于每项工作pool
标签是“默认”。为您设置标签job
你可以执行以下操作
sc.setLocalProperty("spark.scheduler.pool", "pool1").textFile("").count() // job1
sc.setLocalProperty("spark.scheduler.pool", "pool2").textFile("").collect() // job2
这里的一个重要注意事项是设置本地属性 https://spark.apache.org/docs/2.4.0/api/scala/index.html#org.apache.spark.SparkContext@setLocalProperty(key:String,value:String):Unit对每个线程以及所有生成的线程都有效。对我们来说意味着什么?好吧,如果你在同一个线程中,那就没有什么意义了job
s 被依次执行。
但是,一旦您具备以下条件
thread1 { job1 } // pool1
thread2 { job2 } // pool2
job1 and job2在资源分配的意义上变得无关。一般来说,正确配置每个pool在公平调度程序中file https://spark.apache.org/docs/2.4.0/job-scheduling.html#configuring-pool-properties with 最小份额 > 0你可以确定job
来自不同池的人将有资源继续进行。
然而,您还可以走得更远。默认情况下,在每个pool
job
s 在 a 中排队FIFO方式,这种情况与我们有 FIFO 模式时的场景基本相同,job
来自不同线程。要改变你需要改变pool
在 xml 文件中有<schedulingMode>FAIR</schedulingMode>
.
鉴于这一切,如果你只是设置spark.scheduler.mode=FAIR
并让所有的job
s 落入同一个“默认”池中,这与使用默认池大致相同spark.scheduler.mode=FIFO
并有你的job
在不同的线程中启动。如果您仍然只想要单个“默认”fair池只需更改 xml 文件中“默认”池的配置即可反映这一点。
发挥机制作用pool
你需要定义这个概念user
这与将“spark.scheduler.pool”从正确的线程设置为正确的值相同。例如,如果您的application
监听JMS,然后消息处理器可以为每个消息处理设置池标签job
取决于其内容。
最终,不确定字数是否少于官方文档中的字数,但希望它能以某种方式有所帮助:)