JobTracker任务调度器之JobQueueTaskScheduler

2023-12-02 00:32

本文主要是介绍JobTracker任务调度器之JobQueueTaskScheduler,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JobTracker任务调度器之JobQueueTaskScheduler

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-01/50857.htm

 

 

在客户端把作业提交给JobTracker之后,JobTracker就需要开始考虑把这个Job交给那些TaskTracker来执行——Job任务调度。当然在JobTracker调度该Job之前,必须要确保该Job的JobInProgress被初始化了,即将Job划分为若干个map任务和reduce任务。在JobTracker中有一个默认的任务调度器JobQueueTaskScheduler,先来看看它的类图:

 

 

        在上面的类图中,我们可以看出JobQueueTaskScheduler类依赖于两个JobInProgressListener的实现类,其中JobQueueJobInProgressListener类被用来按照队列来管理Job,EagerTaskInitializationListener类被用来初始化Job,即对Job进行map任务和reduce任务的切分(关于这个我将会在以后详细讨论)。关于这两个JobInProgressListener类的具体实现,我在这里不再作详细的阐述,因为他们的实现都比较的简单,有兴趣的童鞋可以自己查看它的源代码。所以,当JobTracker给某个TaskTracker分配任务时,它就会调用TaskScheduler的assignTasks(TaskTrackerStatus)方法,让TaskScheduler给该TaskTracker分配任务。那么,究竟TaskScheduler是如何给TaskTracker任务分配任务的,这就得看TaskScheduler的具体实现了,Hadoop允许用户自定义TaskScheduler来根据自己的实际情况来调度Job任务,这个具体实现可以通过配置文件中的mapred.jobtracker.taskScheduler项来设置。

        下面以JobQueueTaskScheduler为例,来详细的讨论如何给一个TaskTracker分配任务。

 


1.分配map任务

 

 


2.分配reduce任务

 


2.计算一个TaskTracker是否需要预留任务slots

       在任务调度器JobQueueTaskScheduler中,同时集群中的TaskTracker又比较多的情况下,它总是会想办法预留一些比较空闲的TaskTracker,以便能够快速的处理优先级比较高的Task或者发生错误的Task。它的具体实现如下:

private boolean exceededPadding(boolean isMapTask, ClusterStatus clusterStatus, int maxTaskTrackerSlots) {
     
    int numTaskTrackers = clusterStatus.getTaskTrackers();
    int totalTasks = (isMapTask) ? clusterStatus.getMapTasks() : clusterStatus.getReduceTasks();
    int totalTaskCapacity = isMapTask ? clusterStatus.getMaxMapTasks() : clusterStatus.getMaxReduceTasks();
    Collection<JobInProgress> jobQueue = jobQueueJobInProgressListener.getJobQueue();

    boolean exceededPadding = false;
    synchronized (jobQueue) {
      int totalNeededTasks = 0;
      for (JobInProgress job : jobQueue) {
        if (job.getStatus().getRunState() != JobStatus.RUNNING || job.numReduceTasks == 0) {
          continue;
        }
        totalNeededTasks += isMapTask ? job.desiredMaps() : job.desiredReduces();
        int padding = 0;
        if (numTaskTrackers > MIN_CLUSTER_SIZE_FOR_PADDING) {
          padding = Math.min(maxTaskTrackerSlots,(int) (totalNeededTasks * padFraction));
        }
        if (totalTasks + padding >= totalTaskCapacity) {
          exceededPadding = true;
          break;
        }
      }
    }

    return exceededPadding;
  }

其中,全局变量padFraction的默认值为0.01,也可通过配置文件中的mapred.jobtracker.taskalloc.capacitypad项来设置。

      对于JobQueueTaskScheduler的任务调度原则可总结如下:

        1.任务先进先出;

        2.尽量使集群每一个TaskTracker达到负载均衡(这个均衡是task数量上的而不是实际的工作强度);

        3.尽量分配作业的本地任务给TaskTracker,但不是尽快分配作业的本地任务给TaskTracker,最多分配一个非本地任务给TaskTracker(一是保证任务的并发性,二是避免有些TaskTracker的本地任务被偷走),最多分配一个reduce任务;

         4.为紧急的Task预留一定的slot;

本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2012-01/50857.htm

这篇关于JobTracker任务调度器之JobQueueTaskScheduler的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

XXL-JOB实践:从零开始构建你的任务调度系统

