hadoop 支持哪些调度器?

2021-04-23 20:56发布

11条回答
等等同学
2楼 · 2021-04-25 09:32

Hadoop调度器重要分为三类:

FIFO 、Capacity Scheduler(容量调度器)和Fair Sceduler(公平调度器)。


ban_gank
3楼 · 2021-04-25 10:07

1、Fifo:默认的调度器,它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业。


2、计算能力调度器Capacity schedular:支持多个队列,每个队列可配置一定的资源量,每个队列采用FIFO调度策略,为了防止同一个作业独占队列中的资源,该调度器会对同一用户提交的作业所占资源进行限定。调度时,首先按照以下策略选择一个合适队列:计算每个正在运行任务数与其应该分得的计算资源之间的比值,选择一个该比值最小的队列;然后按以下策略选择队列中一个作业,按照作业优先级和提交时间顺序选择,同时考虑用户资源量限制和内存限制。


3、公平调度器Fair scheduler 同计算能力调度器类似,支持多队列多用户。每个队列的资源量可配置,同一队列中的作业公平共享队列中所有资源。


实际上,Hadoop的调度器远不止以上三种,最近,出现了很多针对新型应用的Hadoop调度器。


4、适用于异构集群的调度器LATE

现有的Hadoop调度器都是建立在同构集群的假设前提下,具体假设如下:


1)集群中各个节点的性能完全一样


2)对于reduce task,它的三个阶段:copy、sort和reduce,用时各占1/3


3)同一job的同类型的task是一批一批完成的,他们用时基本一样。


啦啦啦
4楼 · 2021-04-25 10:12

Hadoop调度器重要分为三类:

FIFO 、Capacity Scheduler(容量调度器)和Fair Sceduler(公平调度器)。

Hadoop2.7.2默认的资源调度器是容量调度器


722
5楼 · 2021-04-25 10:13

(1)FIFO Scheduler

将所有的Applications放到队列中,先按照作业的优先级高低、再按照到达时间的先后,为每个app分配资源。如果第一个app需要的资源被满足了,如果还剩下了资源并且满足第二个app需要的资源,那么就为第二个app分配资源,and so on。

优点:简单,不需要配置。

缺点:不适合共享集群。如果有大的app需要很多资源,那么其他app可能会一直等待。

一个例子

上图的示例:有一个很大的job1,它先提交,并且占据了全部的资源。那么job2提交时发现没有资源了,则job2必须等待job1执行结束,才能获得资源执行。

配置

FIFO Scheduler不需要配置

(2)Capacity Scheduler

CapacityScheduler用于一个集群(集群被多个组织共享)中运行多个Application的情况,目标是最大化吞吐量和集群利用率。

CapacityScheduler允许将整个集群的资源分成多个部分,每个组织使用其中的一部分,即每个组织有一个专门的队列,每个组织的队列还可以进一步划分成层次结构(Hierarchical Queues),从而允许组织内部的不同用户组的使用。
每个队列内部,按照FIFO的方式调度Applications。当某个队列的资源空闲时,可以将它的剩余资源共享给其他队列。

if there is more than one job in the queue and there are idle resources available, then the Capacity Scheduler may allocate the spare resources to jobs in the queue, even if that causes the queue’s capacity to be exceeded This behavior is known as queue elasticity.

配置

CapacityScheduler的配置文件etc/hadoop/capacity-scheduler.xml

 说明:root队列下面有两个队列,分别为prod(40%的容量,即使用40%的集群资源)和dev(60%的容量,最大的75%  ->  说明即使prod队列空闲了,那么dev最多只能使用75%的集群资源。这样就可以保证prod中添加新的apps时马上可以使用25%的资源)。

除了队列的容量和层次,还可以指定单个用户或者应用被分配的资源大小、同时可以运行的app数量、队列的ACLs。

可以指定app要放在哪个队列中。如果不指定,app将会被放在名字是 default的队列中。

CapacityScheduler的队列名字必须是层次结构最后的名字,比如eng。不能是root.dev.eng或者dev.eng。

