當(dāng)我們?cè)趯W(xué)習(xí)Hive的時(shí)候在學(xué)習(xí)什么?「硬剛Hive續(xù)集」
大家不要在惦記我的師姐了。??
師姐孩子都幼兒園水平了,上上周來(lái)園區(qū),直接給我手撕了一個(gè)冒泡排序。
我當(dāng)時(shí)汗都嚇出來(lái)了。??
下次有機(jī)會(huì)我們來(lái)介紹一下我的小師妹。
我們又來(lái)到「學(xué)習(xí)什么」系列了。這篇文章是對(duì)「硬剛Hive」的補(bǔ)充。
我在之前的硬剛系列《大數(shù)據(jù)方向另一個(gè)十年開(kāi)啟 |《硬剛系列》第一版完結(jié)》中寫(xiě)過(guò)一個(gè)《硬剛Hive | 4萬(wàn)字基礎(chǔ)調(diào)優(yōu)面試小總結(jié)》,這個(gè)小結(jié)里基本涵蓋了你所看過(guò)的關(guān)于Hive的常見(jiàn)的知識(shí)和面試八股文。
一、基于Hadoop的數(shù)據(jù)倉(cāng)庫(kù)Hive基礎(chǔ)知識(shí)
二、HiveSQL語(yǔ)法
三、Hive性能優(yōu)化
四、Hive性能優(yōu)化之?dāng)?shù)據(jù)傾斜專(zhuān)題
五、HiveSQL優(yōu)化十二板斧
六、Hive面試題(一)
七、Hive/Hadoop高頻面試點(diǎn)集合(二)
然而,我發(fā)現(xiàn)漏掉了一些東西。我將在本篇文章進(jìn)行補(bǔ)充。
Hive工作原理和運(yùn)行架構(gòu)
你可以在官網(wǎng)中找到Hive的架構(gòu)和運(yùn)行圖:


