深入Hadoop的调度器

Hadoop有两个大版本

0.20.x,1.x通常为hadoop
1版本,运行环境依赖JobTracker和TaskTracker,运行资源通过作业表示模型MapTask和ReduceTask来组成;运行资源通过槽位Slot来表示。

0.23.x,2.x称之为hadoop 2版本,在开发模型上类似1,都有新旧两套MapReduce
API来完成;针对JobTracker的职责有YARN来管理;包括

a:资源管理 ResourceManager ,以及NodeManager

b:作业调度 ApplicationManager,跟RM协商获取应用所需资源,与NM合作完成执行和监控TASK的任务。

针对资源的管理在这里不做过多分析,重点分析作业调度,这个是Hadoop的核心中枢。

Hadoop1代中的调度器

TaskScheduler,JobTracker,TaskTracker

这里需要关注:JobTracker和TaskTracker直接的交换机制通过heartbeat

heartbeat

TaskTracker周期性(默认为3s)调用RPC向JobTracker汇报信息,形成heartbeat

汇报信息包括TaskTracker状态信息、Task运状况等.

同事关注资源的划分单位:Slot
分为map slot和reduce
slot两种
由参数mapred.tasktracker.[map|reduce].tasks.maximum设置

调度器的作业流程:

1:首先client通过submitJob提交作业未JobTracker

2:JobTracker通知TaskScheduler,有新的Job提交作业了

3:TaskScheduler开始初始化作业

4:JobTracker跟TaskTracker通过heartbeat获取具体的TaskTracker的资源情况,获取TaskTrackerStatus.

当然如果一个TaskTracker空闲时,也主动申请JobTracker分配任务;

5:JobTracker根据自己对资源的管理情况,请求TaskScheduler分配作业,TaskScheduler根据对应的资源情况和任务数,分配作业列表

6:JobTracker收到分配的作业列表,再通过HeartBeat将任务下发给具体的TaskTracker.

7:TaskTracker执行作业。

Hadoop的作业包括三个层次:

a:JobInProgress

b:TaskInProgress

c:TaskAttempt

Hadoop的调度包括三级调度

空闲的slot依次选择一个队列、作业和任务。

Queue:用户被划分到某个队列,每个队列分配一定的资源

Job:具体的一个Map/Reduce Job,关注提交时间和优先级

Task:通常具体的一个MapTask,ReduceTask,只在本地执行。

Hadoop已有的调度器

FIFO 批处理调度器 按到达时间排序,先来先服务
Capacity Scheduler 多用户调度器
根据用户分配不同的队列,在每个队列里面根据FIFO来处理
Fair Scheduler 多用户调度器
按照缺额排序,缺额大者优先,保证各个队列直接的负载均衡。

基于最小资源量(min share)与公平共享量(fair share)进行调度,作业优先级越高,分配到的资源越多

自己定制调度器

步骤1 编写JobInProgressListener
步骤2 编写调度器类,继承抽象类TaskScheduler
步骤3
配置并启用Hadoop调度器

abstract class JobInProgressListener {
   public abstract void
jobAdded(JobInProgress job) throws
IOException;  //添加Job
   public abstract void
jobRemoved(JobInProgress job); //删除Job
   public abstract void
jobUpdated(JobChangeEvent event); //响应JobUpdate
}

实现JobInProgressListener

class CustomerJobListener extends JobInProgressListener {
private
List<JobInProgress> jobQueue = new ArrayList<JobInProgress>();

public void jobAdded(JobInProgress job) {
   synchronized
(jobQueue) {
    
jobQueue.add(job);
    
tt.initJob(job);
     sortJobs();
  
}
}

public void jobRemoved(JobInProgress job) {
  synchronized (jobQueue)
{
    jobQueue.remove(job);
  }
}

}

实现调度器

TaskScheduler的抽象方法

public abstract List<Task> assignTasks(TaskTrackerStatus taskTracker)
throws IOException;

实现TaskScheduler

public class CustomerScheduler extends TaskScheduler {
private
CustomerJobListener customerJobListener;

public void start() {
    this.customerJobListener =
new
CustomerJobListener();
    this.customerJobListener.setTaskTrackerManager(taskTrackerManager
);
    taskTrackerManager.addJobInProgressListener(customerJobListener);
}

public synchronized List<Task> assignTasks(TaskTrackerStatus tracker)
throws IOException
{
    if(customerJobListener.getJobs().size() >
0)
        JobInProgress job =
customerJobListener.getJobs().get(0);
    return
job.obtainNewMapTask(…);
}

}

配置TaskScheduler

(1)在mapred-site.xml中配置
<property>
<name>mapred.jobtracker.taskScheduler</name>
<value>org.apache.hadoop.mapred.CustomerScheduler</value>
</property>
(2)重新启动mapreduce或者jobtracker
bin/start-mapred.sh
bin/hadoop-daemon.sh
start jobtracker