一个例子

 

上图的示例:有一个专门的队列允许小的apps提交之后能够尽快执行,注意到job1先提交,先执行时并没有占用系统的全部资源(假如job1需要100G内存,但是整个集群只有100G内存,那么只分配给job1  80G),而是保留了一部分的系统资源。

队列放置

可以再hadoop应用内部指定配置mapreduce.job.queuename来指定要使用的队列,例如mapreduce.job.eng。如果不指定,则被放入default的队列。

(3)Fair Scheduler 

FairScheduler允许应用在一个集群中公平地共享资源。默认情况下FairScheduler的公平调度只基于内存,也可以配置成基于memory and CPU。当集群中只有一个app时,它独占集群资源。当有新的app提交时,空闲的资源被新的app使用,这样最终每个app就会得到大约相同的资源。可以为不同的app设置优先级,决定每个app占用的资源百分比。FairScheduler可以让短的作业在合理的时间内完成,而不必一直等待长作业的完成。

Fair Sharing: Scheduler将apps组织成queues,将资源在这些queues之间公平分配。默认情况下,所有的apps都加入到名字为“default“的队列中。app也可以指定要加入哪个队列中。队列内部的默认调度策略是基于内存的共享策略,也可以配置成FIFO和multi-resource with Dominant Resource Fairness

Minimum Sharing:FairScheduller提供公平共享,还允许指定minimum shares to queues,从而保证所有的用户以及Apps都能得到足够的资源。如果有的app用不了指定的minimum的资源,那么可以将超出的资源分给别的app使用。

FairScheduler默认让所有的apps都运行,但是也可以通过配置文件小智每个用户以及每个queue运行的apps的数量。这是针对一个用户一次提交hundreds of apps产生大量中间结果数据或者大量的context-switching的情况。

一个例子

 

 示例1:大的任务job1提交并执行,占用了集群的全部资源,开始执行。之后小的job2执行时,获得系统一半的资源,开始执行。因此每个job可以公平地使用系统的资源。当job2执行完毕,并且集群中没有其他的job加入时,job1又可以获得全部的资源继续执行。

注意:job2提交之后并不能马上就获取到集群一半的资源,因为job2必须等待job1释放containers。

一个例子

示例2:两个用户A和B。A提交job1时集群内没有正在运行的app,因此job1独占集群中的资源。用户B的job2提交时,job2在job1释放一半的containers之后,开始执行。job2还没执行完的时候,用户B提交了job3,job2释放它占用的一半containers之后,job3获得资源开始执行。

配置:

(1)修改yarn-site.xml,开启fair调度器

       
                yarn.resourcemanager.scheduler.class
                org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
       

(2)添加fair-scheduler.xml

使用FairScheduler需要在fair-scheduler.xml中列出存在的队列和各自的 weights and capacities

prod和dev的权重也可以设置成2和3。

dev下的两个sub-queue没有指定权重,则为1:1。

在设置权重时,需要考虑default queue和用户命名的queue的权重,这些没有在xml文件中指定,但是它们的权重都是1.

队列还可以被配置minimum maximum Resources以及可以运行的最大的apps的数量

FairScheduler支持preemption(抢占),当queue占用的资源大于它应得的,那么调度器可以杀掉queue对应的containers,将yarn.scheduler.fair.preemption设置成true即可。

队列放置

可以再hadoop应用内部指定配置mapreduce.job.queuename来指定要使用的队列,例如mapreduce.job.eng。如果不指定,则按规则来匹配队列,例如:

 

FairScheduler和CapacityScheduler的异同

相同:

(1)以队列划分资源

(2)设定最低保证和最大使用上限

(3)在某个队列空闲时可以将资源共享给其他队列。

不同:

(1)Fair Scheduler队列内部支持多种调度策略,包括FIFO、Fair(队列中的N个作业,每个获得该队列1 / N的资源)、DRF(Dominant Resource Fairness)(多种资源类型e.g. CPU,内存 的公平资源分配策略)

