Hadoop学习之MapReduce(五)


作业的提交和监控

Job为作业提交者提供了作业的视图,允许用户管理作业,提交作业,控制作业的执行和查询作业状态,比如跟踪map和reduce任务的执行进度。该类提供的set方法只有在作业已经被提交后才生效,否则将会抛出IllegalStateException异常。作业的提交过程包括:

1.       检查作业的输入输出规范。

2.       计算作业InputSplit的值。

3.       如果必要,设置作业的DistributedCache 的必需计费信息。

4.       拷贝作业的jar文件和配置管理文件到MapReduce在文件系统的目录中。

5.       提交作业到JobTracker并可选地监控其状态。

作业的历史文件被记录到由hadoop.job.history.user.location 指定的目录中,默认值为作业的输出目录,文件被存储到指定目录下的_logs/history/中。因此,默认情况,历史文件将被存放在mapred.output.dir/_logs/history中。用户可以通过将hadoop.job.history.user.location的值设置为none阻止记录日志。

用户可以使用下面的命令浏览指定目录下的历史日志摘要:$ bin/hadoop job -history output-dir 。该命令将会打印作业的详细信息,失败和被杀死的作业的详细信息。更多关于作业的详细信息,比如成功的任务和每个任务的尝试次数可以以使用下面的命令浏览:$ bin/hadoop job -history all output-dir 。用户可以使用Utils.OutputFileUtils.OutputLogFilter过滤输出目录中的日志文件。

作业授权

如果配置项mapred.acls.enabled (在mapred-default.xml)设置为true,则作业级授权和对列级授权在集群中都是可用的。当授权可用时,访问控制检查需要由以下执行:

a)       在允许用户提交作业到队列和管理他们的作业之前由JobTracker执行

b)       在允许用户浏览作业的细节或者使用MapReduce API、CLI、web用户接口修改作业之前由JobTracker和TaskTracker执行。

作业提交者可分别通过配置项 mapreduce.job.acl-view-job 和mapreduce.job.acl-modify-job指定浏览或者修改作业的访问控制列表。默认情况下,上述属性的值为空。

然而,无论作业的访问控制列表是如何配置的,作业的拥有者,超级用户,集群管理员(mapreduce.cluster.administrators)和作业所提交到的队列的队列管理员(mapred.queue.queue-name.acl-administer-jobs)总是可以浏览和修改作业的。

作业的浏览访问控制列表(ACL)在返回关于作业可能的敏感信息之前授权给配置项 mapreduce.job.acl-view-job指定的用户,这些敏感信息像:

  • 作业级的计数器
  • 任务级计数器
  • 任务的诊断信息
  • 在TaskTracker的web界面显示的的任务日志
  • 在JobTracker的web界面显示的job.xml

作业的其它信息,比如作业的状态和配置对所有用户都是可以访问的,不需要授权。

作业的修改访问控制列表在允许修改作业之前授权给由 mapreduce.job.acl-modify-job 指定的用户,这些修改包括:

  • 杀死一个作业
  • 杀死或者使任务失败
  • 设置作业的优先级

这些操作也被队列级的访问控制列表允许,只需要对mapred-queue-acls.xml文件中的mapred.queue.queue-name.acl-administer-jobs选项配置。如果调用者是队列管理ACL或者作业修改ACL中的成员就可以进行上述修改操作。

作业控制

用户可能需要链接多个MapReduce任务以完成单个MapReduce作业无法完成的复杂任务。由于作业的输出通常进入到分布式文件系统,并且作业的输出反过来可以作为下个作业的输入,所以链接多个作业是相当简单的。但是这也意味着确保多个作业完成(成功或者失败)直接依赖于客户端。

作业证书

在一个安全集群中,通过Kerberos的kinit命令认证用户。由于关注可扩展性,不把客户端的Kerberos的票据推送到MapReduce作业中。替代方案是,从NameNode获得授权令牌,作业将会使用该令牌并存储在作业中作为作业提交的一部分。授权令牌自动提供给HDFS,该HDFS保存着分段目录(作业文件的写入目录)和任何被FileInputFormats,FileOutputFormats,DistCp以及分布式缓存引用的HDFS系统。其它的应用程序要求为所有在作业执行期间任务可能要与之会话的NameNode设置配置选项mapreduce.job.hdfs-servers。该选项的值是用逗号分隔的文件系统名称列表,比如:hdfs://nn1/,hdfs://nn2/。这些令牌作为作业提交的一部分提交给JobTracker用于认证。

与HDFS授权令牌相似,也有MapReduce授权令牌。MapReduce令牌被提供这样任务可以产生作业如果它们希望。通过MapReduce令牌任务验证JobTracker。授权令牌可以通过使用API JobClient.getDelegationToken()得到,得到的令牌必须推给JobConf中的认证信息,API Credentials.addToken用于将得到的令牌推给JobConf中的认证信息用于作业的提交。

认证信息作为作业提交过程的一部分发送给JobTracker,JobTracker持久化令牌并保存在mapred.system.dir/JOBID下的一个文件中,TaskTracker将该文件作为作业本地化的一部分进行本地化。任务查看名为HADOOP_TOKEN_FILE_LOCATION的环境变量,MapReduce框架设置该变量指向本地化文件。为了从任务加载作业或者执行任何HDFS操作,任务必须设置mapreduce.job.credentials.binary指向该令牌文件。

在作业提交过程中传递给JobTracker的HDFS授权令牌在作业完成后被JobTracker注销。除非mapreduce.job.complete.cancel.delegation.tokens在JobConf中被设置为false否则上述将是默认行为。对于那些任务反过来产生作业的作业,该值应该设置为false。在多个作业之间共享JobConf对象的应用程序应该将mapreduce.job.complete.cancel.delegation.tokens设置为false,这是因为JobConf中的认证信息将会被共享。所有的作业将会结束共享相同的令牌,因此在作业顺序完成之前令牌是不能被取消的。

相关内容