参考:http://blog.csdn.net/xhh198781/article/details/7342282

Hadoop中的用户作业在其整个生命周期中有5个状态,它们分别是:PREP、RUNNING、SUCCEEDED、FAILED、KILLED,而这其中的SUCCEEDED、FAILED、KILLED三个状态是互斥的,都可看做是Job的完成状态。当用户成功的提交了一个Job之后,这个Job就会进入PREP状态,然后这个Job的map启动任务会被首先交给一个TaskTracker节点来完成,当这个任务被成功执行之后,Job就会进入RUNNING状态,最后随着Job的map任务和reduce任务的完成状态,Job进入FAILED或SUCCEEDED或KILLED中的某一个状态,这个状态图如下:

当一个作业处于完成状态之后,JobTracker节点的任务调度器就不需要再考虑该Job了,也就是JobTracker需要把该Job从作业队列中删除。但是,JobTracker节点并不是马上就把与这个Job相关的信息删除掉,而是先把它缓存起来,同时建立一个用户与Job的映射,这个用户是指提交该作业的用户。至于JobTracker为什么会这么做,笔者目前也没有完全弄明白,推测可能与用户作业历史记录有关,也或者和集群的负载统计有关(如果有朋友知道这其中的原因可以@我)。当然这里可能有一个问题就是,JobTracker节点是否一直会缓存这些已完成Job的信息呢?实际上是不会的,因为JobTracker节点为每一个缓存的已完成Job信息设置了一个生命周期,当过了这个生命周期,这个缓存信息就会被清除掉。这个清理工作被设计成了JobTracker节点的一个组件——RetireJobs,这个RetireJobs作为JobTracker节点的后台线程,会定时的检测每一个缓存的已完成Job信息的生存时间是够已过期,如果过期了,他就会被清除。这个检查的间隔时间为RETIRE_JOB_CHECK_INTERVAL ms,默认值是60000,但也可通过配置文件来设置,对应的配置项为:mapred.jobtracker.retirejob.check。而每一个已完成Job信息的生存时间为RETIRE_JOB_INTERVAL ms,它的默认值24*60*60*1000,当然也可以通过配置文件来设置,对应的配置项为:mapred.jobtracker.retirejob.interval。这个过程的具体源码如下:

[java] view plaincopy
  1. static final int MIN_TIME_BEFORE_RETIRE = 60000;
  2. public void run() {
  3. while (true) {
  4. try {
  5. Thread.sleep(RETIRE_JOB_CHECK_INTERVAL);
  6. List<JobInProgress> retiredJobs = new ArrayList<JobInProgress>();
  7. long now = System.currentTimeMillis();
  8. long retireBefore = now - RETIRE_JOB_INTERVAL;
  9. synchronized (jobs) {
  10. for(JobInProgress job: jobs.values()) {
  11. if (job.getStatus().getRunState() != JobStatus.RUNNING &&
  12. job.getStatus().getRunState() != JobStatus.PREP &&
  13. (job.getFinishTime() + MIN_TIME_BEFORE_RETIRE < now) &&
  14. (job.getFinishTime()  < retireBefore)) {
  15. retiredJobs.add(job);
  16. }
  17. }
  18. }
  19. if (!retiredJobs.isEmpty()) {
  20. synchronized (JobTracker.this) {
  21. synchronized (jobs) {
  22. synchronized (taskScheduler) {
  23. for (JobInProgress job: retiredJobs) {
  24. removeJobTasks(job);
  25. jobs.remove(job.getProfile().getJobID());
  26. for (JobInProgressListener l : jobInProgressListeners) {
  27. l.jobRemoved(job);
  28. }
  29. String jobUser = job.getProfile().getUser();
  30. synchronized (userToJobsMap) {
  31. ArrayList<JobInProgress> userJobs =  userToJobsMap.get(jobUser);
  32. synchronized (userJobs) {
  33. userJobs.remove(job);
  34. }
  35. if (userJobs.isEmpty()) {
  36. userToJobsMap.remove(jobUser);
  37. }
  38. }
  39. LOG.info("Retired job with id: '" + job.getProfile().getJobID() + "' of user '" + jobUser + "'");
  40. // clean up job files from the local disk
  41. JobHistory.JobInfo.cleanupJob(job.getProfile().getJobID());
  42. }
  43. }
  44. }
  45. }
  46. }
  47. } catch (InterruptedException t) {
  48. break;
  49. } catch (Throwable t) {
  50. LOG.error("Error in retiring job:\n" + StringUtils.stringifyException(t));
  51. }
  52. }
  53. LOG.debug("Job Retire Thread is to stop..");
  54. }

