1. 程式人生 > >詳解Hive-Driver——細讀Hive原始碼(四)

詳解Hive-Driver——細讀Hive原始碼(四)

接著上一篇來說執行入口的分析,CliDriver最終將使用者指令cmd提交給了Driver的run方法(針對常用查詢語句而言),在這裡使用者的cmd將會被編譯,優化並生成MapReduce任務進行執行。
這裡寫圖片描述
所以Driver也是Hive的核心,他扮演了一個將使用者查詢和MapReduce Task轉換並執行的角色,下來我們就來看看Driver是如何實現的?

  1. run函式:
 public CommandProcessorResponse run(String command, boolean alreadyCompiled)
        throws CommandNeedRetryException {
    CommandProcessorResponse cpr = runInternal(command, alreadyCompiled);
    if
(cpr.getResponseCode() == 0) { return cpr; } SessionState ss = SessionState.get(); if(ss == null) { return cpr; } . . .

run函式通過呼叫runInternal方法處理使用者指令,在處理完成runInternal之後,如果執行過程中出現出錯,還附加了對錯誤碼和錯誤資訊的處理,省略的部分就是錯誤的處理
在run函式中呼叫了runInternal,這也就是run函式的核心內容
2. 既然runInternal是核心內容,後面我們將逐步分析此函式
(1)
這裡寫圖片描述


在這裡先做了一個檢測,確認在配置檔案中HIVE_HADOOP_SUPPORTS_SUBDIRECTORIES等等的屬性無誤,否則報錯。

這裡寫圖片描述

這個就是return的值中實現的內容,返回了一個類,並在返回的過程中給類中的一些變數賦值。

(2)

 HiveDriverRunHookContext hookContext = new HiveDriverRunHookContextImpl(conf, command);
    // Get all the driver run hooks and pre-execute them.
    List<HiveDriverRunHook> driverRunHooks;
try { driverRunHooks = getHooks(HiveConf.ConfVars.HIVE_DRIVER_RUN_HOOKS, HiveDriverRunHook.class); for (HiveDriverRunHook driverRunHook : driverRunHooks) { driverRunHook.preDriverRun(hookContext); } } catch (Exception e) { errorMessage = "FAILED: Hive Internal Error: " + Utilities.getNameMessage(e); SQLState = ErrorMsg.findSQLState(e.getMessage()); downstreamError = e; console.printError(errorMessage + "\n" + org.apache.hadoop.util.StringUtils.stringifyException(e)); return createProcessorResponse(12); }

首先根據配置檔案和指令,構造使用者Hook執行的上下文hookContext,然後讀取使用者PreRunHook配置指定的類(字串),此配置項對應於Hive配置檔案當中的“hive.exec.driver.run.hooks”一項,利用反射機制Class.forName例項化PreRunHook類例項(getHook函式完成),依次執行各鉤子的功能(preDriverRun 函式完成)。
——-待完善

(3)
這裡寫圖片描述

直接呼叫complieInternal函式編譯使用者指令,將指令翻譯成MapReduce任務。在這裡要解釋一下 :synchronized (compileMonitor)是為了compileMonitor加上了同步鎖,並且這個compileMonitor還僅為可讀的。——-這裡Monitor是一個空的物件,加上了同步鎖,能起到什麼樣的作用呢?