原创文章,转载请注明: 转载自工学1号馆
本文主要剖析Hadoop作业提交系列的作业文件上传过程,后面将陆续介绍生成Split文件和作业的提交
JobClient将作业提交到JobTracker端之前,需要进行一些初始化工作,包括:获取作业ID,创建HDFS目录,上传作业文件以及生成Split文件等,这些工作由函数JobClient.submitJobInternal(job)实现。
MapReduce作业文件的上传和下载是由DistributedCache工具完成的,整个工作流程对用户而言是透明的,用户只需在提交作业时指定文件位置
通常而言,一个典型的java MapReduce作业,可能包含以下资源:
程序jar包:用户用java编写的MapReduce应用程序jar包
作业配置文件:描述MapReduce应用程序的配置信息(根据JobConf对象生成的xml文件))
依赖第三方jar包:应用程序依赖的第三方jar包,提交作业的时候用参数“-libjars”指定
依赖的归档文件:应用程序中用到多个文件,可以直接打包成归档文件(通常是一些压缩文件),提交作业的时候用参数“-archives”指定
依赖的普通文件:应用程序中可能用到普通文件,比如文本格式的字典文件,提交作业的时候用参数“-files”指定
应用程序依赖的文件可以放在本地,也可以放在HDFS上,默认放在本地。
上述多有的文件都在JobClient端被提交到HDFS上,涉及的父目录如下表:
作业属性 | 属性值 | 说明 |
mapreduce.jobtracker.staging.root.dir | ${hadoop.tmp.dir}/mapred/staging | HDFS上作业文件的上传目录,由管理员配置 |
mapreduce.job.dir | ${mapreduce.jobtracker.staging.root.dir}/
${user}/.staging/${jobId} |
用户${user}的作业${jobId}相关文件存放目录 |
文件上传完毕后,会将这些目录信息保存到作业配置对象JobConf中,其对应的作业属性如下表所示:
作业属性 | 说明 |
mapred.cache.files | 作业依赖的普通文件在HDFS上的存放路径 |
mapred.job.classpath.archives | 作业依赖的jar包在HDFS上的存放路径 |
mapred.cache.archives | 作业依赖的压缩文件在HDFS上的存放路径 |
mapreduce.job.cache.files.visibilities | 作业依赖的普通文件的可见性。如果是public可见性,则为true,否则为false |
mapreduce.job.cache.archives.visibilities | 作业依赖的归档文件的可见性。如果是public级别的可见性,则为true,否则为false |
mapred.cache.files.timestamps | 作业依赖的普通文件的最后一次修改时间的时间戳 |
mapred.cache.archives.timestamps | 作业依赖的压缩文件的最后一次修改时间的时间戳 |
mapred.cache.files.filesizes | 作业依赖的普通文件的大小 |
mapred.cache.archives.filesizes | 作业依赖的归档文件的大小 |
mapred.jar | 用户应用程序jar路径 |
作业文件上传到HDFS后,可能会有大量节点同时从HDFS上下载这些文件,进而产生文件访问热点现象,造成性能瓶颈。为此,JobClient上传这些文件时会调高它们的副本数(由参数mapred.submit.replication指定,默认是10)以通过分摊负载方式避免产生访问热点。
Comments