当我们在写MapReduce程序的时候,通常,在main函数里,我们会像下面这样做。建立一个Job对象,设置它的JobName,然后配置输入输出路径,设置我们的Mapper类和Reducer类,设置InputFormat和正确的输出类型等等。然后我们会使用job.waitForCompletion()提交到JobTracker,等待job运行并返回,这就是一般的Job设置过程。JobTracker会初始化这个Job,获取输入分片,然后将一个一个的task任务分配给TaskTrackers执行。TaskTracker获取task是通过心跳的返回值得到的,然后TaskTracker就会为收到的task启动一个JVM来运行。

  1. Configuration conf = getConf();
  2. Job job = new Job(conf, "SelectGradeDriver");
  3. job.setJarByClass(SelectGradeDriver.class);
  4. Path in = new Path(args[0]);
  5. Path out = new Path(args[1]);
  6. FileInputFormat.setInputPaths(job, in);
  7. FileOutputFormat.setOutputPath(job, out);
  8. job.setMapperClass(SelectGradeMapper.class);
  9. job.setReducerClass(SelectGradeReducer.class);
  10. job.setInputFormatClass(TextInputFormat.class);
  11. job.setOutputFormatClass(TextOutputFormat.class);
  12. job.setMapOutputKeyClass(InstituteAndGradeWritable.class);
  13. job.setMapOutputValueClass(Text.class);
  14. job.setOutputKeyClass(InstituteAndGradeWritable.class);
  15. job.setOutputValueClass(Text.class);
  16. System.exit(job.waitForCompletion(true)? 0 : 1);

Job其实就是提供配置作业、获取作业配置、以及提交作业的功能,以及跟踪作业进度和控制作业。Job类继承于JobContext类。JobContext提供了获取作业配置的功能,如作业ID,作业的Mapper类,Reducer类,输入格式,输出格式等等,它们除了作业ID之外,都是只读的。 Job类在JobContext的基础上,提供了设置作业配置信息的功能、跟踪进度,以及提交作业的接口和控制作业的方法。

  1. public class Job extends JobContext {
  2. public static enum JobState {DEFINE, RUNNING};
  3. private JobState state = JobState.DEFINE;
  4. private JobClient jobClient;
  5. private RunningJob info;
  6. public float setupProgress() throws IOException {
  7. ensureState(JobState.RUNNING);
  8. return info.setupProgress();
  9. }
  10. public float mapProgress() throws IOException {
  11. ensureState(JobState.RUNNING);
  12. return info.mapProgress();
  13. }
  14. public float reduceProgress() throws IOException {
  15. ensureState(JobState.RUNNING);
  16. return info.reduceProgress();
  17. }
  18. public boolean isComplete() throws IOException {
  19. ensureState(JobState.RUNNING);
  20. return info.isComplete();
  21. }
  22. public boolean isSuccessful() throws IOException {
  23. ensureState(JobState.RUNNING);
  24. return info.isSuccessful();
  25. }
  26. public void killJob() throws IOException {
  27. ensureState(JobState.RUNNING);
  28. info.killJob();
  29. }
  30. public TaskCompletionEvent[] getTaskCompletionEvents(int startFrom
  31. ) throws IOException {
  32. ensureState(JobState.RUNNING);
  33. return info.getTaskCompletionEvents(startFrom);
  34. }
  35. public void killTask(TaskAttemptID taskId) throws IOException {
  36. ensureState(JobState.RUNNING);
  37. info.killTask(org.apache.hadoop.mapred.TaskAttemptID.downgrade(taskId),
  38. false);
  39. }
  40. public void failTask(TaskAttemptID taskId) throws IOException {
  41. ensureState(JobState.RUNNING);
  42. info.killTask(org.apache.hadoop.mapred.TaskAttemptID.downgrade(taskId),
  43. true);
  44. }
  45. public Counters getCounters() throws IOException {
  46. ensureState(JobState.RUNNING);
  47. return new Counters(info.getCounters());
  48. }
  49. public void submit() throws IOException, InterruptedException,
  50. ClassNotFoundException {
  51. ensureState(JobState.DEFINE);
  52. setUseNewAPI();
  53. // Connect to the JobTracker and submit the job
  54. connect();
  55. info = jobClient.submitJobInternal(conf);
  56. super.setJobID(info.getID());
  57. state = JobState.RUNNING;
  58. }
  59. private void connect() throws IOException, InterruptedException {
  60. ugi.doAs(new PrivilegedExceptionAction<Object>() {
  61. public Object run() throws IOException {
  62. jobClient = new JobClient((JobConf) getConfiguration());
  63. return null;
  64. }
  65. });
  66. }
  67. public boolean waitForCompletion(boolean verbose
  68. ) throws IOException, InterruptedException,
  69. ClassNotFoundException {
  70. if (state == JobState.DEFINE) {
  71. submit();
  72. }
  73. if (verbose) {
  74. jobClient.monitorAndPrintJob(conf, info);
  75. } else {
  76. info.waitForCompletion();
  77. }
  78. return isSuccessful();
  79. }
  80. //lots of setters and others
  81. }

一个Job对象有两种状态,DEFINE和RUNNING,Job对象被创建时的状态时DEFINE,当且仅当Job对象处于DEFINE状态,才可以用来设置作业的一些配置,如Reduce task的数量、InputFormat类、工作的Mapper类,Partitioner类等等,这些设置是通过设置配置信息conf来实现的;当作业通过submit()被提交,就会将这个Job对象的状态设置为RUNNING,这时候作业以及提交了,就不能再设置上面那些参数了,作业处于调度运行阶段。处于RUNNING状态的作业我们可以获取作业、map task和reduce task的进度,通过代码中的*Progress()获得,这些函数是通过info来获取的,info是RunningJob对象,它是实际在运行的作业的一组获取作业情况的接口,如Progress。

在waitForCompletion()中,首先用submit()提交作业,然后等待info.waitForCompletion()返回作业执行完毕。verbose参数用来决定是否将运行进度等信息输出给用户。submit()首先会检查是否正确使用了new API,这通过setUseNewAPI()检查旧版本的属性是否被设置来实现的,接着就connect()连接JobTracker并提交。实际提交作业的是一个JobClient对象,提交作业后返回一个RunningJob对象,这个对象可以跟踪作业的进度以及含有由JobTracker设置的作业ID。

getCounter()函数是用来返回这个作业的计数器列表的,计数器被用来收集作业的统计信息,比如失败的map task数量,reduce输出的记录数等等。它包括内置计数器和用户定义的计数器,用户自定义的计数器可以用来收集用户需要的特定信息。计数器首先被每个task定期传输到TaskTracker,最后TaskTracker再传到JobTracker收集起来。这就意味着,计数器是全局的。

转自:

Job类的更多相关文章

  1. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  2. C++ 可配置的类工厂

    项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...

  3. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  4. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  5. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  6. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  7. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  8. PHP-解析验证码类--学习笔记

    1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $char ...

  9. C# 多种方式发送邮件(附帮助类)

    因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...

  10. .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator

    去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...

随机推荐

  1. Spark Programming--Transformations

    map 将RDD中的每个数据项,一对一的映射关系,RDD数目不变,分区数也不变 例子: 数据集: map操作: flatMap 和map一样,但是会拆分每一个map之后的list,可以理解为一对多(注 ...

  2. linux bq20z75 驱动

    新的项目中使用到了电池.电池的guage使用TI的bq20z75.kernel的驱动中已经有bq20z75的驱动,只要稍加修改就可以使用. 参考链接 http://www.ti.com/lit/er/ ...

  3. 在Fedora8上配置Tomcat6.0.37

    说是配置,其实很简单,解压拷贝是主要的活动,主要还是Tomcat做得很好很方便. 安装Tomcat的前提是把JDK装好,这和Win下是一样的.下面是整个步骤: 第一步,到Tomcat官网下载apach ...

  4. MySQL一些常用的时间函数

    https://my.oschina.net/sallency/blog/470370

  5. <dependency>spring-webmvc</dependency>

    Spring 4.2.0.RELEASE版本: <dependency> <groupId>org.springframework</groupId> <ar ...

  6. 优化Linux内核参数/etc/sysctl.conf sysctl 《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》

    优化Linux内核参数/etc/sysctl.conf  sysctl  <高性能Linux服务器构建实战:运维监控.性能调优与集群应用> http://book.51cto.com/ar ...

  7. 解决【必须使用“角色管理工具”安装或配置Microsoft .NET Framework 3.5 SP1】的方法

    [摘要:正在Windows Server 2008下间接装置SQL Server 2008时,会涌现以下毛病: 必需应用“脚色治理对象”装置或设置装备摆设Microsoft .NET Framewor ...

  8. Mac自定义隐藏或显示文件的快捷键

    Mac自定义隐藏或显示文件的快捷键 本教程教大家学会自定义隐藏和显示文件夹的快捷键(Command+Shift+.). 1. 打开应用程序--Automator--选择"服务"-- ...

  9. Android --Fragment中异步HTTP请求

    1.自定义异步Task /** * 异步获取实时数据 */ public class TimerDataTask extends AsyncTask<Void, Void, Boolean> ...

  10. Nginx实现多重IF判断的办法

    在YII框架中如果访问的图片不存在,会记录大量的错误,于是我想了个办法,凡是访问不存在的图片,直接返回404,不经过YII框架 location / {  set $if_img N;  if ($r ...