Hadoop1.X中作業提交的事件模型

1 概述

在hadoop1.X中作業提交到JobTracker時,用了非常典型的事件模型,將源碼抽象一下。


2 監聽者

1個監聽接口:需要關注的行爲

2個監聽者:具體實現類

public interface Listener {

	/**
	 * 監聽作業添加
	 * 
	 * @param job 作業對象
	 */
	public void jobAdded(Job job);

	/**
	 * 監聽作業刪除
	 * 
	 * @param job 作業對象
	 */
	public void jobDeleted(Job job);
}

/**
 * 作業初始化監聽器
 * 
 * 源碼中調用jobTracker的initJob方法
 * 
 */
public class EagerTaskInitializationListener implements Listener {

	public void jobAdded(Job job) {
		System.out.println("作業被添加:" + job.getName() + " 執行操作1........");
	}

	public void jobDeleted(Job job) {
		System.out.println("作業被刪除:" + job.getName() + " 執行操作1........");

	}
}

/**
 * 排序監聽器
 */
public class JobQueueJobInProgressListener implements Listener {

	public void jobAdded(Job job) {
		System.out.println("作業被添加:" + job.getName() + " 執行操作2........");
	}

	public void jobDeleted(Job job) {
		System.out.println("作業被刪除:" + job.getName() + " 執行操作2........");
	}
}

3 調度器

1個抽象調度器

1個具體調度器

public abstract class TaskScheduler {
	protected TaskTrackerManager taskTrackerManager;

	public void setTaskTrackerManager(TaskTrackerManager taskTrackerManager) {
		// 該對象就是JobTracker對象
		this.taskTrackerManager = taskTrackerManager;
	}

	public void start() {

	}
}

public class JobQueueScheduler extends TaskScheduler {

	// 監聽器1
	private EagerTaskInitializationListener jobInProgressListener1;

	// 監聽器2
	private JobQueueJobInProgressListener jobInProgressListener2;

	/**
	 * 初始化並註冊監聽器
	 */
	public void start() {
		jobInProgressListener1 = new EagerTaskInitializationListener();
		jobInProgressListener2 = new JobQueueJobInProgressListener();

		// taskTrackerManager爲父類中的對象,其實就是JobTracker
		taskTrackerManager.addJobInProgressListener(jobInProgressListener1);
		taskTrackerManager.addJobInProgressListener(jobInProgressListener2);
	}
}


4 Tacker相關

1個抽象作業類
1個添加監聽者的接口
1具體JobTracker

public class Job {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}


public interface TaskTrackerManager {
	// 添加監聽者
	public void addJobInProgressListener(Listener listener);
}

public class JobTracker implements TaskTrackerManager {

	// 調度器
	private TaskScheduler scheduler;

	// 所有監聽者
	private List<Listener> jobInProgressListeners = new CopyOnWriteArrayList<Listener>();

	/**
	 * 啓動時創建調度器
	 */
	public JobTracker() {
		scheduler = new JobQueueScheduler();
	}

	/**
	 * 啓動JobTracker
	 */
	public void startTracker() {
		// 將自身對象傳給調度器
		scheduler.setTaskTrackerManager(this);
		// 啓動調度器
		scheduler.start();
	}

	/**
	 * 作業被添加。通知所有註冊的監聽器
	 * 
	 * @param job 作業對象
	 */
	public void addJob(Job job) {
		for (Listener listener : jobInProgressListeners) {
			listener.jobAdded(job);
		}
	}

	/**
	 * 作業被刪除。通知所有註冊的監聽器
	 * 
	 * @param job 作業對象
	 */
	public void deleteJob(Job job) {
		for (Listener listener : jobInProgressListeners) {
			listener.jobDeleted(job);
		}
	}

	/**
	 * 添加監聽器
	 */
	@Override
	public void addJobInProgressListener(Listener listener) {
		jobInProgressListeners.add(listener);
	}
}

5 測試

public class TestJobTracker {

	public static void main(String[] args) {
		// 初始化
		JobTracker jobTracker = new JobTracker();
		jobTracker.startTracker();
		
		// 添加作業
		Job job = new Job();
		job.setName("xy job");
		jobTracker.addJob(job);
		// 刪除作業
		jobTracker.deleteJob(job);
	}
}


發佈了535 篇原創文章 · 獲贊 1165 · 訪問量 451萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章