(2)Fair Scheduler支持资源抢占。当队列中有新的应用提交时,系统调度器理应为它回收资源,但是考虑到共享的资源正在进行计算,所以调度器采用先等待再强制回收的策略,即等待一段时间后入股仍没有获得资源,那么从使用共享资源的队列中杀死一部分任务,通过yarn.scheduler.fair.preemption设置为true,开启抢占功能。

(3)Fair Scheduler中有一个基于任务数量的负载均衡机制,该机制尽可能将系统中的任务分配到各个节点

(4)Fair Scheduler可以为每个队列单独设置调度策略(FIFO Fair DRF)

(5)Fair Scheduler由于可以采用Fair算法,因此可以使得小应用快速获得资源,避免了饿死的情况。

Hierarchical queues with pluggable policies

FairScheduler支持层次队列(hierarchical queues),所有队列都从root队列开始,root队列的孩子队列公平地共享可用的资源。孩子队列再把可用资源公平地分配给他们的孩子队列。apps可能只会在叶子队列被调度。此外,用户可以为每个队列设置不同的共享资源的策略,内置的队列策略包括 FifoPolicy, FairSharePolicy (default), and DominantResourceFairnessPolicy。

用户可以通过继承org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy实现自己定义的策略。

(4)Delay Scheduling&Dominant Resource Fairness

CapacityScheduler和FairScheduler都支持Delay Scheduling和DRF

不同的apps对CPU和内存的需求量不一样,有的可能需要大量的CPU和一点点内存,有的可能正相反。这会使调度变得复杂。YARN解决的方法是Dominant Resource Fairness,即看app主要需要的资源是什么,用它作为该app对集群使用的度量。 

参考:

(1)《Hadoop The Definitive Guide 4th》

(2)官方文档

http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html

http://hadoop.apache.org/docs/r2.7.2/hadoop-yarn/hadoop-yarn-site/FairScheduler.html


浅浅77
6楼 · 2021-04-25 11:02

(1)FIFO Scheduler

将所有的Applications放到队列中,先按照作业的优先级高低、再按照到达时间的先后,为每个app分配资源。如果第一个app需要的资源被满足了,如果还剩下了资源并且满足第二个app需要的资源,那么就为第二个app分配资源,and so on。

优点:简单,不需要配置。

缺点:不适合共享集群。如果有大的app需要很多资源,那么其他app可能会一直等待。

一个例子

上图的示例:有一个很大的job1,它先提交,并且占据了全部的资源。那么job2提交时发现没有资源了,则job2必须等待job1执行结束,才能获得资源执行。

配置

FIFO Scheduler不需要配置

(2)Capacity Scheduler

CapacityScheduler用于一个集群(集群被多个组织共享)中运行多个Application的情况,目标是最大化吞吐量和集群利用率。

CapacityScheduler允许将整个集群的资源分成多个部分,每个组织使用其中的一部分,即每个组织有一个专门的队列,每个组织的队列还可以进一步划分成层次结构(Hierarchical Queues),从而允许组织内部的不同用户组的使用。
每个队列内部,按照FIFO的方式调度Applications。当某个队列的资源空闲时,可以将它的剩余资源共享给其他队列。

if there is more than one job in the queue and there are idle resources available, then the Capacity Scheduler may allocate the spare resources to jobs in the queue, even if that causes the queue’s capacity to be exceeded This behavior is known as queue elasticity.

配置

CapacityScheduler的配置文件etc/hadoop/capacity-scheduler.xml

 说明:root队列下面有两个队列,分别为prod(40%的容量,即使用40%的集群资源)和dev(60%的容量,最大的75%  ->  说明即使prod队列空闲了,那么dev最多只能使用75%的集群资源。这样就可以保证prod中添加新的apps时马上可以使用25%的资源)。

除了队列的容量和层次,还可以指定单个用户或者应用被分配的资源大小、同时可以运行的app数量、队列的ACLs。

可以指定app要放在哪个队列中。如果不指定,app将会被放在名字是 default的队列中。