但是,JobTracker节点的资源是有限的,如果某一个用户频繁的提交Job,那么这个用户对应的已完成Job信息缓存会占用大量的系统资源,所以JobTracker节点又设计了另一个检测机制,就是当一个作业完成时,它会判断这个Job对应的提交用户缓存的已完成Job信息的数量有没有达到一个阈值MAX_COMPLETE_USER_JOBS_IN_MEMORY,如果达到了这个阈值的话,就会删除他的所有缓存时间超过 MIN_TIME_BEFORE_RETIRE ms的已完成Job信息,直到这个用户缓存的已完成Job信息的数量下降到这个阈值。MAX_COMPLETE_USER_JOBS_IN_MEMORY可以通过配置文件来配置,对应的配置项为:mapred.jobtracker.completeuserjobs.maxinum,但它的默认值是100。

JobTracker节点后台线程之RetireJobs相关推荐

  1. Asp.Net Core 轻松学-多线程之Task快速上手

    Asp.Net Core 轻松学-多线程之Task快速上手 原文:Asp.Net Core 轻松学-多线程之Task快速上手 前言     Task是从 .NET Framework 4 开始引入的一 ...

  2. Java多线程之volatile详解

    Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...

  3. Android多线程之IntentService源码解析

    想要了解 IntentService 的工作原理需要先对 Android 系统中以 Handler.Looper.MessageQueue 组成的异步消息处理机制以及 HandlerThread 有所 ...

  4. iOS多线程之GCD小记

    iOS多线程之GCD小记 iOS多线程方案简介 从各种资料中了解到,iOS中目前有4套多线程的方案,分别是下列4中: 1.Pthreads 这是一套可以在很多操作系统上通用的多线程API,是基于C语言 ...

  5. 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool

    [索引页] [源码下载] 稳扎稳打Silverlight(25) - 2.0线程之Thread, Timer, BackgroundWorker, ThreadPool 作者:webabcd 介绍 S ...

  6. asp.Net Core 多线程之Task轻松学,快速上手

    Asp.Net Core 轻松学-多线程之Task快速上手 目录 前言 1. Task 的使用方法 3. 处理 Task 中的异常 4. 同步上下文 5. Task 的运行方式 6. 有条件的 Tas ...

  7. Android 多线程之IntentService 完全详解

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52426425 出自[zejian的博客] 关联文章: Android ...

  8. Android多线程之ArrayBlockingQueue源码解析

    阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...

  9. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

最新文章

  1. android系统源代码添加新产品的支持
  2. wordpress在新窗口打开留言者链接
  3. 如何在SQL Server Reporting Services中使用表达式来创建有效的报告
  4. 最多添加3个标签,每个标签最长6字,空格或逗号隔开
  5. C# Winform 实现Ajax效果自定义按钮
  6. wxpython使用_wxpython的demo使用
  7. 产品分析中如何去做用户调研
  8. 计算机更改开机密码快捷方法,如何对电脑的开机密码进行快速更换
  9. iPhone5越狱后经典插件个人推荐
  10. Java中的包(package)详情解释
  11. ZUCC_计算机网络实验_实验04 VLAN配置
  12. 学习笔记0601----mysql主从
  13. 一种微型计算机实现多重引导的方法
  14. 星际译王 stardict 3.0.6 -- Linux 下的优秀词典软件在 Debian 上的一键安装
  15. 【信号检测】基于matlab双稳随机共振微弱信号检测(低信噪比下)【含Matlab源码 2307期】
  16. vue集成vis-network实现拓扑图
  17. 《微波原理与技术》学习笔记5波导理论-微波传输线
  18. 从IDEA的一次意外退出发现JVM
  19. RAC环境中openssh版本对SSH互信创建的影响
  20. 2021世界人工智能大会工业智能论坛开幕:AI赋能产业 数字点亮中国

热门文章

  1. 关于jsb中js与c++的相互调用
  2. 描点链接元素的优化提升用户体验
  3. VS2003 找不到IsProcessInJob()
  4. mysql装一次后再装_MySQL再安装
  5. 5G NGC — 关键技术 — MEC 边缘云
  6. Go 语言编程 — 函数
  7. VMware 虚拟化编程(10) — VMware 数据块修改跟踪技术 CBT
  8. 让人失望透顶的 CSDN 博客改版
  9. 51单片机中将变量、数组、函数设置在固定位置,定位到绝对地址
  10. Linux内核Makefile