简单来说,Spark如何安排工作?

时间:2015-06-16 05:46:23

标签: apache-spark cloud bigdata

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

7 个答案:

答案 0 :(得分:4)

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

  • DAG调度程序将运算符划分为任务阶段。阶段由基于输入数据的分区的任务组成。 DAG调度程序将运营商连接在一起。对于例如许多地图运营商可以在一个阶段进行安排。 DAG调度程序的最终结果是一组阶段。

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

  • Worker在Slave上执行任务。

查看this answer了解更多信息

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

现在,Spark是以灵活的方式制作的,因此它将调度片解耦并使其可插拔。可以插入许多不同的调度程序。最受欢迎的3个是YARN,来自Hadoop,Mesos和Spark自己的内置调度程序。因此,调度有各种各样的行为。

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

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

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

答案 5 :(得分:0)

我会给你一个例子,

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

    1. 从HDFS读取数据
    2. 过滤op_1 on column_1
    3. 在第2栏上过滤操作
    4. 在column_3
    5. 上过滤操作
    6. 将RDD写入HDFS
  • Spark的DAGScheduler分析应用程序中的操作过程并设计实现任务的最佳方法
  • 我的意思是,它不是为每个过滤操作分别设置阶段,而是将所有三个过滤器视为一个阶段。因此,对于过滤器而言,它不会通过数据集三次,而是仅扫描一次。这肯定是优化的方式。

希望这会有所帮助。

答案 6 :(得分:0)

Spark峰会的Scheduler上的Dataricks会话:

https://youtu.be/rpKjcMoega0