设为首页 收藏本站
查看: 945|回复: 0

[经验分享] (转)【hadoop代码笔记】Hadoop作业提交中EagerTaskInitializationListener的作用

[复制链接]

尚未签到

发表于 2016-12-12 10:00:44 | 显示全部楼层 |阅读模式
 
  在整理FairScheduler实现的task调度逻辑时,注意到EagerTaskInitializationListener类。差不多应该是job提交相关的逻辑代码中最简单清楚的一个了。
  todo:标红文字表示要加前向链接,待相关文字草稿提交后。
  一、概述
  继承自JobInProgressListener,实现了jobAdded,jobRemoved,jobUpdated方法。哦,不能说实现,应该说继承,JobInProgressListener居然是个抽象类,看着怎么这样的listener也应该是个interface。
  在该listener被注册后,就响应jobAdded,jobRemoved,jobUpdated动作。在 EagerTaskInitializationListener中,响应这三种动作来维护内部的一个job列表 (List<JobInProgress> jobInitQueue),并启动线程对job列表中的job异步的进行初始化。
  二、主要代码逻辑


  • 在job被添加到JobTracker时,注册的Lister会响应该方法。即当有作业提交到JobTracker时,该方法会把JIP加到jobInitQueue列表中,并且根据作业优先级和启动时间来调整其顺序。
  • jobInitManagerThread会一直产看jobInitManagerThread列表中的job,逐一取出来初始化其task。
  三、主要成员

1   private JobInitManager jobInitManager = new JobInitManager(); //一个job初始化线程,关注job队列jobInitQueue,取出进行初始化
2   private Thread jobInitManagerThread; // JobInitManager线程
3   private List<JobInProgress> jobInitQueue = new ArrayList<JobInProgress>(); //响应lister的几种方法,维护的job队列
4   private ExecutorService threadPool; //一个线程池,里面的一个线程取一个job进行初始化
5   private int numThreads; //线程池的线程数,可配置

  四、主要方法
  1. EagerTaskInitializationListener的jobAdded方法 :
  首先关注的代码片段是该listener的jobAdded方法,前面说过,在FairScheduler的start方法中 (taskTrackerManager.addJobInProgressListener(eagerInitListener))会把 EagerTaskInitializationListener注册到JobTracker,在jobTracker中加入job的时候(addJob被调用),触发其上所有的jobListener的jobAdded方法。
  在EagerTaskInitializationListener中,jobAdded只是简单的把job加入到一个 List<JobInProgress>类型的 jobInitQueue中。并不直接对其进行初始化,对其中的job的处理由另外线程来做。

DSC0000.gif

@Override
public void jobAdded(JobInProgress job) {
synchronized (jobInitQueue) {
jobInitQueue.add(job);
resortInitQueue();
jobInitQueue.notifyAll();
}
}




  2. JobInitManager类:
  一个线程,对jobInitQueue上保存的每个Job启动一个线程来执行初始化工作。在其run方法中会一直检查jobInitQueue是否有作业,有则拿出来从线程池中取一个线程处理。

DSC0001.gif JobInitManager

  3. InitJob
  一个线程类定义,真正处理每一个job的初始化。其实调用的是job的初始化方法(JobInProgress initTasks) 



static class InitJob implements Runnable {
private JobInProgress job;
public InitJob(JobInProgress job) {
this.job = job;
}
public void run()
{
job.initTasks();            
}
}




  完。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-313122-1-1.html 上篇帖子: hadoop拷贝文件时 org.apache.hadoop.ipc.RemoteException异常的解决 下篇帖子: Hadoop深入学习:HDFS主要流程——写文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表