Hadoop 2.0提供了跟1.0类似的作业日志收集组件,从一定程度上可认为直接重用了1.0的代码模块,考虑到YARN已经变为通用资源管理平台,因此,提供一个通用的日志收集模块势在必行,由于目前通用日志收集模块正在开发中(可参考“YARN-321”),本文仅介绍MRv2(MapReduce On YARN)自带的日志收集模块,包括工作原理以及配置方法。
在Hadoop 2.0中,每个作业日志包含两部分,作业运行日志和任务运行日志,作业运行由MRAppMaster(MapReduce 作业的ApplicationMaster)产生,详细记录了作业启动时间、运行时间,每个任务启动时间、运行时间、Counter值等信息,与 Hadoop 1.0中的JobHistory日志是基本一致。MapReduce作业的ApplicationMaster也运行在Container中,且是编号为 000001的Container,比如container_1385051297072_0001_01_000001,它自身可认为是一个特殊的task,因此,也有自己的运行日志,该日志与Map Task和Reduce Task类似,但并不是前面介绍的“作业运行日志”。
ApplicationMaster产生的作业运行日志举例如下,日志采用apache avro(作为日志存储格式是Hadoop 2.0唯一使用到Avro的地方)工具,以json的格式保存:
- {“type”:”JOB_SUBMITTED”,”event”:{“org.apache.hadoop.mapreduce.jobhistory.JobSubmitted”:
- {“jobid”:”job_1385051297072_0002″,”jobName”:”QuasiMonteCarlo”,”userName”:”yarn”, “submitTime”:1385393834983,”jobConfPath”:
- “hdfs://hadoop-test/tmp/hadoop-yarn/staging/yarn/.staging/job_1385051297072_0002/job.xml”,”acls”:
- {},”jobQueueName”:”default”,”workflowId”:”",”workflowName”:”",”workflowNodeName”:”",
- “workflowAdjacencies”:”",”workflowTags”:”"}}}
- {“type”:”JOB_INITED”,”event”:{“org.apache.hadoop.mapreduce.jobhistory.JobInited”:
- {“jobid”:”job_1385051297072_0002″,”launchTime”:1385393974505,”totalMaps”:8,
- “totalReduces”:1,”jobStatus”:”INITED”,”uberized”:false}}}
- {“type”:”JOB_INFO_CHANGED”,”event”:{“org.apache.hadoop.mapreduce.jobhistory.JobInfoChange”:
- {“jobid”:”job_1385051297072_0002″,”submitTime”:1385393834983,”launchTime”:1385393974505}}}
作业运行日志产生过程如下:
步骤1:ResourceManager启动作业的 ApplicationMaster,ApplicationMaster运行过程中,将日志写 到${yarn.app.mapreduce.am.staging-dir}/yarn/.staging/job_XXXXX_XXX/下,其中参数 yarn.app.mapreduce.am.staging-dir 的默认值是/tmp/hadoop-yarn/staging,该目录下将存在3个文件,分别是以“.jhist”、“.summary”和“.xml” 结尾的文件,分别表示作业运行日志、作业概要信息和作业配置属性,其中,作业概要信息只有一句话,举例如下:
|
步骤2:所有任务运行完成后,意味着,该作业运行完成,此时ApplicationMaster将三个文件拷贝 到${ mapreduce.jobhistory.intermediate-done-dir}/${username}目录下,拷贝后的文件名后面添 加”_tmp”,其中mapreduce.jobhistory.intermediate-done-dir默认值 是${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate
步骤3:ApplicationMaster将拷贝完成的三个文件重新命名成“.jhist”、“.summary”和“.xml”结尾的文件(去掉“_tmp”)
步骤4:周期性扫描线程定期将done_intermediate的日志文件转移到done目录(通过参数 mapreduce.jobhistory.done-dir配置,默认值为${yarn.app.mapreduce.am.staging- dir}/history/done)下,同时删除“.summary”文件(该文件中的信息,.jhist文件中都有)。
步骤5:ApplicationMaster移除
${yarn.app.mapreduce.am.staging-dir}/yarn/.staging/job_XXXXX_XXX/目录
默认情况下,任务运行日志产只会存放在各NodeManager的本地磁盘上,你可以打开日志聚集功能,以便让任务将运行日志推送到HDFS上,以便集中管理和分析。
默认情况下,NodeManager将日志保存到yarn.nodemanager.log-dirs下,,该属性缺省值 为${yarn.log.dir}/userlogs,也就是Hadoop安装目录下的logs/userlogs目录中,通常为了分摊磁盘负载,我们会 为该参数设置多个路径,此外,需要注意的是,ApplicationMaster的自身的日志也存放在该路目下,因为它也运行在Container之中, 是一个特殊的task。举例如下,其中,最后一个是某个作业的ApplicationMaster日志(编号是000001)。
|
将作业和任务日志存放在各个节点上不便于统一管理和分析,为此,我们可以启用日志聚集功能。打开该功能后,各个任务运行完成后,会将生成的日志推送 到HDFS的一个目录下(之前的并不会立即删除,在HDFS上,每个任务产生的三个文件,即syslog、stderr和stdout将合并一个文件,并 通过索引记录各自位置),配置方法可参考下一篇文章:“日志聚集相关配置参数”。
接下来,讲一下MapReduce的JobHistory Server,这是一个独立的服务,可通过web UI展示历史作业日志,之所以将其独立出来,是为了减轻ResourceManager负担。通常可以启动在一台独立的机器上,你需在mapred- site.xml中对其进行配置,并使用“sbin/mr-jobhistory-daemon.sh start jobhistoryserver”命令启动它。JobHistory Server将会分析作业运行日志,并展示作业的启动时间、结束时间、各个任务的运行时间,各种Counter数据等,并产生一个指向作业和任务日志的链 接。
最后,介绍一下mapred-site.xml和yarn-site.xml这两个配置文件的作用。Yarn- site.xml是YARN相关的配置文件,客户端、ResourceManager和NodeManager需要改配置文件,为了简单,可让这三类节点 上的该文件是一致的。Mapred-site.xml是MapReduce特有的配置文件,在YARN中,mapreduce已经变成了一个客户端编程 库,因此只有客户端和jobhistory server需要该配置文件,其他节点,比如resourceManager和NodeManager不需要,除非你们也把这些节点作为客户端提供给用户 使用,另外,一定要让客户端和jobhistory server上的mapres-site.xml一致。
原文链接:http://dongxicheng.org/mapreduce-nextgen/hadoop-2-0-jobhistory-log/