2015-06-16 31 views

回答

1

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

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

1

取决于你在呼唤什么样的工作 - 如果你正在谈论独立提交,这实际上并不是由spark而是由主机环境来处理(mesos或Hadoop YARN)

单个spark-context中的不同作业会,b除非将其配置为使用FAIR调度程序,否则使用FIFO

4

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

  • DAG调度程序将操作员划分为多个任务阶段。一个阶段由基于输入数据分区的任务组成。 DAG调度程序一起管理运营商。对于例如许多地图运营商可以安排在单一阶段。 DAG调度程序的最终结果是一系列阶段。

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

  • 工作人员执行从站上的任务。

看看this answer了解更多信息

+0

假设我在客户端模式下运行Spark Client程序,在独立模式下运行Spark Cluster。谁创建了一个DAG? Spark客户创建DAG还是Spark Master创建DAG? Spark客户端程序是否指导工作人员进行哪些转换? – user1870400

0

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

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

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

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

复杂的因素是任务之间有依赖关系。执行这些依赖关系实际上是计划过程的一部分,但Spark术语在这一点上会变得混乱。在Spark中,只有处理器的最终任务分配被称为“调度”。

0

我给你举个例子,

  • 假如你有一个做如下操作的应用,

    1. 阅读来自HDFS数据
    2. 上COLUMN_1
    3. 过滤运算
    4. 过滤器op on column_2
    5. column_3上的过滤器操作
    6. 写RDD到HDFS
  • 斯巴克的DAGScheduler分析应用程序动作的过程中,设计最好的办法来实现任务
  • 我的意思是,它的而不是每个过滤器的不同的阶段操作,它会将所有三个过滤器视为一个阶段。因此,不需要三次过滤数据集,它只会扫描一次。这当然是最佳的做法。

希望这会有所帮助。