Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala ApacheSpark-Spark中的内部作业调度器如何定义用户和池_Scala_Hadoop_Apache Spark_Bigdata_Job Scheduling - Fatal编程技术网

Scala ApacheSpark-Spark中的内部作业调度器如何定义用户和池

Scala ApacheSpark-Spark中的内部作业调度器如何定义用户和池,scala,hadoop,apache-spark,bigdata,job-scheduling,Scala,Hadoop,Apache Spark,Bigdata,Job Scheduling,我很抱歉在这里有点笼统,但我对spark内部的作业调度工作有点困惑。从文档中我了解到它是Hadoop Fair Scheduler的某种实现 我无法理解到底谁是这里的用户(linux用户、hadoop用户、spark客户端?)。我也无法理解这里的池是如何定义的。例如,在我的hadoop集群中,我将资源分配给了两个不同的池(让我们称它们为Team1和Team2)。但是在spark集群中,不同的池和池中的用户不会实例化他们自己的spark上下文吗?这再次让我产生了一个问题:当我将属性设置为spark

我很抱歉在这里有点笼统,但我对spark内部的作业调度工作有点困惑。从文档中我了解到它是Hadoop Fair Scheduler的某种实现

我无法理解到底谁是这里的用户(linux用户、hadoop用户、spark客户端?)。我也无法理解这里的池是如何定义的。例如,在我的hadoop集群中,我将资源分配给了两个不同的池(让我们称它们为Team1和Team2)。但是在spark集群中,不同的池和池中的用户不会实例化他们自己的spark上下文吗?这再次让我产生了一个问题:当我将属性设置为spark.scheduler.pool时,我要传递哪些参数


我基本了解驱动程序如何实例化spark上下文,然后将其拆分为任务和作业。也许我完全没有抓住要点,但我真的很想了解Spark的内部调度程序在操作、任务和作业的上下文中是如何工作的。默认情况下,Spark与FIFO调度程序一起工作,其中作业以FIFO方式执行

但若你们在纱线上有你们的集群,纱线上有可插拔的调度器,这意味着在纱线上你们可以选择自己的调度器。如果您正在使用CDH分发的纱线,您将拥有Deafolt提供的FAIR scheduler,但您也可以选择Capacity scheduler

如果您正在使用HDP分发的纱线,默认情况下您将拥有容量调度器,如果需要,您可以转到FAIR

调度器如何使用spark

我假设你的火花团在纱线上

当您在spark中提交作业时,它首先会击中您的资源管理器。现在,您的资源管理器负责所有资源的调度和分配。因此,这与在Hadoop中提交作业基本相同

调度器是如何工作的

公平调度是一种将资源分配给作业的方法,使所有作业在一段时间内平均获得相等的资源份额。当运行单个作业时,该作业将使用整个集群。提交其他作业时,将释放的任务槽分配给新作业,以便每个作业获得大致相同的CPU时间(使用抢占杀死所有使用过的任务)。与默认的Hadoop调度程序(FIFO)不同,它形成了一个作业队列,它允许短作业在合理的时间内完成,而不会使长作业处于饥饿状态。这也是在多个用户之间共享集群的合理方式。最后,公平共享还可以与作业优先级一起使用-优先级用作权重,以确定每个作业应获得的总计算时间的分数


CapacityScheduler旨在允许共享大型集群,同时为每个组织提供最低容量保证。核心思想是Hadoop Map Reduce集群中的可用资源在多个组织之间进行划分,这些组织根据计算需求共同为集群提供资金。还有一个额外的好处是,一个组织可以访问任何多余的容量,而不被其他人使用。这以经济高效的方式为组织提供了弹性。

Spark内部使用FIFO/FCFS作业调度器。但是,当你谈论任务时,它是以循环方式工作的。如果我们将注意力集中在以下示例上,就会很清楚:

假设Spark自己队列中的第一个作业不需要使用集群的所有资源;因此,队列中的第二个作业也将立即开始执行。现在,两个作业同时运行。为了执行整个作业,每个作业要执行的任务很少。假设第一个作业分配10个任务,第二个作业分配8个任务。然后,这18个任务将以抢占方式共享整个集群的CPU周期。如果您想进一步深入,让我们从执行器开始

群集中的执行器将很少。假设数字是6。所以,在理想情况下,每个执行器将被分配3个任务,这3个任务将获得和执行器相同的CPU时间(单独的JVM)

这就是spark内部安排任务的方式。

我发现官方非常详尽,涵盖了您的所有问题。然而,人们可能会发现从第一次开始就很难消化

在深入研究细节之前,让我们先给出一些定义和粗略的类比
application
是创建SparkContext
sc
的工具,可以称为使用spark submit部署的工具
job
是spark对转换的定义中的一个动作,表示计数、收集等

有两个主要且在某种意义上是独立的主题:跨
应用程序的调度和
应用程序内的调度。前者更多地涉及资源管理器,包括Spark Standalone FIFO only模式以及静态和动态分配的概念

稍后,正如我从您的评论中了解到的,Spark
应用程序中的日程安排是您的问题。让我试着描述一下在某种抽象层次上发生了什么

假设您提交了
申请
,并且有两份
工作

sc.textFile("..").count()   //job1
sc.textFile("..").collect() //job2
如果这段代码恰好在同一个线程中执行,那么这里就没有什么有趣的事情发生,job2及其所有任务只有在job1完成后才能获得资源

现在假设你有以下几点

thread1 { job1 }
thread2 { job2 } 
sc.setLocalProperty("spark.scheduler.pool", "pool1").textFile("").count() // job1
sc.setLocalProperty("spark.scheduler.pool", "pool2").textFile("").collect() // job2
这越来越有趣了。默认情况下,在
应用程序中
调度程序将使用FIFO将资源分配给调度程序最先出现的
作业
的所有任务。另一个
作业
的任务只有在有备用核心并且没有更多优先的
作业
中的挂起任务时才会获得资源

现在假设您设置了
spark.scheduler.mode=F
thread1 { job1 } // pool1
thread2 { job2 } // pool2