Hive源码阅读--作业的准备--processLine

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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒 暄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值