原本想祝你們節日快樂,哎,無奈浪尖還在寫文章。譴責一下,那些今天不學習的人。對於今天入星球的人,今天調低了一點價格。減小了20大洋。機不可失失再也不來。點擊閱讀原文或者掃底部二維碼。html
hive概述程序員
Hive爲Hadoop提供了一個SQL接口。 Hive能夠被認爲是一種編譯器,它將SQL(嚴格來講,Hive查詢語言 - HQL,SQL的一種變體)轉換爲一組Mapreduce / Tez / Spark做業。 所以,Hive很是有助於非程序員使用Hadoop基礎架構。 原來,Hive只有一個引擎,即MapReduce。 可是在最新版本中,Hive還支持Spark和Tez做爲執行引擎。 這使得Hive成爲探索性數據分析的絕佳工具。
apache
基於mapreduce的hive,整個架構圖以下:api
driver - 接收查詢的組件。 該組件實現了會話句柄的概念,並提供了在JDBC / ODBC接口上的執行和獲取數據的api模型。安全
編譯器 - 解析查詢的組件,對不一樣的查詢塊和查詢表達式進行語義分析,最終經過從metastore獲取表和分區的信息生成執行計劃。session
Metastore - 存儲倉庫中各類表和分區的全部結構信息的組件,包括列和列類型信息,讀取和寫入數據所需的序列化程序和反序列化程序以及存儲數據的相應HDFS文件。架構
執行引擎 - 執行編譯器建立的執行計劃的組件。 該計劃是一個stages的DAG。 執行引擎管理計劃的這些不一樣階段之間的依賴關係,並在適當的系統組件上執行這些階段。函數
什麼是hook工具
一般,Hook是一種在處理過程當中攔截事件,消息或函數調用的機制。 Hive hooks是綁定到了Hive內部的工做機制,無需從新編譯Hive。從這個意義上講,提供了使用hive擴展和集成外部功能的能力。換句話說,Hive hadoop可用於在查詢處理的各個步驟中運行/注入一些代碼。根據鉤子的類型,它能夠在查詢處理期間的不一樣點調用:oop
Pre-execution hooks-在執行引擎執行查詢以前,將調用Pre-execution hooks。請注意,這個目的是此時已經爲Hive準備了一個優化的查詢計劃。
Post-execution hooks -在查詢執行完成以後以及將結果返回給用戶以前,將調用Post-execution hooks?。
Failure-execution hooks -當查詢執行失敗時,將調用Failure-execution hooks?。
Pre-driver-run 和post-driver-run hooks-在driver執行查詢以前和以後調用Pre-driver-run 和post-driver-run hooks。
Pre-semantic-analyzer 和 Post-semantic-analyzer hooks-在Hive在查詢字符串上運行語義分析器以前和以後調用Pre-semantic-analyzer 和Post-semantic-analyzer hooks。
hive查詢的生命週期
hive查詢在hive中的執行過程。
Hive Hook API
Hive支持許多不一樣類型的Hook。 Hook接口是Hive中全部Hook的父接口。它是一個空接口,並經過如下特定hook的接口進行了擴展:
1. PreExecute和PostExecute將Hook接口擴展到Pre和Post執行hook。
2.?ExecuteWithHookContext擴展Hook接口以將HookContext傳遞給hook。HookContext包含了hook可使用的全部信息。 HookContext被傳遞給名稱中包含「WithContext」的全部鉤子。
3.?HiveDriverRunHook擴展了Hook接口,在driver階段運行,容許在Hive中自定義邏輯處理命令。
4.?HiveSemanticAnalyzerHook擴展了Hook接口,容許插入自定義邏輯以進行查詢的語義分析。它具備preAnalyze()和postAnalyze()方法,這些方法在Hive執行本身的語義分析以前和以後執行。
5.?HiveSessionHook擴展了Hook接口以提供會話級hook。在啓動新會話時調用hook。用hive.server2.session.hook配置它。
6.?Hive 1.1添加了Query Redactor Hooks。它是一個抽象類,它實現了Hook接口,能夠在將查詢放入job.xml以前刪除有關查詢的敏感信息。能夠經過設置hive.exec.query.redactor.hooks屬性來配置此hook。
栗子搞起
hive源碼中實現了一些hook,具體有如下幾個例子:
1.driverTestHook是一個很是簡單的HiveDriverRunHook,它打印你用於輸出的命令。
2.?PreExecutePrinter和PostExecutePrinter是pre 和 post hook的示例,它將參數打印到輸出。
3.?ATSHook是一個ExecuteWithHookContext,它將查詢和計劃信息推送到YARN timeline server。
4.?EnforceReadOnlyTables是一個ExecuteWithHookContext,用於阻止修改只讀表。
5.?LineageLogger是一個ExecuteWithHookContext,它將查詢的血統信息記錄到日誌文件中。 LineageInfo包含有關query血統的全部信息。
6.?PostExecOrcFileDump是一個post=Execution hook,用於打印ORC文件信息。
7. PostExecTezSummaryPrinter是一個post-execution hook,能夠打印Tez計數器的摘要。
8. UpdateInputAccessTimeHook是一個pre-execution hook,雅思報名費可在運行查詢以前更新全部輸入表的訪問時間。
栗子
下面寫一個簡單的?pre-execution hook,會在執行的時候輸出Hello from the hook !!。
1. 建立一個工程。
? ?4.0.0
? ?hive-hook-example
? ?Hive-hook-example
? ?1.0
2. 添加hive-exec依賴。
hook的主要依賴就是hive-exec包。
? ? ? ?
? ? ? ? ? ?org.apache.hive
? ? ? ? ? ?hive-exec
? ? ? ? ? ?1.1.0
? ? ? ?
? ?
3.建立一個實現類。
該類要繼承自
org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext
該接口只有一個方法。
;
咱們的實現僅僅是輸出一個字符串。
System.out.();
完整的例子以下:
org.apache.hadoop.hive.ql.hooks.ExecuteWithHookContext;
org.apache.hadoop.hive.ql.hooks.HookContext;
{
? ?{
? ? ? ?System.out.println();
? ?}
}
4. 打包使用
?打包
mvn
使用
the Hive terminal issue the commands. Note that you have
jar target/Hive-hook-example.jar;
hive.exec.pre.hooks=HiveExampleHook;
更多hivehook例子,請參考hive源碼,路徑:
/
後面,浪尖給出hive的hook在安全控制和metastore監控的hook案例。
[完]
推薦閱讀:
重要 | mr使用hcatalog讀寫hive表
必讀|spark的重分區及排序