CapacityScheduler的队列名字必须是层次结构最后的名字,比如eng。不能是root.dev.eng或者dev.eng。

一个例子

 

上图的示例:有一个专门的队列允许小的apps提交之后能够尽快执行,注意到job1先提交,先执行时并没有占用系统的全部资源(假如job1需要100G内存,但是整个集群只有100G内存,那么只分配给job1  80G),而是保留了一部分的系统资源。

队列放置

可以再hadoop应用内部指定配置mapreduce.job.queuename来指定要使用的队列,例如mapreduce.job.eng。如果不指定,则被放入default的队列。

(3)Fair Scheduler 

FairScheduler允许应用在一个集群中公平地共享资源。默认情况下FairScheduler的公平调度只基于内存,也可以配置成基于memory and CPU。当集群中只有一个app时,它独占集群资源。当有新的app提交时,空闲的资源被新的app使用,这样最终每个app就会得到大约相同的资源。可以为不同的app设置优先级,决定每个app占用的资源百分比。FairScheduler可以让短的作业在合理的时间内完成,而不必一直等待长作业的完成。

Fair Sharing: Scheduler将apps组织成queues,将资源在这些queues之间公平分配。默认情况下,所有的apps都加入到名字为“default“的队列中。app也可以指定要加入哪个队列中。队列内部的默认调度策略是基于内存的共享策略,也可以配置成FIFO和multi-resource with Dominant Resource Fairness

Minimum Sharing:FairScheduller提供公平共享,还允许指定minimum shares to queues,从而保证所有的用户以及Apps都能得到足够的资源。如果有的app用不了指定的minimum的资源,那么可以将超出的资源分给别的app使用。

FairScheduler默认让所有的apps都运行,但是也可以通过配置文件小智每个用户以及每个queue运行的apps的数量。这是针对一个用户一次提交hundreds of apps产生大量中间结果数据或者大量的context-switching的情况。

一个例子

 

 示例1:大的任务job1提交并执行,占用了集群的全部资源,开始执行。之后小的job2执行时,获得系统一半的资源,开始执行。因此每个job可以公平地使用系统的资源。当job2执行完毕,并且集群中没有其他的job加入时,job1又可以获得全部的资源继续执行。

注意:job2提交之后并不能马上就获取到集群一半的资源,因为job2必须等待job1释放containers。

一个例子

示例2:两个用户A和B。A提交job1时集群内没有正在运行的app,因此job1独占集群中的资源。用户B的job2提交时,job2在job1释放一半的containers之后,开始执行。job2还没执行完的时候,用户B提交了job3,job2释放它占用的一半containers之后,job3获得资源开始执行。

配置:

(1)修改yarn-site.xml,开启fair调度器

       
                yarn.resourcemanager.scheduler.class
                org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
       

(2)添加fair-scheduler.xml

使用FairScheduler需要在fair-scheduler.xml中列出存在的队列和各自的 weights and capacities

prod和dev的权重也可以设置成2和3。

dev下的两个sub-queue没有指定权重,则为1:1。

在设置权重时,需要考虑default queue和用户命名的queue的权重,这些没有在xml文件中指定,但是它们的权重都是1.

队列还可以被配置minimum maximum Resources以及可以运行的最大的apps的数量

FairScheduler支持preemption(抢占),当queue占用的资源大于它应得的,那么调度器可以杀掉queue对应的containers,将yarn.scheduler.fair.preemption设置成true即可。

队列放置

可以再hadoop应用内部指定配置mapreduce.job.queuename来指定要使用的队列,例如mapreduce.job.eng。如果不指定,则按规则来匹配队列,例如:

 

FairScheduler和CapacityScheduler的异同

相同:

(1)以队列划分资源

(2)设定最低保证和最大使用上限

(3)在某个队列空闲时可以将资源共享给其他队列。

不同:

(1)Fair Scheduler队列内部支持多种调度策略,包括FIFO、Fair(队列中的N个作业,每个获得该队列1 / N的资源)、DRF(Dominant Resource Fairness)(多种资源类型e.g. CPU,内存 的公平资源分配策略)

(2)Fair Scheduler支持资源抢占。当队列中有新的应用提交时,系统调度器理应为它回收资源,但是考虑到共享的资源正在进行计算,所以调度器采用先等待再强制回收的策略,即等待一段时间后入股仍没有获得资源,那么从使用共享资源的队列中杀死一部分任务,通过yarn.scheduler.fair.preemption设置为true,开启抢占功能。

(3)Fair Scheduler中有一个基于任务数量的负载均衡机制,该机制尽可能将系统中的任务分配到各个节点

(4)Fair Scheduler可以为每个队列单独设置调度策略(FIFO Fair DRF)

(5)Fair Scheduler由于可以采用Fair算法,因此可以使得小应用快速获得资源,避免了饿死的情况。

Hierarchical queues with pluggable policies

FairScheduler支持层次队列(hierarchical queues),所有队列都从root队列开始,root队列的孩子队列公平地共享可用的资源。孩子队列再把可用资源公平地分配给他们的孩子队列。apps可能只会在叶子队列被调度。此外,用户可以为每个队列设置不同的共享资源的策略,内置的队列策略包括 FifoPolicy, FairSharePolicy (default), and DominantResourceFairnessPolicy。

用户可以通过继承org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy实现自己定义的策略。

(4)Delay Scheduling&Dominant Resource Fairness

CapacityScheduler和FairScheduler都支持Delay Scheduling和DRF

不同的apps对CPU和内存的需求量不一样,有的可能需要大量的CPU和一点点内存,有的可能正相反。这会使调度变得复杂。YARN解决的方法是Dominant Resource Fairness,即看app主要需要的资源是什么,用它作为该app对集群使用的度量。 

三岁奶猫
7楼 · 2021-04-25 13:23

目前的hadoop调度器主要有三种:1.默认的FIFO2.fair scheduling3.capacity scheduling

风火轮
8楼 · 2021-04-25 15:10

Hadoop调度器重要分为三类:

FIFO 、Capacity Scheduler(容量调度器)和Fair Sceduler(公平调度器)。


(1)FIFO Scheduler

将所有的Applications放到队列中,先按照作业的优先级高低、再按照到达时间的先后,为每个app分配资源。如果第一个app需要的资源被满足了,如果还剩下了资源并且满足第二个app需要的资源,那么就为第二个app分配资源,and so on。

(2)Capacity Scheduler

CapacityScheduler用于一个集群(集群被多个组织共享)中运行多个Application的情况,目标是最大化吞吐量和集群利用率。

CapacityScheduler允许将整个集群的资源分成多个部分,每个组织使用其中的一部分,即每个组织有一个专门的队列,每个组织的队列还可以进一步划分成层次结构(Hierarchical Queues),从而允许组织内部的不同用户组的使用。
每个队列内部,按照FIFO的方式调度Applications。当某个队列的资源空闲时,可以将它的剩余资源共享给其他队列。


