简介
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
方法,进而触发具体的逻辑处理。