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

相关文章

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

深入解析 Java Future 类及代码示例

《深入解析JavaFuture类及代码示例》JavaFuture是java.util.concurrent包中用于表示异步计算结果的核心接口,下面给大家介绍JavaFuture类及实例代码,感兴... 目录一、Future 类概述二、核心工作机制代码示例执行流程2. 状态机模型3. 核心方法解析行为总结:三

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

深入理解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实际中的问题案例