2021SC@SDUSC
概述
本次继续分析pig作为hadoop的轻量级脚本语言操作hadoop的executionengine包下的JobControlCompiler类的代码
JobControlCompiler类
这是一个编译器类,它采用MROperPlan并将其转换为维护相关依赖关系信息的JobControl对象。
JobControl 对象由Job(作业)组成,每个Job都有一个单独的JobConf(一个map/reduce作业配置)。
getStores方法
被用来返回之前编译的作业的所有存储位置
public List<POStore> getStores(Job job) {
Pair<List<POStore>, Path> pair = jobStoreMap.get(job);
if (pair != null && pair.first != null) {
return pair.first;
} else {
return new ArrayList<POStore>();
}
}
reset方法
用来重置状态
public void reset() {
jobStoreMap = new HashMap<Job, Pair<List<POStore>, Path>>();
jobMroMap = new HashMap<Job, MapReduceOper>();
UDFContext.getUDFContext().reset();
}
updateMROpPlan方法
使用作业的执行状态更新 Map-Reduce 计划,如果一个作业完全失败(该作业只有一个存储,并且该作业失败),则我们删除其所有依赖作业,此方法最终将返回从Map-Reduce计划中删除的MapReduceOper的数量。
public int updateMROpPlan(List<Job> completeFailedJobs)
{
int sizeBefore = plan.size();
for (Job job : completeFailedJobs)
{
MapReduceOper mrOper = jobMroMap.get(job);
plan.trimBelow(mrOper);
plan.remove(mrOper);
}//用来删除所有的后续作业
for (Job job : jobMroMap.keySet())
{
if (!completeFailedJobs.contains(job))
{
MapReduceOper mro = jobMroMap.get(job);
if (!pigContext.inIllustrator && mro.isCounterOperation())
saveCounters(job,mro.getOperationID(), mro.isRowNumber());
plan.remove(mro);
}
}//从jobMroMap中删除成功的作业
jobMroMap.clear();
int sizeAfter = plan.size();
return sizeBefore-sizeAfter;
}