目录 一、序言1、系统组成2、架构图 二、部署调度中心1、下载源码2、执行数据库脚本3、修改application.properties配置文件4、启动调度中心 三、部署执行器1、引入依赖2、执行器配置2.1 XxlJobProperties属性文件2.2 XxlJobConfig配置类2.3 XxlJobHanlder作业处理器2.4 application.yml 3、启动执行器 四、调

XXL-JOB分布式任务调度教程(持续更新~)

先大致声明一下流程(具体细节在下面哦~)  步骤: 1.下载xxl-job并配置以及启动 2.导入对应maven坐标 3.配置对应的配置文件以及编写对应的配置类config 4.编写要触发的方法并且给方法打上@XXlJob("")注解 5.设置xxl-Job平台上的任务    5.1创建执行器  5.2创建任务,5,3配置任务具体细节(比如  (1触发执行器,(2执行时间,(3运行模式,(4以

Linux操作系统学习笔记(七)任务调度

一. 前言   在前文中,我们分析了内核中进程和线程的统一结构体task_struct,并分析进程、线程的创建和派生的过程。在本文中,我们会对任务间调度进行详细剖析,了解其原理和整个执行过程。由此,进程、线程部分的大体框架就算是介绍完了。本节主要分为三个部分:Linux内核中常见的调度策略,调度的基本结构体以及调度发生的整个流程。下面将详细展开说明。 二. 调度策略   Linux的调度策略主

Linux基础 -- pthread之线程池任务调度

线程池任务依赖设计方案 1. 设计目标 为了在多线程环境中支持任务间的依赖关系,我们设计了一个基于 pthread_create 封装的线程池,任务之间可以设置依赖,只有在依赖的任务完成后,依赖任务才会被执行。该设计目标是简化任务调度的逻辑,让开发者可以专注于任务的编写,而不必关注复杂的线程管理和任务依赖的执行顺序。 2. 核心概念 2.1 任务(Task) 任务是线程池中执行的最小单位

【华为笔试】抢占式任务调度

/**************************************************************************** 问题描述: //抢占式任务调度 //输入: 第一行 :n任务数 //接下来n行是任务信息 时间单位为 秒 //任务号 优先级 开始时间 运行时间 //输出:前200s 任务调度顺序 **************************

探索Java中的分布式任务调度:从理论到实践

引言 在现代企业级应用中,定时任务调度是一项至关重要的功能。无论是数据备份、日志清理还是批处理任务,都离不开任务调度系统。随着系统的规模和复杂度的增加,传统的单机任务调度已经无法满足需求。因此,分布式任务调度应运而生。本篇博文将详细介绍Java中的分布式任务调度,从基本概念到实际代码实现,带你全面了解这一技术领域。 目录 分布式任务调度概述常见的分布式任务调度框架Quartz Schedul

SpringBoot整合自定义quartz实现任务调度

在不引入quartz相关表的情况下,自定义任务调度存储表,实现SpringBoot项目启动后自动执行自定义任务调度类。 1、建立自定义任务调度存储表 DROP TABLE IF EXISTS `bmd_flow_schedule`;CREATE TABLE `bmd_flow_schedule` (`taskID` char(20) NOT NULL,`taskName` varchar(3

Quartz任务调度框架

文章目录 前言一、介绍二、使用步骤1.创建maven工程,添加依赖2.创建任务3.启动任务 三、基本实现原理1. Scheduler任务调度器2. Triggers触发器2.1 SimpleTrigger2.2 CronTirgger 3. Misfire策略4 任务Job4.1 Job4.2 JobDetail4.3 JobDataMap 前言 最近跟的一个系统需要实时

推荐一款灵活,可靠和快速的开源分布式任务调度平台

今天给大家推荐一款灵活,可靠和快速的开源分布式任务调度平台——SnailJob。 前言 什么是任务调度? 任务调度,是指在多任务的环境下,合理地分配系统资源,调度各个任务在什么时候,由哪一个处理器处理,以达到满足用户需求、提高系统资源利用率、提高系统吞吐量的目的。 分布式任务调度有哪些应用场景? 定时任务: 在特定时间执行某项任务,例如每天晚上12点备份数据库。 周期性任务: 周期性

Spring Boot集成Spring Cloud Scheduler进行任务调度

Spring Boot集成Spring Cloud Scheduler进行任务调度 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 任务调度是后端服务中常见的需求,用于执行定时任务或周期性的工作。Spring Cloud Scheduler提供了对Spring Boot应用的任务调度支持,允许开发者以声明式的方式配置和执行任务。 Spring Cloud