Hive作為SQL on Hadoop最穩(wěn)定、應(yīng)用最廣泛的查詢引擎被大家所熟知。但是由于基于MapReduce,查詢執(zhí)行速度太慢而逐步引入其他的近實(shí)時(shí)查詢引擎如Presto等。值得關(guān)注的是Hive目前支持MapReduce、Tez和Spark三種執(zhí)行引擎,同時(shí)Hive3也會(huì)支持聯(lián)邦數(shù)據(jù)查詢的功能。所以Hive還是有很大進(jìn)步的空間的。
當(dāng)然,諸如SparkSQL和Presto有著他們非常合適的應(yīng)用場景,我們的底層也是會(huì)有多種查詢引擎存在,以應(yīng)對(duì)不同業(yè)務(wù)場景的數(shù)據(jù)查詢服務(wù)。但是由于查詢引擎過多也會(huì)導(dǎo)致用戶使用體驗(yàn)不好,需要用戶掌握多種查詢引擎,而且要明確知道各個(gè)引擎的適用場景。而且多種SQL引擎各自提供服務(wù)會(huì)對(duì)數(shù)據(jù)倉庫建設(shè)過程中的血緣管理、權(quán)限管理、資源利用都帶來較大的困難。
之前對(duì)于底層平臺(tái)的統(tǒng)一SQL服務(wù)有考慮過在上層提供一層接口封裝,進(jìn)行SQL校驗(yàn)、血緣管理、引擎推薦、查詢分發(fā)等等,但是各個(gè)引擎之間的語法差異較大,想要實(shí)現(xiàn)兼容的SQL層有點(diǎn)不太現(xiàn)實(shí)。最近看了快手分享的《SQL on Hadoop 在快手大數(shù)據(jù)平臺(tái)的實(shí)踐與優(yōu)化》,覺得有那么點(diǎn)意思。大家有興趣的話可以看一看。
其實(shí)快手的實(shí)現(xiàn)核心邏輯是一樣的,有一個(gè)統(tǒng)一的SQL入口,提供SQL校驗(yàn),SQL存儲(chǔ)、引擎推薦、查詢分發(fā)進(jìn)而實(shí)現(xiàn)血緣管理等。優(yōu)秀的是它基于Hive完成了上述工作,將Hive作為統(tǒng)一的入口而不是重新包裝一層。既利用了HiveServer2的架構(gòu),又做到了對(duì)于用戶的感知最小。而實(shí)現(xiàn)這些功能的基礎(chǔ)就是Hive Hooks,也就是本篇的重點(diǎn)。
Hook是一種在處理過程中攔截事件,消息或函數(shù)調(diào)用的機(jī)制。Hive hooks是綁定到了Hive內(nèi)部的工作機(jī)制,無需重新編譯Hive。所以Hive Hook提供了使用hive擴(kuò)展和集成外部功能的能力。我們可以通過Hive Hooks在查詢處理的各個(gè)步驟中運(yùn)行/注入一些代碼,幫助我們實(shí)現(xiàn)想要實(shí)現(xiàn)的功能。
根據(jù)鉤子的類型,它可以在查詢處理期間的不同點(diǎn)調(diào)用:
Pre-semantic-analyzer hooks:在Hive在查詢字符串上運(yùn)行語義分析器之前調(diào)用。
Post-semantic-analyzer hooks:在Hive在查詢字符串上運(yùn)行語義分析器之后調(diào)用。
Pre-driver-run hooks:在driver執(zhí)行查詢之前調(diào)用。
Post-driver-run hooks:在driver執(zhí)行查詢之后調(diào)用。
Pre-execution hooks:在執(zhí)行引擎執(zhí)行查詢之前調(diào)用。請(qǐng)注意,這個(gè)目的是此時(shí)已經(jīng)為Hive準(zhǔn)備了一個(gè)優(yōu)化的查詢計(jì)劃。
Post-execution hooks:在查詢執(zhí)行完成之后以及將結(jié)果返回給用戶之前調(diào)用。
Failure-execution hooks:當(dāng)查詢執(zhí)行失敗時(shí)調(diào)用。
由以上的Hive Hooks我們都可以得出Hive SQL執(zhí)行的生命周期了,而Hive Hooks則完整的貫穿了Hive查詢的整個(gè)生命周期。
對(duì)于Hive Hooks有了初步理解之后,后面我們會(huì)通過示例介紹如何實(shí)現(xiàn)一個(gè)Hive Hook,并且嘗試一下如何基于Hive實(shí)現(xiàn)統(tǒng)一的SQL查詢服務(wù)。