Yarn的服务库和事件库使用方法

事件类型定义:

package org.apache.hadoop.event;
public enum JobEventType {
        JOB_KILL,
        JOB_INIT,
        JOB_START
}
package org.apache.hadoop.event;

public enum TaskEventType {
    T_KILL,
    T_SCHEDULE
}

事件定义:

package org.apache.hadoop.event;

import org.apache.hadoop.yarn.event.AbstractEvent;
public class JobEvent extends AbstractEvent<JobEventType> {

    private String jobID;

    public JobEvent(JobEventType type,String jobID) {
        super(type);
        this.jobID=jobID;
    }
    public String getJobID() {
        return jobID;
    }

}
package org.apache.hadoop.event;

import org.apache.hadoop.yarn.event.AbstractEvent;

public class TaskEvent extends AbstractEvent<TaskEventType> {

    private String taskID; //TASkID

    public TaskEvent(TaskEventType type,String taskID) {
        super(type);
        this.taskID=taskID;
    }

    public String getTaskID() {
        return taskID;
    }

}

简单服务定义:

package org.apache.hadoop.event;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.service.CompositeService;
import org.apache.hadoop.service.Service;
import org.apache.hadoop.yarn.event.AsyncDispatcher;
import org.apache.hadoop.yarn.event.Dispatcher;
import org.apache.hadoop.yarn.event.EventHandler;

public class SimpleMRAppMaster extends CompositeService {

    private Dispatcher dispatcher;   //中央异步调度器
    private String jobID;
    private int taskNumber;  //作业中包含的任务数
    private String[] taskIDS; //该作业中包含的所有任务

    public SimpleMRAppMaster(String name,String jobID,int taskNumber) {
        super(name);
        this.jobID=jobID;
        this.taskNumber=taskNumber;
        this.taskIDS=new String[taskNumber];
        for(int i=0;i<taskNumber;i++){
            this.taskIDS[i]=new String(jobID+"_task_"+i);
        }
    }

    @Override
    protected void serviceInit(Configuration conf) throws Exception {

        dispatcher=new AsyncDispatcher();

        dispatcher.register(JobEventType.class, new JobEventHandller());
        dispatcher.register(TaskEventType.class, new TaskEventHandller());
        addService((Service)dispatcher);

        super.serviceInit(conf);
    }

    public Dispatcher getDispatcher(){
        return dispatcher;
    }

    private class JobEventHandller implements EventHandler<JobEvent>{

        @Override
        public void handle(JobEvent event) {

            //若收到 杀死  作业 事件
            if(event.getType() == JobEventType.JOB_KILL){
                System.out.println("收到 杀死作业事件   ,要 杀掉作业"+event.getJobID()+"下的所有任务");

                for(int i=0;i<=taskNumber;i++){
                    dispatcher.getEventHandler().handle(new TaskEvent(TaskEventType.T_KILL, taskIDS[i]));
                }

            }else if(event.getType()== JobEventType.JOB_INIT){
                System.out.println("收到 启动作业事件   ,要启动 作业"+event.getJobID()+"下的所有任务");
                for(int i=0;i<=taskNumber;i++){
                    dispatcher.getEventHandler().handle(new TaskEvent(TaskEventType.T_SCHEDULE, taskIDS[i]));
                }
            }
        }
    }

    private class TaskEventHandller implements EventHandler<TaskEvent>{

        @Override
        public void handle(TaskEvent event) {
            if(event.getType()==TaskEventType.T_KILL){
                System.out.println("收到杀死任务命令,开始杀死任务"+event.getTaskID());
            }else if(event.getType()==TaskEventType.T_SCHEDULE){
                System.out.println("收到启动任务命令,开始启动任务"+event.getTaskID());
            }
        }
    }

}

测试程序定义:

package org.apache.hadoop.event;

import static org.junit.Assert.*;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.junit.Test;

/**
 * 自己写的 关于事件库 和 服务 库的使用
 * @author joqk
 *
 */
public class SimpleMRAppMasterTest {

    @Test
    public void test() throws Exception {

            String jobID="job_20140912_01";
            SimpleMRAppMaster appMaster=new SimpleMRAppMaster("作业测试", jobID, 10);
            YarnConfiguration conf = new YarnConfiguration(new Configuration());

            appMaster.serviceInit(conf);

            appMaster.start();

            appMaster.getDispatcher().getEventHandler().handle(new JobEvent(JobEventType.JOB_INIT, jobID));

    }

}
时间: 2024-12-29 11:52:24

