Hive鮮為人知的寶石-Hooks


 

640?wx_fmt=png

本來想祝大家節日快樂,哎,無奈浪尖還在寫文章。譴責一下,那些今天不學習的人。對於今天入星球的人,今天調低了一點價格。減少了20大洋。機不可失失不再來點擊閱讀原文或者掃底部二維碼。

640?wx_fmt=png

 

640?wx_fmt=pnghive概述

Hive為Hadoop提供了一個SQL接口。 Hive可以被認為是一種編譯器,它將SQL(嚴格來說,Hive查詢語言 - HQL,SQL的一種變體)轉換為一組Mapreduce / Tez / Spark作業。 因此,Hive非常有助於非程序員使用Hadoop基礎架構。 原來,Hive只有一個引擎,即MapReduce。 但是在最新版本中,Hive還支持Spark和Tez作為執行引擎。 這使得Hive成為探索性數據分析的絕佳工具。

基於mapreduce的hive,整個架構圖如下:

640?wx_fmt=png

driver - 接收查詢的組件。 該組件實現了會話句柄的概念,並提供了在JDBC / ODBC接口上的執行和獲取數據的api模型。

編譯器 - 解析查詢的組件,對不同的查詢塊和查詢表達式進行語義分析,最終通過從metastore獲取表和分區的信息生成執行計划。

Metastore - 存儲倉庫中各種表和分區的所有結構信息的組件,包括列和列類型信息,讀取和寫入數據所需的序列化程序和反序列化程序以及存儲數據的相應HDFS文件。

執行引擎 - 執行編譯器創建的執行計划的組件。 該計划是一個stages的DAG。 執行引擎管理計划的這些不同階段之間的依賴關系,並在適當的系統組件上執行這些階段。

640?wx_fmt=png什么是hook

通常,Hook是一種在處理過程中攔截事件,消息或函數調用的機制。 Hive hooks是綁定到了Hive內部的工作機制,無需重新編譯Hive。從這個意義上講,提供了使用hive擴展和集成外部功能的能力。換句話說,Hive hadoop可用於在查詢處理的各個步驟中運行/注入一些代碼。根據鈎子的類型,它可以在查詢處理期間的不同點調用:

 

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。

 

640?wx_fmt=pnghive查詢的生命周期

hive查詢在hive中的執行過程。

640?wx_fmt=pngHive 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。

640?wx_fmt=png栗子搞起

 

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,雅思報名費可在運行查詢之前更新所有輸入表的訪問時間。

 

640?wx_fmt=png栗子

下面寫一個簡單的?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的重分區及排序

640?wx_fmt=jpeg


文章來源:https://blog.csdn.net/rlnLo2pNEfx9c/article/details/81844217


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM