HistoryServer的原理详解
本文介绍了YARN中historyServer的原理和配置
HistoryServer的原理简介
下图展示了historyServer的数据流向图.
解释:
1. NodeManager在启动的时候会初始化LogAggregationService服务, 该服务会在把本机执行的container log (在container结束的时候)收集并存放到hdfs指定的目录下.
2. ApplicationMaster会把jobhistory信息写到hdfs的jobhistory临时目录下, 并在结束的时候把jobhisoty移动到最终目录, 这样就同时支持了job的recovery.
3. History会启动web和RPC服务, 用户可以通过网页或RPC方式获取作业的信息.
historyServer配置
NodeManager和HistoryServerd的配置
1. NodeManager需要启动LogAggregationService服务, 配置有:
mapred.job.history.server.embedded = true //默认为false, 需要配置true
yarn.nodemanager.remote-app-log-dir //tasklog要上传目的目录(hdfs目录), 默认为/logs
yarn.nodemanager.remote-app-log-dir-suffix // 子目录名字, 默认为logs
2. HistoryServer需要配置: yarn-site.xml
<property>
<name>mapred.job.history.server.embedded</name>
<value>true</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>historyserver:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value> historyserver:50060</value>
</property>
<property>
<name>mapreduce.jobhistory.intermediate-done-dir</name>
<value>/mr-history/tmp</value>
</property>
<property>
<name>mapreduce.jobhistory.done-dir</name>
<value>/mr-history/done</value>
</property>
mapred.job.history.server.embedded
mapreduce.jobhistory.address
mapreduce.jobhistory.webapp.address
mapreduce.jobhistory.intermediate-done-dir
mapreduce.jobhistory.done-dir
yarn.nodemanager.remote-app-log-dir
yarn.nodemanager.remote-app-log-dir-suffix
启动historyserver的方法:
sbin/mr-jobhistory-daemon.sh start historyserver
日志目录结构:
1. Jobhistory的日志目录: /mr-history/done/2012/12/13/000000/…
a) 在ApplicationMaster启动的时候创建.
b) 作业结束的时候jobhistoryserver 把jobhistory从tmp移动到done目录
c) 由historyServer负责删除, (配置 mapreduce.jobhistory.max-age-ms 默认一星期)
2. Tasklog的目录: logs/yuling.sh/logs/application_...
a) 在container结束的时候, 由NodeManager的服务LogAggregationService上传.
b) Tasklog由historyServer负责删除(需要配置yarn.log-aggregation.retain-seconds, 保留的时间, 设置为-1时不删除)
代码解析
代码主要在: org.apache.hadoop.mapreduce.v2.hs
1. CachedHistoryStorage, Manages an in memory cache of parsed Job History files. 管理缓存在内存中的jobhistory文件.
配置: mapreduce.jobhistory.loadedjobs.cache.size = 5
实现: 使用Collections. synchronizedMap (new LinkedHashMap<jobid, Job>{}), 同步的map存储, LinkedHashMap中,如果容量超过loadedJobCacheSize, 则会被自动删除.
功能: 提供获取job history的方法.
2. CompletedJob, Loads the basic job level data upfront. Data from job history file is loaded lazily. 维护一个结束的作业的状态信息(通过解析history得到), 提供获取job信息的方法. 包括该作业的所有的map/reduce task对象.
3. CompletedTask, 继承于Task类, 维护一个task的状态信息, 对外提供获取task信息的方法. 包括一个task的所有attempt.
4. CompletedTaskAttempt, 维护一个attempt的信息, 对外提供获取attempt信息的方法.
5. HistoryClientService, 为客户端提供RPC和web的服务, 其内部类MRClientProtocolHandler实现了MRClientProtocol协议.
配置: mapreduce.jobhistory.webapp.address, mapreduce.jobhistory.address
6. 接口HistoryContext, 提供getAllJobs和getPartialJobs两个方法.
7. HistoryFileManager, 维护jobhisotry文件的类, 负责创建history的tmp目录和done目录的创建, 提供getFileInfo方法, 给定一个jobId, 返回该作业的HistoryFileInfo对象. 如果job不在内存中, 则需要scanIntermediateDirectory, 如果还没, 则scanOldDirsForJob. 即扫描目录.
配置: mapreduce.jobhistory.max-age-ms = 7 * 24 * 60 * 60 * 1000L; //1 week
mapreduce.jobhistory.joblist.cache.size = 20000 //内存中缓存的historyfile文件信息(主要是job对应的 文件目录,)
mapreduce.jobhistory.datestring.cache.size = 200000 // Size of the date string cache. Effects the number of directories which will be scanned to find a job
mapreduce.jobhistory.move.thread-count=3 // The number of threads used to move files
8. 接口HistoryStorage, 实现类为HistoryStorage
9. JHSDelegationTokenSecretManager, 安全相关
10. JobHistory, Loads and manages the Job history cache. 维护着HistoryStorage和HistoryFileManager, 对外提供同一接口, 获取作业信息. 清理jobhistory
11. JobHistoryServer, jobhistory server的主方法, 负责启动服务.
12. PartialJob, 类似于CompletedJob. 不完整的作业信息
问题: 如果hdfs很慢, 那么网页显示也会很慢, 是否可以另外启动一个hdfs专门存储log数据.