我想知道Spark是如何安排工作的。简单地说,请,我读过很多关于它是如何做到的描述,但它们太复杂了,无法理解。
wvyml7n51#
在高层,当RDD上调用任何操作时,Spark创建DAG并提交给DAG调度程序。
查看此答案以获取更多信息
fykwrbwg2#
这取决于你是如何称呼作业的--如果你是在谈论独立提交,这实际上不是由spark处理的,而是由主机环境(mesos或Hadoop YARN)处理的。默认情况下,单个spark-context中的不同作业将使用FIFO,除非您将其配置为使用FAIR调度程序
wqnecbli3#
我认为Spark工作是FIFO(先进先出)。
6qfn3psc4#
Spark的调度器以FIFO方式运行作业。还可以配置作业之间的公平共享。要启用公平调度器,只需在配置SparkContext时将spark.scheduler.mode属性设置为FAIR:
spark.scheduler.mode
> 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
1zmg4dgp5#
问得好这些术语在不同的地方以不同的方式使用,可能具有挑战性。Spark最令人困惑的是,应用程序的单次运行可以产生多个作业,每个作业都被分解成多个任务!例如,如果应用程序是多线程的,则每个线程都可以生成一个Spark作业。但是,在正常情况下,应用程序与工作是一对一的。应用程序运行一次生成一个作业。现在,Spark是以一种灵活的方式制作的,因此它将调度部分解耦并使其可插拔。可以插入许多不同的调度程序。最流行的3个是来自Hadoop的YARN,Mesos和Spark自己的内置调度器。因此,存在各种各样的调度行为。下一个令人困惑的事情是作业和任务都是计划的。作业已分配资源。这可以静态地完成,例如,一组服务器被分配给一个作业,然后该作业是唯一可以使用这些服务器的作业。或者,资源可以在作业之间共享。一旦分配了资源,作业就指向任务调度器。然后,作业生成任务并将其交给任务调度程序,任务调度程序将任务分配给特定的资源。将资源分配给作业的同一个实体还提供任务调度程序(IE、YARN、Mesos或Spark内置)。因此,任务调度器的工作方式也存在可变性。通常,调度器尝试跟踪数据的位置,然后将任务分配到数据已经驻留的位置或存在大量可用网络容量用于移动数据的位置。复杂的因素是任务之间有依赖关系。强制执行这些依赖性实际上是调度过程的一部分,但Spark术语在这一点上会混淆。在Spark中,只有任务最终分配给处理器才被称为“调度”。
hof1towb6#
我给予个例子,1.假设您有一个应用程序,它执行以下操作,1.从HDFS读取数据
anauzrmj7#
Spark Summit on Scheduler中的Databricks会议:Deep Dive into the Apache Spark Scheduler (Xingbo Jiang) - YouTube
7条答案
按热度按时间wvyml7n51#
在高层,当RDD上调用任何操作时,Spark创建DAG并提交给DAG调度程序。
查看此答案以获取更多信息
fykwrbwg2#
这取决于你是如何称呼作业的--如果你是在谈论独立提交,这实际上不是由spark处理的,而是由主机环境(mesos或Hadoop YARN)处理的。
默认情况下,单个spark-context中的不同作业将使用FIFO,除非您将其配置为使用FAIR调度程序
wqnecbli3#
我认为Spark工作是FIFO(先进先出)。
6qfn3psc4#
Spark的调度器以FIFO方式运行作业。
还可以配置作业之间的公平共享。
要启用公平调度器,只需在配置SparkContext时将
spark.scheduler.mode
属性设置为FAIR:有关详细信息,请参阅https://spark.apache.org/docs/1.2.0/job-scheduling.html
1zmg4dgp5#
问得好这些术语在不同的地方以不同的方式使用,可能具有挑战性。Spark最令人困惑的是,应用程序的单次运行可以产生多个作业,每个作业都被分解成多个任务!例如,如果应用程序是多线程的,则每个线程都可以生成一个Spark作业。但是,在正常情况下,应用程序与工作是一对一的。应用程序运行一次生成一个作业。
现在,Spark是以一种灵活的方式制作的,因此它将调度部分解耦并使其可插拔。可以插入许多不同的调度程序。最流行的3个是来自Hadoop的YARN,Mesos和Spark自己的内置调度器。因此,存在各种各样的调度行为。
下一个令人困惑的事情是作业和任务都是计划的。作业已分配资源。这可以静态地完成,例如,一组服务器被分配给一个作业,然后该作业是唯一可以使用这些服务器的作业。或者,资源可以在作业之间共享。一旦分配了资源,作业就指向任务调度器。然后,作业生成任务并将其交给任务调度程序,任务调度程序将任务分配给特定的资源。将资源分配给作业的同一个实体还提供任务调度程序(IE、YARN、Mesos或Spark内置)。因此,任务调度器的工作方式也存在可变性。
通常,调度器尝试跟踪数据的位置,然后将任务分配到数据已经驻留的位置或存在大量可用网络容量用于移动数据的位置。
复杂的因素是任务之间有依赖关系。强制执行这些依赖性实际上是调度过程的一部分,但Spark术语在这一点上会混淆。在Spark中,只有任务最终分配给处理器才被称为“调度”。
hof1towb6#
我给予个例子,
1.假设您有一个应用程序,它执行以下操作,
1.从HDFS读取数据
1.将RDD写入HDFS
1.我的意思是,它将所有三个过滤器视为一个阶段,而不是每个过滤器操作都有单独的阶段。因此,它不会为过滤器浏览数据集三次,而是只扫描一次。这无疑是最佳的方式。
希望这对你有帮助。
anauzrmj7#
Spark Summit on Scheduler中的Databricks会议:
Deep Dive into the Apache Spark Scheduler (Xingbo Jiang) - YouTube