深入Hadoop的调度器,布布扣,bubuko.com

时间: 2025-01-14 12:19:53

深入Hadoop的调度器的相关文章

Hadoop的调度器总结

Hadoop的调度器总结 随着MapReduce的流行,其开源实现Hadoop也变得越来越受推崇.在Hadoop系统中,有一个组件非常重要,那就是调度器,它的作用是将系统中空闲的资源按一定策略分配给作业.在Hadoop中,调度器是一个可插拔的模块,用户可以根据自己的实际应用要求设计调度器.Hadoop中常见的调度器有三种,分别为: (1)默认的调度器FIFO Hadoop中默认的调度器,它先按照作业的优先级高低,再按照到达时间的先后选择被执行的作业. (2) 计算能力调度器Capacity Sc

Hadoop 三大调度器分析

如要转载,请注上作者和出处. 须知: 我们下载的是hadoop-2.7.3-src 源码. 这个版本默认调度器是Capacity调度器. 在2.0.2-alpha版本的时候,有人汇报了一个fifo调度器的bug,社区把默认调度器从原来的fifo切换成capacity了. 在Hadoop中,调度器是一个可插拔的模块,用户可以根据自己的实际应用要求设计调度器,然后在配置文件中指定相应的调度器,这样,当Hadoop集群启动时,便会加载该调度器.当前Hadoop自带了几种调度器,分别是FIFO(默认调度

Hadoop Yarn调度器的选择和使用

一.引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色.在讨论其构造器之前先简单了解一下Yarn的架构.上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负责整个集群中包括内存.CPU等资源的管理:ApplicationMaster负责应用程序在整个生命周期的任务调度:NodeManager负责本节点上资源的供给和隔离:Container可以抽象的看成是运行任务的一个容器.本文讨论的调度器是在ResourceManager组建中进行调度的,接

Hadoop YARN 调度器(scheduler) —— 资源调度策略

本文通过MetaWeblog自动发布,原文及更新链接:https://extendswind.top/posts/technical/hadoop_yarn_resource_scheduler 搜了一些博客,发现写得最清楚的还是<Hadoop权威指南>,以下内容主要来自<Hadoop The Definitive Guide> 4th Edition 2015.3. Hadoop YARN Scheduler 三个调度器 YARN提供了CapacityScheduler, Fai

MapReduce调度器

1. 先进先出(FIFO)调度器 先进先出调度器是Hadoop的默认调度器.就像这个名字所隐含的那样,这种调度器就是用简单按照“先到先得”的算法来调度任务的.例如,作业A和作业B被先后提交.那么在执行作业B的任务前,作业A中的所有map任务都应该已经执行完成. 配置:调度器类型的配置是在mapred-site.xml文件中,将mapred.jobtracker.taskscheduler参数设置为我们想要使用的调度器的类名,FIFO调度器的类名是org.apache.hadoop.mapred.

工作流调度器azkaban概述

一.概述 1. 为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成: shell脚本程序,java程序,mapreduce程序.hive脚本等; 各任务单元之间存在时间先后及前后依赖关系; 为了很好地组织起这样的复杂执行计划,需要一个工作流调度系统来调度执行: 例如: 我们可能有这样一个需求,某个业务系统每天产生20G原始数据,我们每天都要对其进行处理,处理步骤如下所示: 1.通过Hadoop先将原始数据同步到HDFS上: 2.借助MapReduce计算框架对原始数据进行

hadoop调度器的原理和应用场景解析

前置篇: 为从根本上解决旧 MapReduce 框架的性能瓶颈,促进 Hadoop 框架的更长远发展,从 0.23.0 版本开始,Hadoop 的 计算框架完全重构,发生了根本的变化.新的 Hadoop MapReduce 框架命名为 Yarn,重构根本的思想是将 JobTracker 两个主要的功能分离成单独的组件,这两个功能是计算资源管理和任务调度 / 监控.ResourceManager全局管理所有应用程序计算资源的分配,每一个应用的 ApplicationMaster 负责相应的调度和协

Hadoop 调度器

调度算法?当MapReduce有很多的作用执行的时候,那么他是按照什么样的顺序让作业去执行呢? 那么在设定顺序的时候需要关注那些问题呢? 1.作业的吞吐量 2.优先级别 默认的调度算法:FifoScheduler,只有一个队列. CapacityScheduler和FairSecheduler:多队列 公平调度器 容量调度器,多队列的

Yarn 调度器Scheduler详解

理想情况下,我们应用对Yarn资源的请求应该立刻得到满足,但现实情况资源往往是有限的,特别是在一个很繁忙的集群,一个应用资源的请求经常需要等待一段时间才能的到相应的资源.在Yarn中,负责给应用分配资源的就是Scheduler.其实调度本身就是一个难题,很难找到一个完美的策略可以解决所有的应用场景.为此,Yarn提供了多种调度器和可配置的策略供我们选择. 一.调度器的选择 在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,FairS ched