從Hive全局架構(gòu)圖中可以看到Hive架構(gòu)包括如下組件:CLI(Hive3.0中被廢棄被BeeLine取代)、JDBC/ODBC、Thrift Server、Hive WEB Interface(HWI)、Metastore和Driver(Compiler、Optimizer)
Metastore組件:元數(shù)據(jù)服務(wù)組件,這個(gè)組件用于存儲(chǔ)hive的元數(shù)據(jù),包括表名、表所屬的數(shù)據(jù)庫(kù)、表的擁有者、列/分區(qū)字段、表的類(lèi)型、表的數(shù)據(jù)所在目錄等內(nèi)容。hive的元數(shù)據(jù)存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)里,支持derby、mysql兩種關(guān)系型數(shù)據(jù)庫(kù)。元數(shù)據(jù)對(duì)于hive十分重要,因此Hive支持把metastore服務(wù)獨(dú)立出來(lái),安裝到遠(yuǎn)程的服務(wù)器集群里,從而解耦hive服務(wù)和metastore服務(wù),保證hive運(yùn)行的健壯性。
Driver組件:該組件包括Parser、Compiler、Optimizer和Executor,它的作用是將我們寫(xiě)的HiveQL(類(lèi)SQL)語(yǔ)句進(jìn)行解析、編譯、優(yōu)化,生成執(zhí)行計(jì)劃,然后調(diào)用底層的mapreduce計(jì)算框架。
解釋器(Parser):將SQL字符串轉(zhuǎn)化為抽象語(yǔ)法樹(shù)AST;
編譯器(Compiler):將AST編譯成邏輯執(zhí)行計(jì)劃;
優(yōu)化器(Optimizer):對(duì)邏輯執(zhí)行計(jì)劃進(jìn)行優(yōu)化;
執(zhí)行器(Executor):將邏輯執(zhí)行計(jì)劃轉(zhuǎn)成可執(zhí)行的物理計(jì)劃,如MR/Spark
CLI:command line interface,命令行接口。
ThriftServers:提供JDBC和ODBC接入的能力,它用來(lái)進(jìn)行可擴(kuò)展且跨語(yǔ)言的服務(wù)的開(kāi)發(fā),hive集成了該服務(wù),能讓不同的編程語(yǔ)言調(diào)用hive的接口。
Hive的工作流程步驟:
ExecuteQuery(執(zhí)行查詢操作):命令行或Web UI之類(lèi)的Hive接口將查詢發(fā)送給Driver(任何數(shù)據(jù)驅(qū)動(dòng)程序,如JDBC、ODBC等)執(zhí)行;
GetPlan(獲取計(jì)劃任務(wù)):Driver借助編譯器解析查詢,檢查語(yǔ)法和查詢計(jì)劃或查詢需求;
GetMetaData(獲取元數(shù)據(jù)信息):編譯器將元數(shù)據(jù)請(qǐng)求發(fā)送到Metastore(任何數(shù)據(jù)庫(kù));
SendMetaData(發(fā)送元數(shù)據(jù)):MetaStore將元數(shù)據(jù)作為對(duì)編譯器的響應(yīng)發(fā)送出去;
SendPlan(發(fā)送計(jì)劃任務(wù)):編譯器檢查需求并將計(jì)劃重新發(fā)送給Driver。到目前為止,查詢的解析和編譯已經(jīng)完成;
ExecutePlan(執(zhí)行計(jì)劃任務(wù)):Driver將執(zhí)行計(jì)劃發(fā)送到執(zhí)行引擎;
6.1 ExecuteJob(執(zhí)行Job任務(wù)):在內(nèi)部,執(zhí)行任務(wù)的過(guò)程是MapReduce Job。執(zhí)行引擎將Job發(fā)送到ResourceManager,ResourceManager位于Name節(jié)點(diǎn)中,并將job分配給datanode中的NodeManager。在這里,查詢執(zhí)行MapReduce任務(wù);
6.2 Metadata Ops(元數(shù)據(jù)操作):在執(zhí)行的同時(shí),執(zhí)行引擎可以使用Metastore執(zhí)行元數(shù)據(jù)操作;
6.3 jobDone(完成任務(wù)):完成MapReduce Job;
6.4 dfs operations(dfs操作記錄):向namenode獲取操作數(shù)據(jù);
FetchResult(拉取結(jié)果集):執(zhí)行引擎將從datanode上獲取結(jié)果集;
SendResults(發(fā)送結(jié)果集至driver):執(zhí)行引擎將這些結(jié)果值發(fā)送給Driver;
SendResults (driver將result發(fā)送至interface):Driver將結(jié)果發(fā)送到Hive接口(即UI)。
HiveSQL轉(zhuǎn)化為MR任務(wù)的過(guò)程
我在網(wǎng)上找到一個(gè)轉(zhuǎn)化圖:

