简介

Driver 实现了 IDriver 接口,该接口用于表示 Hive 查询的驱动程序接口。Hive 的驱动程序负责接收用户输入的 HiveQL 查询,编译查询计划,并将计划提交给执行引擎执行。IDriver 接口定义了与 Hive 驱动程序相关的方法,允许用户与 Hive 交互,执行查询并获取执行结果。
它有两个实现类,分别是 Driver 和 ReExecDriver,后者实现了重执行的逻辑,具体执行还是由 Driver 类实现。
private Driver coreDriver;
ReExecDriver 源码如下,可以看到调用的确实是Driver.run()。

shouldReExecute 方法源码如下,简单来说只要有一个 plugin 的shouldReExecute方法返回真,则 shouldReExecute 方法的返回值为真。

如果不更改HIVE_QUERY_MAX_REEXECUTION_COUNT的值,那么ReExecDriver和Driver没有什么区别,因为HIVE_QUERY_MAX_REEXECUTION_COUNT默认1,且executionIndex的初始值也是1,所以会直接返回cpr。
Driver 类执行一条 HQL 的调用链如下:

Driver#runInternal 方法源码如下,分为执行(execute)和编译(compileInternal)两个部分。

Driver#execute() 源码如下:

每个 Task 的执行是由 TaskRunner 类触发,Driver#launchTask 的返回值就是一个 TaskRunner 对象。

TaskRunner#runSequential() 方法的源码如下,核心是调用每个 Task 对象的 executeTask 方法,executeTask 方法定义在 Task 超类中,其中会调用各个子类的 execute 方法,进而触发具体的逻辑处理。