Yarn的服务库和事件库使用方法的相关文章

Hadoop服务库与事件库的使用及其工作流程

Hadoop服务库与事件库的使用及其工作流程 ? Hadoop服务库: YARN采用了基于服务的对象管理模型,主要特点有: 被服务化的对象分4个状态:NOTINITED,INITED,STARTED,STOPED 任何服务状态变化都可以触发另外一些动作 可通过组合方式对任意服务进行组合,统一管理 具体类请参见 org.apache.hadoop.service包下.核心接口是Service,抽象实现是AbstractService ????YARN中,ResourceManager和NodeMa

Yarn的服务库和事件库

对于生命周期较长的对象,YARN采用了基于服务对象管理模型对其进行管理. 该模型有一下特点: 每个被服务化的对象都分为4个状态 任何服务状态变化都可以触发另外一些动作 可以通过组合方式对任意服务进行组合,以便统一管理. YARN中服务模型的类图(位于包:org.apahce.hadoop.service中) 在YARN中,resourceManager 和 nodeManager属于组合服务,他们的内部包含多个单一服务和组合服务,以实现对内部多种服务的统一管理. 所有的核心服务实际上都是一个中央

Redis源码-事件库

网上看了很多Redis事件库的解读,自己也研究了好几遍,还是记录下来,虽然水平有限,但是进步总会是有的 网络事件库封装了Epoll的操作(当然是指Linux下的多路复用了),并且实现一个定时器,定时器也是服务端程序的基石,很多问题都需要靠定时器解决 (一)数据结构+算法构成一个完整的程序,要一窥Redis网络库,需要先从数据结构开始学习 1.整个事件循环是用一个全局的数据结构描述的,aeEventLoop /* State of an event based program */ typedef

利用epoll写一个&quot;迷你&quot;的网络事件库

epoll是linux下高性能的IO复用技术,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了.epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存I

部门经理的风范---记一版本库迁移事件

工作中少不了团队间的合作,而有了合作,也必将有摩擦.如何应对摩擦和项目行进中的人为阻碍因素,能体现出一位团队领导者的能力. 我们部门经理(简称B)在11月21日的进取性做法让我一个小组员获益良多. 事件: 有个VSS迁移到SVN的项目----迁移某软件中心下属4个软件开发部门的4个VSS库到到SVN环境.  我们部门分出3个组员和小组长(简称Z)合共4人连续7个工作日,做好了环境搭建.数据迁移.数据校对的工作.于20日晚上,加班完成了4个库的整体迁移. 然而21日上午,整个部门的工作QQ和邮箱被

js学习总结----移动端事件基础及常用的事件库

一.事件基础 PC:click.mouseover.mouseout.mouseenter.mouseleave.mousemove.mousedown.mouseup.mousewheel.keydown.keyup.load.scroll.blur.focus.change... 移动端:click(单击).load.scroll.blur.focus.change.input(代替keyup.keydown)...TOUCH事件模型(处理单手指操作).GESTURE事件模型(处理多手指操作

手势识别与事件库 Touch.js若干问题及解决方法

Touch.js是移动设备上的手势识别与事件库, 由百度云Clouda团队维护,也是在百度内部广泛使用的开发工具. Touch.js的代码已托管于github并开源,希望能帮助国内更多的开发者学习和开发出优秀的App产品. Touch.js手势库专为移动设备设计, 请在Webkit内核浏览器中使用. 极速CDN <script src="http://code.baidu.com/touch-0.2.14.min.js"></script> Examples /

ktouch移动端事件库

最近闲来无事,写了个移动端的事件库,代码贴在下面,大家勿拍. 1 /** 2 @version 1.0.0 3 @author gangli 4 @deprecated 移动端触摸事件库 5 */ 6 (function () { 7 "use strict"; 8 var util = { 9 $: function (selector) { 10 return document.querySelector(selector); 11 }, 12 getEventInfo: func

touch.js - 移动设备上的手势识别与事件库

Touch.js 是移动设备上的手势识别与事件库, 由百度云Clouda团队维护,也是在百度内部广泛使用的开发工具.Touch.js手势库专为移动设备设计.Touch.js对于网页设计师来说,是一款不错的辅助工具,可以减少很多写框架控制器的时间.网页合理使用Touch.js不但能增加网页的美观感,而且在节约时间,减少人力投入也有极大的帮助. Touch.js官网: https://www.awesomes.cn/repo/Clouda-team/touchjsgithub:https://git