編譯 SQL 的任務(wù)是在上面介紹的 COMPILER(編譯器組件)中完成的。Hive將SQL轉(zhuǎn)化為MapReduce任務(wù),整個(gè)編譯過(guò)程分為六個(gè)階段:
詞法、語(yǔ)法解析: Antlr 定義 SQL 的語(yǔ)法規(guī)則,完成 SQL 詞法,語(yǔ)法解析,將 SQL 轉(zhuǎn)化為抽象語(yǔ)法樹(shù) AST Tree;
語(yǔ)義解析: 遍歷 AST Tree,抽象出查詢的基本組成單元 QueryBlock;
生成邏輯執(zhí)行計(jì)劃: 遍歷 QueryBlock,翻譯為執(zhí)行操作樹(shù) OperatorTree;
優(yōu)化邏輯執(zhí)行計(jì)劃: 邏輯層優(yōu)化器進(jìn)行 OperatorTree 變換,合并 Operator,達(dá)到減少 MapReduce Job,減少數(shù)據(jù)傳輸及 shuffle 數(shù)據(jù)量;
生成物理執(zhí)行計(jì)劃: 遍歷 OperatorTree,翻譯為 MapReduce 任務(wù);
優(yōu)化物理執(zhí)行計(jì)劃: 物理層優(yōu)化器進(jìn)行 MapReduce 任務(wù)的變換,生成最終的執(zhí)行計(jì)劃。
而且要特別注意:
一個(gè)復(fù)雜的Hive SQL 可能會(huì)轉(zhuǎn)化成多個(gè)MapReduce任務(wù)執(zhí)行。
HiveSQL轉(zhuǎn)換成MR任務(wù)?你問(wèn)過(guò)Hive3.0的Tez嗎?
我上面講的HiveSQL轉(zhuǎn)化為MR任務(wù)的過(guò)程只適用于Hive3.0以下版本。在Hive3.0+版本中這個(gè)默認(rèn)執(zhí)行引擎被替換成了Tez。
為什么拋棄MR任務(wù)?因?yàn)镠adoop的MapReduce真的太慢了。
Tez是Apache開(kāi)源的支持DAG作業(yè)的計(jì)算框架,它直接源于MapReduce框架,核心思想是將Map和Reduce兩個(gè)操作進(jìn)一步拆分,即Map被拆分成Input、Processor、Sort、Merge和Output, Reduce被拆分成Input、Shuffle、Sort、Merge、Processor和Output等,這樣,這些分解后的元操作可以任意靈活組合,產(chǎn)生新的操作,這些操作經(jīng)過(guò)一些控制程序組裝后,可形成一個(gè)大的DAG作業(yè)。

Tez將Map task和Reduce task拆分為如下圖所示:

Tez的task由Input、processor、output階段組成,可以表達(dá)所有復(fù)雜的map、reduce操作,如下圖,

舉個(gè)栗子看優(yōu)勢(shì),直接看下圖,Tez可以將多個(gè)有依賴的作業(yè)轉(zhuǎn)換為一個(gè)作業(yè)(這樣只需寫(xiě)一次HDFS,且中間節(jié)點(diǎn)較少),從而大大提升DAG作業(yè)的性能。Tez很早就已被Hortonworks用于Hive引擎的優(yōu)化,經(jīng)測(cè)試,性能提升約100倍。

在Hive3.0中,Hive終于將執(zhí)行引擎切換到了Tez。Hive終于不在那么慢了。
Spark on Hive的支持
Spark通過(guò)Spark-SQL使用Hive 語(yǔ)句,操作Hive,底層運(yùn)行的還是Spark rdd。在很多大公司,都實(shí)現(xiàn)了對(duì)Spark on Hive的支持。
大概的原理是:
通過(guò)SparkSql,加載Hive的配置文件,獲取到Hive的元數(shù)據(jù)信息
通過(guò)SparkSql獲取到Hive的元數(shù)據(jù)信息之后就可以拿到Hive的所有表的數(shù)據(jù)
接下來(lái)就可以通過(guò)通過(guò)SparkSql來(lái)操作Hive表中的數(shù)據(jù)
詳細(xì)可以參考:《Spark on Hive & Hive on Spark,傻傻分不清楚》
另外,還有Hive3.0中更多的特性,我們?cè)诤竺嬖僖灰唤獯稹?/span>

你好,我是王知無(wú),一個(gè)大數(shù)據(jù)領(lǐng)域的硬核原創(chuàng)作者。
做過(guò)后端架構(gòu)、數(shù)據(jù)中間件、數(shù)據(jù)平臺(tái)&架構(gòu)、算法工程化。
專(zhuān)注大數(shù)據(jù)領(lǐng)域?qū)崟r(shí)動(dòng)態(tài)&技術(shù)提升&個(gè)人成長(zhǎng)&職場(chǎng)進(jìn)階,歡迎關(guān)注。
