hive其實做的就是解析一條sql然后形成到mapreduce任務(wù),就是一個代碼解釋器。hive源代碼本身就可以分為ql/metasotre/service/serde 這幾塊;其中
? 對于Hive來說,ql是整個Hive最最核心的一個模塊,Hive主要的功能都集中在這樣一個模塊中,即 org.apache.hadoop.hive.ql.*,其中最重要的幾個模塊:
- parse:語法解析器和語義分析器,將SQL轉(zhuǎn)化為執(zhí)行計劃。
- optimizer:優(yōu)化器,包括執(zhí)行計劃Operator圖的改寫(邏輯優(yōu)化)和Task圖的改寫(物理優(yōu)化)
- exec:執(zhí)行器,作業(yè)提交和執(zhí)行相關(guān)。
- udf:Hive內(nèi)置的用戶自定義函數(shù),包括操作符加、減、乘、除、與、或、非,常用數(shù)學(xué)操作(sin、cos等)、字符串操作(substr、instr)、聚合操作(count、sum、avg等)等。
?
?
?
?
?
? ? ? 無論使用CLI、Thrift Server、JDBC還是自定義的提交工具,最終的HQL都會傳給Driver實例,執(zhí)行Driver.run()方法。從這種設(shè)計也可以看出,如果您要開發(fā)一套自定義的Hive作業(yè)提交工具,最好的方式是引用Driver實例,調(diào)用相關(guān)方法進行開發(fā)。
? ? ? 而Driver.run()方法,獲得了這樣一個HQL,則會執(zhí)行兩個重要的步驟:編譯和執(zhí)行,即Driver.complie()和Driver.execute()。對于Driver.comile()來說,其實就是調(diào)用parse和optimizer包中的相關(guān)模塊,執(zhí)行語法解析、語義分析、優(yōu)化(回想一下大學(xué)時的編譯原理,編譯的過程是不是語法分析、語法解析、語義分析);對于Driver.run()來說,其實就是調(diào)用exec包中的相關(guān)模塊,將解析后的執(zhí)行計劃執(zhí)行,如果解析后的結(jié)果是一個查詢計劃,那么通常的作法就是提交一系列的MapReduce作業(yè)。
以查詢的執(zhí)行為例,整個Hive的流程是非常簡單的一條直線,由上到下進行。
?
對于main函數(shù),其中主要做了三件事情:
(1)初始化各種配置和參數(shù);
(2)循環(huán)執(zhí)行解析執(zhí)行各種命令;
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
