hadooper-深入hadoop的调度器

2024-04-14 19:48
文章标签 深入 hadoop 调度 hadooper

本文主要是介绍hadooper-深入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

这篇关于hadooper-深入hadoop的调度器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903856

相关文章

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规