繁体   English   中英

简单来说,Spark是如何调度作业的?

[英]In simple terms, how does Spark schedule jobs?

只是想知道 Spark 如何安排作业? 简单来说,我已经阅读了很多关于它是如何做到的描述,但它们太复杂而无法理解。

在高层次上,当在 RDD 上调用任何操作时,Spark 会创建 DAG 并提交给 DAG 调度程序。

  • DAG 调度器将算子划分为任务阶段。 一个阶段由基于输入数据分区的任务组成。 DAG 调度程序将操作符管道在一起。 例如,许多地图操作符可以在一个阶段进行调度。 DAG 调度程序的最终结果是一组阶段。

  • 阶段被传递给任务调度程序。任务调度程序通过集群管理器启动任务。(Spark Standalone/Yarn/Mesos)。 任务调度程序不知道阶段的依赖关系。

  • Worker 在 Slave 上执行任务。

查看此答案以获取更多信息

取决于您所说的作业 - 如果您谈论的是独立提交,这实际上不是由 spark 处理的,而是由主机环境(mesos 或 Hadoop YARN)处理的

默认情况下,单个 spark-context 中的不同作业将使用 FIFO,除非您将其配置为使用 FAIR 调度程序

我认为火花作业是 FIFO(先进先出)。

Spark 的调度程序以 FIFO 方式运行作业。

还可以配置作业之间的公平共享。

要启用公平调度程序,只需在配置 SparkContext 时将spark.scheduler.mode属性设置为 FAIR:

> val conf = new SparkConf().setMaster(...).setAppName(...)
> conf.set("spark.scheduler.mode", "FAIR") val sc = new
> SparkContext(conf)

有关更多详细信息,请查看https://spark.apache.org/docs/1.2.0/job-scheduling.html

好问题。 这些术语在不同的地方以不同的方式使用,并且可能具有挑战性。 Spark 最令人困惑的地方在于,应用程序的单次运行可以产生多个作业,每个作业又被分解为多个任务! 例如,如果应用程序是多线程的,则每个线程都可以生成一个 Spark 作业。 但是,在正常情况下,应用程序与工作是一对一的。 应用程序的一次运行生成一个作业。

现在,Spark 以一种灵活的方式制作,因此它解耦了调度部分并使其可插入。 可以插入许多不同的调度程序。最流行的 3 个是 YARN,来自 Hadoop、Mesos 和 Spark 自己的内置调度程序。 因此,调度的行为有多种。

下一个令人困惑的事情是作业和任务都已安排。 为作业分配了资源。 这可以静态完成,因此,假设将一组服务器分配给一个作业,然后该作业是唯一可以使用这些服务器的作业。 或者,可以在作业之间共享资源。 分配资源后,该作业将指向任务调度程序。 然后作业生成任务并将它们交给任务调度程序,后者将任务分配给特定资源。 将资源分配给作业的同一实体还提供任务调度程序(IE、YARN、Mesos 或 Spark 内置)。 因此,任务调度程序的工作方式也存在差异。

通常,调度程序会尝试跟踪数据的位置,然后将任务分配到数据已经驻留的位置或有足够的可用网络容量来移动数据的位置。

复杂的因素是任务相互依赖。 强制执行这些依赖项实际上是调度过程的一部分,但 Spark 术语在这一点上变得混乱。 在 Spark 中,只有将任务最终分配给处理器才称为“调度”。

我给你举个例子

  • 假设您有一个执行以下操作的应用程序,

    1. 从 HDFS 读取数据
    2. 在 column_1 上过滤操作
    3. 在 column_2 上过滤操作
    4. 在 column_3 上过滤操作
    5. 将 RDD 写入 HDFS
  • Spark 的 DAGScheduler 分析应用程序中的动作过程并设计完成任务的最佳方法
  • 我的意思是,它不是为每个过滤器操作设置单独的阶段,而是将所有三个过滤器视为一个阶段。 因此,它不会为过滤器遍历数据集三次,而是只扫描一次。 这肯定是优化的方式。

希望这可以帮助。

调度程序 Spark 峰会上的 Dataricks 会议:

https://youtu.be/rpKjcMoega0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM