`
lbxhappy
  • 浏览: 307299 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hadoop Job Scheduler作业调度器

 
阅读更多
Hadoop Job Scheduler
Hadoop的作业调度器,可以以插件的方式加载,常见的作业调度器有三种:
默认调度算法FIFO
计算能力调度算法Capacity Scheduler(Yahoo!开发)
公平份额调度算法Fair Scheduler(Facebook开发)

默认调度算法FIFO
简介:
最早的Hadoop Map/Reduce计算架构中,JobTracker在进行作业调度时使用的是FIFO(First In First Out)算法。所有用户的作业都被提交到一个队列中,然后由JobTracker先按照作业的优先级高低,再按照作业提交时间的先后顺序选择将被执行的作 业。
优点:
调度算法简单明了,JobTracker工作负担轻。
缺点:
忽略了不同作业的需求差异。例如如果类似对海量数据进行统计分析的作业长期占据计算资源,那么在其后提交的交互型作业有可能迟迟得不到处理,从而影响到用户的体验。
新的调度算法:
当前,新的调度器已经作为插件的形式集成在Hadoop当中。

计算能力调度算法Capacity Scheduler
基础知识:
Capacity Scheduler的每个队列中采用的调度策略是FIFO算法。
Capacity Scheduler默认情况下不支持优先级,但是可以在配置文件中开启此选项,如果支持优先级,调度算法就是带有优先级的FIFO。
Capacity Scheduler不支持优先级抢占,一旦一个作业开始执行,在执行完之前它的资源不会被高优先级作业所抢占。
Capacity Scheduler对队列中同一用户提交的作业能够获得的资源百分比进行了限制以使同属于一用户的作业不能出现独占资源的情况。

配置:
#将capacity scheduler的jar包copy到lib目录下
cp $HADOOP_HOME/contrib/capacity-scheduler/hadoop-*-capacity-scheduler.jar $HADOOP_HOME/lib/

#配置mapred-site.xml
#添加mapred.jobtracker.taskScheduler设置为org.apache.hadoop.mapred.CapacityTaskScheduler
#这里分了两个组,在mapred.queue.names里面定义,同时组的具体配额在capacity-scheduler.xml里面定义
vi mapred-site.xml

<property>
<name>mapred.jobtracker.taskScheduler</name>
<value>org.apache.hadoop.mapred.CapacityTaskScheduler</value>
</property>
<property>
<name>mapred.queue.names</name>
<value>default,putindb</value>
</property>

#设置具体的queue的配额信息,前面两组分别配置default和putindb组,后面是整理的配置
vi capacity-scheduler.xml
<?xml version="1.0"?>
<configuration>
<property>
<name>mapred.capacity-scheduler.queue.default.capacity</name>
<value>5</value>
</property>
<property>
<name>mapred.capacity-scheduler.queue.default.supports-priority</name>
<value>true</value>
</property>
<property>
<name>mapred.capacity-scheduler.queue.default.minimum-user-limit-percent</name>
<value>100</value>
</property>
<property>
<name>mapred.capacity-scheduler.queue.default.maximum-initialized-jobs-per-user</name>
<value>2</value>
</property>

<property>
<name>mapred.capacity-scheduler.queue.putindb.capacity</name>
<value>95</value>
</property>
<property>
<name>mapred.capacity-scheduler.queue.putindb.supports-priority</name>
<value>true</value>
</property>
<property>
<name>mapred.capacity-scheduler.queue.putindb.minimum-user-limit-percent</name>
<value>100</value>
</property>
<property>
<name>mapred.capacity-scheduler.queue.putindb.maximum-initialized-jobs-per-user</name>
<value>2</value>
</property>

<property>
<name>mapred.capacity-scheduler.default-supports-priority</name>
<value>true</value>
</property>
<property>
<name>mapred.capacity-scheduler.default-minimum-user-limit-percent</name>
<value>100</value>
</property>
<property>
<name>mapred.capacity-scheduler.default-maximum-initialized-jobs-per-user</name>
<value>2</value>
</property>

<property>
<name>mapred.capacity-scheduler.init-poll-interval</name>
<value>5000</value>
</property>
<property>
<name>mapred.capacity-scheduler.init-worker-threads</name>
<value>5</value>
</property>

</configuration>

配置完成后,重启jobtracker即可。
stop-mapred.sh
start-mapred.sh
注意在提交Job时,记得设置job.set(),指定组或者Pool;

如何选择合适的作业去执行
为队列定义了一个指标—队列中正在运行的任务数与其应该分得的计算资源(配置文件中为此队列分配了相应数量的资源,而实际中该队列可能没有分配到)之间的比值。当系统中出现空闲的task tracker,算法会首先选择一个该比值最低的队列。
队列被选中后,将按照作业优先级(如果支持的话)和提交时间顺序选择执行的作业。
在选择作业的时候,还需要考虑作业所属的用户是否已经超出了他所能使用的资源限制。
此外,还会考虑task tracker内存资源是否满足作业的要求。

内存资源的有效管理
Capacity Scheduler能有效地对hadoop集群的内存资源进行管理,以支持内存密集型应用。
作业对内存资源需求高时,调度算法将把该作业的相关任务分配到内存资源充足的task tracker上。
在作业选择过程中,Capacity Scheduler会检查空闲task tracker上的内存资源是否满足作业要求。task tracker上的空闲资源(内存)数量值可以通过task tracker的内存资源总量减去当前已经使用的内存数量得到,而后者包含在task tracker向job tracker发送的周期性心跳信息中。
目前,基于内存的调度只能在linux平台下起作用,关于内存调度的相关参数可以通过配置文件来设置。

公平份额调度算法Fair Scheduler
设计思想
尽可能保证所有的作业都能够获得等量的资源份额。系统中只有一个作业执行时,它将独占集群所有资源。有其他作业被提交时就会有TaskTracker被释放并分配给新提交的作业,以保证所有的作业都能够获得大体相同的计算资源。
作业池
用户提交的作业将会放进一个能够公平共享资源的pool(池)中。
每个作业池设定了一个最低资源保障(a guaranteed minimum share),当一个池中包含job时,它至少可以获得minimum share的资源——最低保障资源份额机制。
池中的作业获得一定份额的资源。
可以通过配置文件限制每个池中的作业数量。
缺省情况下,每个作业池中选择将要执行的作业的策略是FIFO策略,先按照优先级高低排序,然后再按照提交时间排序。
作业和作业池的权值weight
缺省情况下,Fair Scheduler会为每一个用户建立一个单独的pool。所有用户能够获得等量的资源份额而无论他提交了多少作业,而每个pool中,各个作业将平分分配给所在池的资源。
实际应用中,无论是作业池还是作业,都被赋予一定的权值,并以此为依据获得相应比例的资源。这种情况下,作业池和作业在资源分配时不是严格的平均分配,但这有利于根据作业的重要程度及实际需求合理分配资源。
如何选择合适的作业执行
默认是FIFO策略,此外还有一种基于赤字的策略。
Fair Scheduler为每个作业定义了一个deficit(赤字)指标。
Deficit是一个作业在理想情况下的获得的计算资源和实际中获得的计算资源之间的差距。
Fair Scheduler会每隔几百毫秒观察每个作业中有多少任务已经在这个时间间隔内执行,并将结果与它应得的资源份额比较,以更新该作业的deficit值。一旦有空闲的task tracker出现,首先分配给当前具有最高deficit值的作业。
例外——如果系统中存在着尚未获得最低资源保障的作业池,那么该池中的作业将会优先调度,而选择池中的作业需要根据它们的deficit来决定。这样做是为了尽可能满足作业池最低保障资源份额的机制。
如何确定每个作业的资源份额
缺省情况是平分资源,此外提供一种基于权值的资源分配方法。
作业资源份额的计算是根据作业的权值将集群的资源总量划分给各个可以运行的作业。
默认情况下,权值基于作业优先级,每个优先级对应的权值是低一个优先级的2倍(优先级共有VERY_HIGH, HIGH, NORMAL, LOW, VERY_LOW五个等级,则VERY_HIGH具有4倍NORMAL的权值)。
作业和作业池的权值可以在池配置文件中进行设定,例如可以基于作业的大小和提交时间来设定。
作业池的最低资源保障也是按照权值比例分配给其中的作业。

配置:
#将fair scheduler的jar包copy到lib目录下
cp $HADOOP_HOME/contrib/fairscheduler/hadoop-*-fairscheduler.jar $HADOOP_HOME/lib/

#配置mapred-site.xml
vi mapred-site.xml

<property>
<name>mapred.jobtracker.taskScheduler</name>
<value>org.apache.hadoop.mapred.FairScheduler</value>
</property>

<property>
<name>mapred.fairscheduler.allocation.file</name>
<value>$HADOOP_CONF/pools.xml</value>
</property>

<property>
<name>mapred.fairscheduler.preemption</name>
<value>true</value>
</property>

<property>
<name>mapred.fairscheduler.assignmultiple</name>
<value>true</value>
</property>

<property>
<name>mapred.fairscheduler.poolnameproperty</name>
<value>mapred.queue.name</value>
<description>job.set("mapred.queue.name",pool); // pool is set to either 'high' or 'low' </description>
</property>

<property>
<name>mapred.fairscheduler.preemption.only.log</name>
<value>true</value>
</property>

<property>
<name>mapred.fairscheduler.preemption.interval</name>
<value>15000</value>
</property>

<property>
<name>mapred.queue.names</name>
<value>default,putindb</value>
</property>

vi pools.xml
<?xml version="1.0"?>
<allocations>
<pool name="putindb">
<minMaps>90</minMaps>
<minReduces>20</minReduces>
<maxRunningJobs>20</maxRunningJobs>
<weight>2.0</weight>
<minSharePreemptionTimeout>30</minSharePreemptionTimeout>
</pool>

<pool name="default">
<minMaps>9</minMaps>
<minReduces>2</minReduces>
<maxRunningJobs>20</maxRunningJobs>
<weight>1.0</weight>
<minSharePreemptionTimeout>30</minSharePreemptionTimeout>
</pool>
</allocations>

不管是Capacity Scheduler还是Fair Scheduler,我都没有配置任务抢占成功。具体表现在:
当一个优先级更高的任务提交时,jobtracker会将新回收的map/reduce单元用于新的这个优先级更高的任务,但是对于一直running而 没有完成的计算资源,jobtracker无法将这些资源回收。也就是说,当一个hadoop集群里面的reduce资源有限时(在我们的应用中,map 单元都很快就跑完了,但是存在一些长时间的reduce),而一些长时间运行的低优先级的任务占用完了所有的reduce单元后,新提交的优先级更高的 Job的reduce全被pending,而无法抢占资源运行,导致无法完成。
在网上查到Fair Scheduler将在hadoop 0.21里实现任务抢占preemption,网上有一些补丁,但是打上patch4665: Add preemption to the fair scheduler后依旧无法抢占。
分享到:
评论

相关推荐

    hadoop调度指南

    页面应显示“Job Scheduler Administration”,表明调度器正正常运行。 #### 调度器参数 公平调度器提供了丰富的配置选项,包括基础参数和高级参数。基础参数主要涉及资源池的创建和管理,如默认资源池的设置和...

    MapReduce:Fair Scheduler前传

    在多用户共享的MapReduce集群环境中,合理地调度作业至关重要。作业调度器负责在集群的多用户环境下,按照一定的策略分配计算资源,如CPU、内存和存储等。由于MapReduce作业的运行特点,传统的调度算法可能在该环境...

    Hadoop多Job并行处理的实例详解

    在`mapred-site.xml`中,设置任务调度器为公平调度器(Fair Scheduler),这允许多个Job公平地共享集群资源: ```xml &lt;name&gt;mapred.jobtracker.taskScheduler &lt;value&gt;org.apache.hadoop.mapred.FairScheduler ```...

    hadoop大数据就业面试题

    3. Fair Scheduler:公平调度器,所有的 Job 具有相同的资源。 五、MapReduce 的开发语言 MapReduce 可以使用多种语言开发,包括: 1. Java:最常用的开发语言。 2. Hive:基于 SQL 的查询语言。 3. Python:使用...

    saturn Network Job Scheduler-开源

    在实际应用中,土星网络作业调度器常常与其他开源工具结合使用,例如与Hadoop、Spark等大数据处理框架集成,实现更复杂的数据处理工作流。通过RESTful API或Web界面,用户可以远程监控作业状态,查看执行历史记录,...

    公平调度算法分析.pdf

    在Hadoop的演化过程中,公平调度器(Fair Scheduler)经历了一些显著的改进,特别是在Hadoop-0.21.0版本中。这个调度器的设计目标是确保资源分配的公平性,避免单个作业或用户过度占用集群资源,从而提高整个系统的...

    最新Hadoop学习笔记

    YARN(Yet Another Resource Negotiator)是Hadoop的资源管理系统,负责作业调度和容器管理。配置主要在`yarn-site.xml`文件中,关键配置包括: 1. `yarn.nodemanager.resource.memory-mb`:每个节点的内存资源总量...

    hadoop的默认配置文件

    4. **mapred-default.xml**:这个文件涉及到MapReduce的默认配置,包括作业调度、任务执行、内存分配等。`mapreduce.map.memory.mb`和`mapreduce.reduce.memory.mb`分别设置了Map和Reduce任务的内存大小,`mapreduce...

    公平调度算法分析.docx

    在Hadoop的演化过程中,公平调度器(Fair Scheduler)经历了一些重要的改进,特别是在Hadoop-0.21.0版本中。这个版本的调度器引入了层次调度算法,支持资源抢占,并增加了延迟调度机制,使得整体调度策略更为优化。...

    配置Capacity Scheduler

    Capacity Scheduler是Apache Hadoop生态系统中的一个关键组件,它是一个多租户资源调度器,主要用于管理Hadoop MapReduce作业的执行。这个调度器的主要目标是公平地分配集群资源,确保各个应用程序能高效、公平地...

    (整理)公平调度算法分析.docx

    层次调度算法的主要思想与Capacity Scheduler类似,首先选择一个pool,然后从该pool中选择一个job,最后从该job中选择一个locality的task。选择pool和job的策略相同,均采用了FairShareComparator比较器对pool或者...

    Hadoop-2.7.1分布式安装手册

    `mapreduce.jobhistory.address`和`mapreduce.jobhistory.webapp.address`定义JobHistoryServer的地址和Web UI端口。 8. 初始化和启动:格式化NameNode,启动所有服务,并监控其状态。使用`hadoop dfsadmin -report...

    Hadoop 2.0部署配置文件示例.zip

    7. **fair-scheduler.xml**(可选):如果使用公平调度器,此文件将定义作业队列和资源分配策略。 三、部署与配置流程 1. 安装Java环境:Hadoop依赖Java,需要先安装JDK,并设置好JAVA_HOME环境变量。 2. 下载...

    Hadoop 权限管理.pdf

    本文将详细介绍Hadoop中的权限管理机制,包括服务级别授权(Service Level Authorization)、作业队列访问控制(Access Control on Job Queues)以及文件系统权限控制(DFS Permission)。 #### 二、服务级别授权...

    hadoop完全分布式搭建.pdf

    `&lt;name&gt;yarn.resourcemanager.scheduler.address&lt;/name&gt;`、`&lt;name&gt;yarn.resourcemanager.resource-tracker.address`、`&lt;name&gt;yarn.resourcemanager.address`、`&lt;name&gt;yarn.resourcemanager.admin.address` 分别定义...

Global site tag (gtag.js) - Google Analytics