Hive源码阅读--作业的执行--processCmd

在processCmd方法中,主要流程有:

  • 去除命令中的注释;
  • 如果命令是quitexit,则退出;
  • 如果命令是source开头,则校验source命令后面的文件是否存在,存在则执行processFile
  • 如果命令是以感叹号!开头,表明是shell命令,这时候直接调用shell命令执行器执行;
  • 如果以上都不是,则说明是本地模式。然后获得命令处理器,并调用processLocalCmd执行命令。

这里说出了processCmd向后的两个方向,第一个方向是processFile,用于执行文件,第二个方向是processLocalCmd,用于执行命令。

   public int processCmd(String cmd) {
   		// CliSessionState 对象不再赘述
        CliSessionState ss = (CliSessionState)SessionState.get();
        ss.setLastCommand(cmd);
        ss.updateThreadName();
        // 刷新打印流,防止上个命令输出
        ss.err.flush();
        String cmd_trimmed = cmd.trim();
        // tokenizeCmd将用户输入的指令从空格,制表符等出断开,得到token数组
        String[] tokens = this.tokenizeCmd(cmd_trimmed);
        int ret = 0;
        // 如果命令是`quit`或`exit`,则退出
        if (!cmd_trimmed.toLowerCase().equals("quit") && !cmd_trimmed.toLowerCase().equals("exit")) {
            String shell_cmd;
            // 如果命令是`source`开头,则校验`source`命令后面的文件是否存在,存在则执行`processFile`
            if (tokens[0].equalsIgnoreCase("source")) {
                shell_cmd = this.getFirstCmd(cmd_trimmed, tokens[0].length());
                shell_cmd = (new VariableSubstitution(new HiveVariableSource() {
                    public Map<String, String> getHiveVariable() {
                        return SessionState.get().getHiveVariables();
                    }
                })).substitute(ss.getConf(), shell_cmd);
                File sourceFile = new File(shell_cmd);
                // 如果source后跟的参数不是文件,就报错
                if (!sourceFile.isFile()) {
                    this.console.printError("File: " + shell_cmd + " is not a file.");
                    ret = 1;
                } else {
                    try {
                    	// 不管再多操作,只要他是文件,最后也是交给processFile去执行
                        ret = this.processFile(shell_cmd);
                    } catch (IOException var11) {
                    	// 处理失败了会输出报错的原因
                        this.console.printError("Failed processing file " + shell_cmd + " " + var11.getLocalizedMessage(), StringUtils.stringifyException(var11));
                        ret = 1;
                    }
                }
            // 如果命令是以感叹号!开头,表明是`shell`命令,这时候直接调用`shell`命令执行器执行
            } else if (cmd_trimmed.startsWith("!")) {
                shell_cmd = cmd_trimmed.substring(1);
                shell_cmd = (new VariableSubstitution(new HiveVariableSource() {
                    public Map<String, String> getHiveVariable() {
                        return SessionState.get().getHiveVariables();
                    }
                })).substitute(ss.getConf(), shell_cmd);

                try {
                    ShellCmdExecutor executor = new ShellCmdExecutor(shell_cmd, ss.out, ss.err);
                    ret = executor.execute();
                    if (ret != 0) {
                        this.console.printError("Command failed with exit code = " + ret);
                    }
                } catch (Exception var10) {
                    this.console.printError("Exception raised from Shell command " + var10.getLocalizedMessage(), StringUtils.stringifyException(var10));
                    ret = 1;
                }
            } else {
                try {
                    CommandProcessor proc = CommandProcessorFactory.get(tokens, (HiveConf)this.conf);
                    // 去除上面各种类型,其他sql的主要执行方法为processLocalCmd
                    ret = this.processLocalCmd(cmd, proc, ss);
                } catch (SQLException var9) {
                    this.console.printError("Failed processing command " + tokens[0] + " " + var9.getLocalizedMessage(), StringUtils.stringifyException(var9));
                    ret = 1;
                }
            }
        } else {
            ss.close();
            System.exit(0);
        }

        ss.resetThreadName();
        // 如果最后返回的ret为1,那么就表示执行失败。
        return ret;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寒 暄

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

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

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

打赏作者

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

抵扣说明:

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

余额充值