简而言之,Spark如何调度作业?

gijlo24d  于 2023-05-18  发布在  Apache
关注(0)|答案(7)|浏览(278)

我想知道Spark是如何安排工作的。简单地说,请,我读过很多关于它是如何做到的描述,但它们太复杂了,无法理解。

wvyml7n5

wvyml7n51#

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

  • DAG调度程序将操作员划分为任务阶段。阶段由基于输入数据的分区的任务组成。DAG调度程序将操作符管道连接在一起。例如,可以在单个阶段中调度许多Map操作员。DAG调度程序的最终结果是一组阶段。
  • Stage被传递到任务调度器。任务调度器通过集群管理器启动任务。(Spark Standalone/Yarn/Mesos)。任务调度程序不知道阶段的依赖关系。
  • Worker在从机上执行任务。

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

fykwrbwg

fykwrbwg2#

这取决于你是如何称呼作业的--如果你是在谈论独立提交,这实际上不是由spark处理的,而是由主机环境(mesos或Hadoop YARN)处理的。
默认情况下,单个spark-context中的不同作业将使用FIFO,除非您将其配置为使用FAIR调度程序

wqnecbli

wqnecbli3#

我认为Spark工作是FIFO(先进先出)。

6qfn3psc

6qfn3psc4#

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

1zmg4dgp

1zmg4dgp5#

问得好这些术语在不同的地方以不同的方式使用,可能具有挑战性。Spark最令人困惑的是,应用程序的单次运行可以产生多个作业,每个作业都被分解成多个任务!例如,如果应用程序是多线程的,则每个线程都可以生成一个Spark作业。但是,在正常情况下,应用程序与工作是一对一的。应用程序运行一次生成一个作业。
现在,Spark是以一种灵活的方式制作的,因此它将调度部分解耦并使其可插拔。可以插入许多不同的调度程序。最流行的3个是来自Hadoop的YARN,Mesos和Spark自己的内置调度器。因此,存在各种各样的调度行为。
下一个令人困惑的事情是作业和任务都是计划的。作业已分配资源。这可以静态地完成,例如,一组服务器被分配给一个作业,然后该作业是唯一可以使用这些服务器的作业。或者,资源可以在作业之间共享。一旦分配了资源,作业就指向任务调度器。然后,作业生成任务并将其交给任务调度程序,任务调度程序将任务分配给特定的资源。将资源分配给作业的同一个实体还提供任务调度程序(IE、YARN、Mesos或Spark内置)。因此,任务调度器的工作方式也存在可变性。
通常,调度器尝试跟踪数据的位置,然后将任务分配到数据已经驻留的位置或存在大量可用网络容量用于移动数据的位置。
复杂的因素是任务之间有依赖关系。强制执行这些依赖性实际上是调度过程的一部分,但Spark术语在这一点上会混淆。在Spark中,只有任务最终分配给处理器才被称为“调度”。

hof1towb

hof1towb6#

我给予个例子,
1.假设您有一个应用程序,它执行以下操作,
1.从HDFS读取数据

  1. column_1上的过滤器操作
  2. column_2上的过滤器操作
  3. column_3上的过滤器操作
    1.将RDD写入HDFS
  4. Spark的DAGScheduler分析应用程序中的行动过程,并设计出实现任务的最佳方法
    1.我的意思是,它将所有三个过滤器视为一个阶段,而不是每个过滤器操作都有单独的阶段。因此,它不会为过滤器浏览数据集三次,而是只扫描一次。这无疑是最佳的方式。
    希望这对你有帮助。

相关问题