- 由上文可知,客户端的驱动工作是在executeDriver中进行的
调用该方法时传入了三个参数:
1.1 ss hiveconf用户配置
1.2 conf hiveconf默认配置
1.3 oproc 用户环境配置

- ctrl+左键进入该方法中
2.1 首先根据前面解析出来的参数,将对应的参数值封装到CliDriver对象中
2.2 如果是-e的执行方式,则直接执行后面的sql语句;如果是-h的执行方式,则执行对应的sql脚本文件
2.3 如果执行引擎是mapreduce的话,则输出一些告警信息(hive3.X版本不建议使用mr程序而发出的警告),当前版本的hive支持mr、tez、spark三种引擎
2.4 解析出对应的sql语句(按分号分割出不同语句先后执行,同时忽略了注释)
2.5 每次解析出一条完整的语句时,开始进入processline方法中进行执行

private int executeDriver(CliSessionState ss, HiveConf conf, OptionsProcessor oproc)
throws Exception {
CliDriver cli = new CliDriver();
cli.setHiveVariables(oproc.getHiveVariables());
cli.processSelectDatabase(ss);
cli.processInitFiles(ss);
if (ss.execString != null) {
int cmdProcessStatus = cli.processLine(ss.execString);
return cmdProcessStatus;
}
try {
if (ss.fileName != null) {
return cli.processFile(ss.fileName);
}
} catch (FileNotFoundException e) {
System.err.println("Could not open input file for reading. (" + e.getMessage() + ")");
return 3;
}
if ("mr".equals(HiveConf.getVar(conf, ConfVars.HIVE_EXECUTION_ENGINE))) {
console.printInfo(HiveConf.generateMrDeprecationWarning());
}
setupConsoleReader();
String line;
int ret = 0;
String prefix = "";
String curDB = getFormattedDb(conf, ss);
String curPrompt = prompt + curDB;
String dbSpaces = spacesForString(curDB);
while ((line = reader.readLine(curPrompt + "> ")) != null) {
if (!prefix.equals("")) {
prefix += '\n';
}
if (line.trim().startsWith("--")) {
continue;
}
if (line.trim().endsWith(";") && !line.trim().endsWith("\\;")) {
line = prefix + line;
ret = cli.processLine(line, true);
prefix = "";
curDB = getFormattedDb(conf, ss);
curPrompt = prompt + curDB;
dbSpaces = dbSpaces.length() == curDB.length() ? dbSpaces : spacesForString(curDB);
} else {
prefix = prefix + line;
curPrompt = prompt2 + dbSpaces;
continue;
}
}
return ret;
}