相关问题推荐

  • 什么是大数据时代?2021-01-13 21:23
    回答 100

    大数据(big data)一词越来越多地被提及,人们用它来描述和定义信息爆炸时代产生的海量数据,而这个海量数据的时代则被称为大数据时代。随着云时代的来临,大数据(Big data)也吸引了越来越多的关注。大数据(Big data)通常用来形容一个公司创造的大量非结...

  • 回答 84

    Java和大数据的关系:Java是计算机的一门编程语言;可以用来做很多工作,大数据开发属于其中一种;大数据属于互联网方向,就像现在建立在大数据基础上的AI方向一样,他两不是一个同类,但是属于包含和被包含的关系;Java可以用来做大数据工作,大数据开发或者...

  • 回答 52
    已采纳

    学完大数据可以从事很多工作,比如说:hadoop 研发工程师、大数据研发工程师、大数据分析工程师、数据库工程师、hadoop运维工程师、大数据运维工程师、java大数据工程师、spark工程师等等都是我们可以从事的工作岗位!不同的岗位,所具备的技术知识也是不一样...

  • 回答 29

    简言之,大数据是指大数据集,这些数据集经过计算分析可以用于揭示某个方面相关的模式和趋势。大数据技术的战略意义不在于掌握庞大的数据信息,而在于对这些含有意义的数据进行专业化处理。大数据的特点:数据量大、数据种类多、 要求实时性强、数据所蕴藏的...

  • 回答 14

    tail -f的时候,发现一个奇怪的现象,首先 我在一个窗口中 tail -f test.txt 然后在另一个窗口中用vim编辑这个文件,增加了几行字符,并保存,这个时候发现第一个窗口中并没有变化,没有将最新的内容显示出来。tail -F,重复上面的实验过程, 发现这次有变化了...

  • 回答 18

    您好针对您的问题,做出以下回答,希望有所帮助!1、大数据行业还是有非常大的人才需求的,对于就业也有不同的岗位可选,比如大数据工程师,大数据运维,大数据架构师,大数据分析师等等,就业难就难在能否找到适合的工作,能否与你的能力和就业预期匹配。2、...

  • 回答 17

    最小的基本单位是Byte应该没多少人不知道吧,下面先按顺序给出所有单位:Byte、KB、MB、GB、TB、PB、EB、ZB、YB、DB、NB,按照进率1024(2的十次方)计算:1Byte = 8 Bit1 KB = 1,024 Bytes 1 MB = 1,024 KB = 1,048,576 Bytes 1 GB = 1,024 MB = 1,048,576...

  • 回答 33

    大数据的定义。大数据,又称巨量资料,指的是所涉及的数据资料量规模巨大到无法通过人脑甚至主流软件工具,在合理时间内达到撷取、管理、处理、并整理成为帮助企业经营决策更积极目的的资讯。大数据是对大量、动态、能持续的数据,通过运用新系统、新工具、新...

  • 回答 5

    MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL的版本:针对不同的用户,MySQL分为两种不同的版本:MySQL Community Server社区版本,免费,但是Mysql不提供...

  • mysql安装步骤mysql 2022-05-07 18:01
    回答 2

    mysql安装需要先使用yum安装mysql数据库的软件包 ;然后启动数据库服务并运行mysql_secure_installation去除安全隐患,最后登录数据库,便可完成安装

  • 回答 5

    1.查看所有数据库showdatabases;2.查看当前使用的数据库selectdatabase();3.查看数据库使用端口showvariableslike'port';4.查看数据库编码showvariableslike‘%char%’;character_set_client 为客户端编码方式; character_set_connection 为建立连接...

  • 回答 5

    CREATE TABLE IF NOT EXISTS `runoob_tbl`(    `runoob_id` INT UNSIGNED AUTO_INCREMENT,    `runoob_title` VARCHAR(100) NOT NULL,    `runoob_author` VARCHAR(40) NOT NULL,    `submission_date` DATE,    PRI...

  • 回答 9

    学习多久,我觉得看你基础情况。1、如果原来什么语言也没有学过,也没有基础,那我觉得最基础的要先选择一种语言来学习,是VB,C..,pascal,看个人的喜好,一般情况下,选择C语言来学习。2、如果是有过语言的学习,我看应该一个星期差不多,因为语言的理念互通...

  • 回答 7

    添加语句 INSERT插入语句:INSERT INTO 表名 VALUES (‘xx’,‘xx’)不指定插入的列INSERT INTO table_name VALUES (值1, 值2,…)指定插入的列INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)查询插入语句: INSERT INTO 插入表 SELECT * FROM 查...

  • 回答 5

    看你什么岗位吧。如果是后端,只会CRUD。应该是可以找到实习的,不过公司应该不会太好。如果是数据库开发岗位,那这应该是不会找到的。

  • 回答 7

    查找数据列 SELECT column1, column2, … FROM table_name; SELECT column_name(s) FROM table_name 

没有解决我的问题,去提问