jobhistory 作业缓存
jobhistory 一般会保存一部分作业信息到内存中,查询作业信息的时候一般会从内存查询,如果内存查询不到就会从磁盘上扫描。
jobhistory 缓存一般分为两层,第一层是 guava 缓存,默认情况下 guava 的缓存个数是 5,可以通过配置项 mapreduce.jobhistory.loadedjobs.cache.size
控制。
当 guava 的一级缓存中不存在的时候,默认是需要重新加载的,jobhistory 中定义了加载规则,定义代码如下:
CacheLoader<JobId, Job> loader;
loader = new CacheLoader<JobId, Job>() {
@Override
public Job load(JobId key) throws Exception {
return loadJob(key);
}
};
其中 loadJob 实现如下,其中 hsManager 为加载具体实现,
private Job loadJob(JobId jobId) throws RuntimeException, IOException {
if (LOG.isDebugEnabled()) {
LOG.debug("Looking for Job " + jobId);
}
HistoryFileInfo fileInfo;
fileInfo = hsManager.getFileInfo(jobId);
if (fileInfo == null) {
throw new HSFileRuntimeException("Unable to find job " + jobId);
}
fileInfo.waitUntilMoved();
if (fileInfo.isDeleted()) {
throw new HSFileRuntimeException("Cannot load deleted job " + jobId);
} else {
return fileInfo.loadJob();
}
}
hsManager 中定义了 jobhistory 的二级缓存:jobListCache,jobListCache 的大小可以通过配置项 mapreduce.jobhistory.joblist.cache.size
控制。
默认可以保存 20000 个。当然缓存超时指定时间可会被清理,具体可以有配置项 mapreduce.jobhistory.max-age-ms
控制,默认为 1 周。
查找的顺序为:
- 优先从内存查找(二级缓存),为 jobListCache。
- 如果缓存找不见,优先扫描刚完成的作业所在的目录,会刷新 jobListCache 缓存,由配置项 mapreduce.jobhistory.intermediate-done-dir 控制。
- 如果还是找不见,从已经完成的作业的目录扫描,具体目录由配置项 mapreduce.jobhistory.done-dir 控制。
public HistoryFileInfo getFileInfo(JobId jobId) throws IOException {
// 优先从内存查找(二级缓存)
HistoryFileInfo fileInfo = jobListCache.get(jobId);
if (fileInfo != null) {
return fileInfo;
}
// 如果缓存找不见,优先扫描刚完成的作业所在的目录,由配置项mapreduce.jobhistory.intermediate-done-dir控制
scanIntermediateDirectory();
fileInfo = jobListCache.get(jobId);
if (fileInfo != null) {
return fileInfo;
}
// 如果还是找不见,从已经完成的作业的目录扫描,具体目录由配置项mapreduce.jobhistory.done-dir控制
fileInfo = scanOldDirsForJob(jobId);
if (fileInfo != null) {
return fileInfo;
}
return null;
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于