processLine可以理解为作业上了一道保险,确保如果因为特殊情况需要中止作业的话有结束的方法。
同时将每一条语句提交给processCmd
执行并接受返回值。相当于为作业正式执行做铺垫的类。
public int processLine(String line, boolean allowInterrupting) {
SignalHandler oldSignal = null;
Signal interruptSignal = null;
// 1.默认传入的allowInterrupting为true
// 若allowInterrupting为true,表示作业可以中断
// 若allowInterrupting为false,表示作业不可以中断
if (allowInterrupting) {
// 定义接收到的信号 (可以用Ctrl+c ,和kill -2两种方式触发信号 )
interruptSignal = new Signal("INT");
oldSignal = Signal.handle(interruptSignal, new SignalHandler() {
private boolean interruptRequested;
public void handle(Signal signal) {
boolean initialRequest = !this.interruptRequested;
this.interruptRequested = true;
// 当连续两次触发 Ctrl+c 作业中断
if (!initialRequest) {
CliDriver.this.console.printInfo("Exiting the JVM");
System.exit(127);
}
// 作业中断返回的语句
CliDriver.this.console.printInfo("Interrupting... Be patient, this might take some time.");
CliDriver.this.console.printInfo("Press Ctrl+C again to kill JVM");
// 杀死所有正在运行的任务,HadoopJobExecHelper 这个类中保存了正在运行的hadoop job ,
// 任务会在这个类的progress()方法中循环获取执行进度,并且保存了所有这个jvm 中执行的任务。
HadoopJobExecHelper.killRunningJobs();
TezJobExecHelper.killRunningJobs();
HiveInterruptUtils.interrupt();
}
});
}
int var17;
try {
int lastRet = 0;
int ret = false;
List<String> commands = splitSemiColon(line);
String command = "";
Iterator var9 = commands.iterator();
while(var9.hasNext()) {
String oneCmd = (String)var9.next();
if (org.apache.commons.lang.StringUtils.endsWith(oneCmd, "\\")) {
command = command + org.apache.commons.lang.StringUtils.chop(oneCmd) + ";";
} else {
command = command + oneCmd;
if (!org.apache.commons.lang.StringUtils.isBlank(command)) {
// 真正执行命令的类,根据命令不同做出不同对应
// 包括对退出,执行sql文件,执行linux命令,和sql等命令处理
int ret = this.processCmd(command);
command = "";
lastRet = ret;
boolean ignoreErrors = HiveConf.getBoolVar(this.conf, ConfVars.CLIIGNOREERRORS);
if (ret != 0 && !ignoreErrors) {
CommandProcessorFactory.clean((HiveConf)this.conf);
int var12 = ret;
return var12;
}
}
}
}
CommandProcessorFactory.clean((HiveConf)this.conf);
var17 = lastRet;
} finally {
// 处理完行之后,恢复旧的处理程序
if (oldSignal != null && interruptSignal != null) {
Signal.handle(interruptSignal, oldSignal);
}
}
return var17;
}