【Hadoop】jobhistory 作業(yè)緩存源碼詳解
jobhistory 作業(yè)緩存
jobhistory 一般會(huì )保存一部分作業(yè)信息到內存中,查詢(xún)作業(yè)信息的時(shí)候一般會(huì )從內存查詢(xún),如果內存查詢(xún)不到就會(huì )從磁盤(pán)上掃描。
jobhistory 緩存一般分為兩層,第一層是guava緩存,默認情況下guava的緩存個(gè)數是5,可以通過(guò)配置項mapreduce.jobhistory.loadedjobs.cache.size
控制。
當guava的一級緩存中不存在的時(shí)候,默認是需要重新加載的,jobhistory中定義了加載規則,定義代碼如下:
CacheLoader<JobId, Job> loader;
loader = new CacheLoader<JobId, Job>() {
@Override
public Job load(JobId key) throws Exception {
return loadJob(key);
}
};
其中loadJob實(shí)現如下,其中hsManager為加載具體實(shí)現,
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的大小可以通過(guò)配置項mapreduce.jobhistory.joblist.cache.size
控制。
默認可以保存20000個(gè)。當然緩存超時(shí)指定時(shí)間可會(huì )被清理,具體可以有配置項mapreduce.jobhistory.max-age-ms
控制,默認為1周。
查找的順序為:
- 優(yōu)先從內存查找(二級緩存),為jobListCache。
- 如果緩存找不見(jiàn),優(yōu)先掃描剛完成的作業(yè)所在的目錄,會(huì )刷新jobListCache緩存,由配置項mapreduce.jobhistory.intermediate-done-dir控制。
- 如果還是找不見(jiàn),從已經(jīng)完成的作業(yè)的目錄掃描,具體目錄由配置項mapreduce.jobhistory.done-dir控制。
public HistoryFileInfo getFileInfo(JobId jobId) throws IOException {
// 優(yōu)先從內存查找(二級緩存)
HistoryFileInfo fileInfo = jobListCache.get(jobId);
if (fileInfo != null) {
return fileInfo;
}
// 如果緩存找不見(jiàn),優(yōu)先掃描剛完成的作業(yè)所在的目錄,由配置項mapreduce.jobhistory.intermediate-done-dir控制
scanIntermediateDirectory();
fileInfo = jobListCache.get(jobId);
if (fileInfo != null) {
return fileInfo;
}
// 如果還是找不見(jiàn),從已經(jīng)完成的作業(yè)的目錄掃描,具體目錄由配置項mapreduce.jobhistory.done-dir控制
fileInfo = scanOldDirsForJob(jobId);
if (fileInfo != null) {
return fileInfo;
}
return null;
}

0 評論