YRAN编程有很多地方采用了事件驱动模型,把代码简化,方便理解它。
1.定义一个事件:
import org.apache.hadoop.yarn.event.AbstractEvent;
public class TaskEvent extends AbstractEvent<TaskEventType> {
private String taskID;
public TaskEvent(String taskID, TaskEventType type) {
super(type);
this.taskID=taskID;
}
public String getTaskID() {
return taskID;
}
}
public enum TaskEventType {
T_KILL,
T_SCHEDULE
}
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.service.CompositeService;
import org.apache.hadoop.service.Service;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
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 {//单事件服务可以继承AbstractService,该如何使用?
private Dispatcher dispatcher;
public Dispatcher getDispatcher() {
return dispatcher;
}
public SimpleMRAppMaster(String name) {
super(name);
}
@Override
protected void serviceInit(Configuration arg0) throws Exception {
dispatcher = new AsyncDispatcher();
dispatcher.register(TaskEventType.class, new TaskEventDisptacher());
addService((Service)dispatcher);
super.serviceInit(arg0);
}
private class TaskEventDisptacher implements EventHandler<TaskEvent>{
@Override
public void handle(TaskEvent arg0) {
if(arg0.getType() == TaskEventType.T_KILL){
System.out.println("run kill");
}else if(arg0.getType() == TaskEventType.T_SCHEDULE){
System.out.println("run schedule");
}
}
}
//测试入口
public static void main(String[] args) throws Exception {
SimpleMRAppMaster master = new SimpleMRAppMaster("SimpleMRAppMaster");
YarnConfiguration conf = new YarnConfiguration();
master.serviceInit(conf);
master.serviceStart();//必须是子类才可以调用,所以main方法写入这个类里面,main方法写入其他类,需要反射。
// master.init(conf); 这2组方法测试效果貌似一样,
// master.start(); 有空去看下API解释
master.getDispatcher().getEventHandler().handle(new TaskEvent("task1",TaskEventType.T_SCHEDULE));
master.getDispatcher().getEventHandler().handle(new TaskEvent("task1",TaskEventType.T_KILL));
}
}
还有些问题,没有弄明白,先做一个记录吧。