Hadoop学习之MapReduce(四)
Hadoop学习之MapReduce(四)
接下来是跟MapReduce目录结构有关的参数。首先看两个参数,分别为在core-default.xml中定义的hadoop.tmp.dir,其默认值为/tmp/hadoop-${user.name},另一个为定义在mapred-default.xml中的mapred.local.dir,该参数指定了保存MapReduce中间数据文件的目录,其默认值为${hadoop.tmp.dir}/mapred/local。在下面的学习中将会直接引用mapred.local.dir。TaskTracker拥有本地目录,目录${mapred.local.dir}/taskTracker/用于创建本地缓存和本地作业。可以定义多个本地目录(分布在多个硬盘上)并且每个文件名被半随机地分配到本地目录中。当作业启动时,TaskTracker创建与本地目录(该目录由配置参数指定)相关的本地作业目录。这样,TaskTracker目录结构就像下面描述的:
- ${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/work/:特定作业的共享目录,任务可以使用该空间作为临时空间并且在彼此间共享文件。该目录通过配置参数 job.local.dir对用户可见,可以通过JobConf.getJobLocalDir()访问,也可以作为系统属性访问,这样用户可以通过调用System.getProperty("job.local.dir")访问该目录。
- ${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/jars/:Jar文件目录,作业jar文件和扩展的jar文件保存在该目录下。Job.jar作为应用程序的jar文件自动得分布在每台机器上,在作业的任务启动之前该jar文件扩展到jar目录中。Job.jar的位置可以通过Job.getJar()访问。
- ${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/job.xml:Job.xml文件,通用的作业配置管理文件,作业的本地化文件。
- ${mapred.local.dir}/taskTracker/$user/jobcache/$jobid/$taskid:每次任务尝试的任务目录。每个任务目录又有下面的结构:
在上面提到了JVM重用,现在就来了解一下。通过执行作业的配置参数mapred.job.reuse.jvm.num.tasks启用任务的JVMs重用功能。如果该值为1(默认值),JVMs是不可以重用的(每个JVM运行一个任务),如果值为-1,一个JVM可以运行的任务数量是没有限制的(相同作业)。
下表中的参数在每个任务执行时在作业的配置管理中本地化:
参数名 |
类型 |
描述 |
mapred.job.id |
String |
作业ID |
mapred.jar |
String |
作业目录中job.jar的位置 |
job.local.dir |
String |
作业指定的共享临时空间 |
mapred.tip.id |
String |
任务ID |
mapred.task.id |
String |
任务的尝试ID |
mapred.task.is.map |
boolean |
是否是map任务 |
mapred.task.partition |
int |
在作业内为任务分配的ID |
map.input.file |
String |
Mapper读取数据的文件名 |
map.input.start |
long |
InputSplit起始位置的偏移 |
map.input.length |
long |
InputSplit的字节数。 |
mapred.work.output.dir |
String |
任务的临时输出目录 |
需要注意的是,在执行一个流(Streaming)作业时,“mapred”参数需要进行转换,点(.)变为了下划线(_)。比如,mapred.job.id变为了mapred_job_id,mapred.jar变为了mapred_jar。使用带下划线的参数名取得流作业中mapper/reducer任务的值。
任务的标准输出(stdout)和错误输出(stderr)被TaskTracker读取并被记录到${HADOOP_LOG_DIR}/userlogs,${HADOOP_LOG_DIR}的值可以在${HADOOP_HOME}\conf\hadoop-env.sh中指定,默认为$HADOOP_HOME/logs。
DistributedCache可以用来分布mapper和reducer任务使用的jar文件和本地库文件。子jvm总是将它的当前工作目录增加到java.library.path和LD_LIBRARY_PATH(Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。该路径>在默认路径之前查找)中,因此缓存的库文件可以通过System.loadLibrary 或者System.load加载。
至此,已经学完了MapReduce框架中与任务的执行和环境相关的知识,下面将会学习作业的提交、监控已经输入输出等内容。
评论暂时关闭