为了说明YARN服务库和事件库的使用方法,本小节介绍一个简单的实例,该实例可看做MapReduce ApplicationMaster(MRAppMaster)的简化版。该例子涉及任务和作业两种对象的事件以及一个中央异步调度器。步骤如下。
1)定义Task事件。
- public class TaskEvent extends AbstractEvent<TaskEventType> {
- private String taskID; //Task ID
- public TaskEvent(String taskID, TaskEventType type) {
- super(type);
- this.taskID = taskID;
- }
- public String getTaskID() {
- return taskID;
- }
其中,Task事件类型定义如下:
- public enum TaskEventType {
- T_KILL,
- T_SCHEDULE
- }
2)定义Job事件。
- public class JobEvent extends AbstractEvent<JobEventType> {
- private String jobID;
- public JobEvent(String jobID, JobEventType type) {
- super(type);
- this.jobID = jobID;
- }
- public String getJobId() {
- return jobID;
- }
- }
其中,Job事件类型定义如下:
- public enum JobEventType {
- JOB_KILL,
- JOB_INIT,
- JOB_START
- }
3)事件调度器。
接下来定义一个中央异步调度器,它接收Job和Task两种类型事件,并交给对应的事件处理器处理,代码如下:
- @SuppressWarnings("unchecked")
- 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;
- taskIDs = new String[taskNumber];
- for(int i = 0; i < taskNumber; i++) {
- taskIDs[i] = new String(jobID + "_task_" + i);
- }
- }
- public void serviceInit(final Configuration conf) throws Exception {
- dispatcher = new AsyncDispatcher();//定义一个中央异步调度器
- //分别注册Job和Task事件调度器
- dispatcher.register(JobEventType.class, new JobEventDispatcher());
- dispatcher.register(TaskEventType.class, new TaskEventDispatcher());
- addService((Service) dispatcher);
- super.serviceInit(conf);
- }
- public Dispatcher getDispatcher() {
- return dispatcher;
- }
- private class JobEventDispatcher implements EventHandler<JobEvent> {
- @Override
- public void handle(JobEvent event) {
- if(event.getType() == JobEventType.JOB_KILL) {
- System.out.println("Receive JOB_KILL event, killing all the tasks");
- for(int i = 0; i < taskNumber; i++) {
- dispatcher.getEventHandler().handle(new TaskEvent(taskIDs[i],
- TaskEventType.T_KILL));
- }
- } else if(event.getType() == JobEventType.JOB_INIT) {
- System.out.println("Receive JOB_INIT event, scheduling tasks");
- for(int i = 0; i < taskNumber; i++) {
- dispatcher.getEventHandler().handle(new TaskEvent(taskIDs[i],
- TaskEventType.T_SCHEDULE));
- }
- }
- }
- }
- private class TaskEventDispatcher implements EventHandler<TaskEvent> {
- @Override
- public void handle(TaskEvent event) {
- if(event.getType() == TaskEventType.T_KILL) {
- System.out.println("Receive T_KILL event of task " + event.getTaskID());
- } else if(event.getType() == TaskEventType.T_SCHEDULE) {
- System.out.println("Receive T_SCHEDULE event of task " + event.getTaskID());
- }
- }
- }
- }
- 4)测试程序。
- @SuppressWarnings("unchecked")
- public class SimpleMRAppMasterTest {
- public static void main(String[] args) throws Exception {
- String jobID = "job_20131215_12";
- SimpleMRAppMaster appMaster = new SimpleMRAppMaster("Simple MRAppMaster", jobID, 5);
- YarnConfiguration conf = new YarnConfiguration(new Configuration());
- appMaster.serviceInit(conf);
- appMaster.serviceStart();
- appMaster.getDispatcher().getEventHandler().handle(new JobEvent(jobID,
- JobEventType.JOB_KILL));
- appMaster.getDispatcher().getEventHandler().handle(new JobEvent(jobID,
- JobEventType.JOB_INIT));
- }