AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

Hive SQL底層執(zhí)行過(guò)程詳細(xì)剖析

來(lái)源: 責(zé)編: 時(shí)間:2024-05-16 17:44:56 177觀看
導(dǎo)讀HiveHive是什么?Hive 是數(shù)據(jù)倉(cāng)庫(kù)工具,再具體點(diǎn)就是一個(gè) SQL 解析引擎,因?yàn)樗床回?fù)責(zé)存儲(chǔ)數(shù)據(jù),也不負(fù)責(zé)計(jì)算數(shù)據(jù),只負(fù)責(zé)解析 SQL,記錄元數(shù)據(jù)。Hive直接訪問(wèn)存儲(chǔ)在 HDFS 中或者 HBase 中的文件,通過(guò) MapReduce、Spark 或 Tez

Hive

Hive是什么?Hive 是數(shù)據(jù)倉(cāng)庫(kù)工具,再具體點(diǎn)就是一個(gè) SQL 解析引擎,因?yàn)樗床回?fù)責(zé)存儲(chǔ)數(shù)據(jù),也不負(fù)責(zé)計(jì)算數(shù)據(jù),只負(fù)責(zé)解析 SQL,記錄元數(shù)據(jù)。iZI28資訊網(wǎng)——每日最新資訊28at.com

Hive直接訪問(wèn)存儲(chǔ)在 HDFS 中或者 HBase 中的文件,通過(guò) MapReduce、Spark 或 Tez 執(zhí)行查詢。iZI28資訊網(wǎng)——每日最新資訊28at.com

我們今天來(lái)聊的就是 Hive 底層是怎樣將我們寫的 SQL 轉(zhuǎn)化為 MapReduce 等計(jì)算引擎可識(shí)別的程序。了解 Hive SQL 的底層編譯過(guò)程有利于我們優(yōu)化Hive SQL,提升我們對(duì)Hive的掌控力,同時(shí)有能力去定制一些需要的功能。iZI28資訊網(wǎng)——每日最新資訊28at.com

Hive 底層執(zhí)行架構(gòu)

我們先來(lái)看下 Hive 的底層執(zhí)行架構(gòu)圖, Hive 的主要組件與 Hadoop 交互的過(guò)程:iZI28資訊網(wǎng)——每日最新資訊28at.com

Hive底層執(zhí)行架構(gòu)Hive底層執(zhí)行架構(gòu)iZI28資訊網(wǎng)——每日最新資訊28at.com

在 Hive 這一側(cè),總共有五個(gè)組件:iZI28資訊網(wǎng)——每日最新資訊28at.com

  1. UI:用戶界面。可看作我們提交SQL語(yǔ)句的命令行界面。
  2. DRIVER:驅(qū)動(dòng)程序。接收查詢的組件。該組件實(shí)現(xiàn)了會(huì)話句柄的概念。
  3. COMPILER:編譯器。負(fù)責(zé)將 SQL 轉(zhuǎn)化為平臺(tái)可執(zhí)行的執(zhí)行計(jì)劃。對(duì)不同的查詢塊和查詢表達(dá)式進(jìn)行語(yǔ)義分析,并最終借助表和從 metastore 查找的分區(qū)元數(shù)據(jù)來(lái)生成執(zhí)行計(jì)劃。
  4. METASTORE:元數(shù)據(jù)庫(kù)。存儲(chǔ) Hive 中各種表和分區(qū)的所有結(jié)構(gòu)信息。
  5. EXECUTION ENGINE:執(zhí)行引擎。負(fù)責(zé)提交 COMPILER 階段編譯好的執(zhí)行計(jì)劃到不同的平臺(tái)上。

上圖的基本流程是:iZI28資訊網(wǎng)——每日最新資訊28at.com

步驟1:UI 調(diào)用 DRIVER 的接口;iZI28資訊網(wǎng)——每日最新資訊28at.com

步驟2:DRIVER 為查詢創(chuàng)建會(huì)話句柄,并將查詢發(fā)送到 COMPILER(編譯器)生成執(zhí)行計(jì)劃;iZI28資訊網(wǎng)——每日最新資訊28at.com

步驟3和4:編譯器從元數(shù)據(jù)存儲(chǔ)中獲取本次查詢所需要的元數(shù)據(jù),該元數(shù)據(jù)用于對(duì)查詢樹中的表達(dá)式進(jìn)行類型檢查,以及基于查詢謂詞修建分區(qū);iZI28資訊網(wǎng)——每日最新資訊28at.com

步驟5:編譯器生成的計(jì)劃是分階段的DAG,每個(gè)階段要么是 map/reduce 作業(yè),要么是一個(gè)元數(shù)據(jù)或者HDFS上的操作。將生成的計(jì)劃發(fā)給 DRIVER。iZI28資訊網(wǎng)——每日最新資訊28at.com

如果是 map/reduce 作業(yè),該計(jì)劃包括 map operator trees 和一個(gè)  reduce operator tree,執(zhí)行引擎將會(huì)把這些作業(yè)發(fā)送給 MapReduce :iZI28資訊網(wǎng)——每日最新資訊28at.com

步驟6、6.1、6.2和6.3:執(zhí)行引擎將這些階段提交給適當(dāng)?shù)慕M件。在每個(gè) task(mapper/reducer) 中,從HDFS文件中讀取與表或中間輸出相關(guān)聯(lián)的數(shù)據(jù),并通過(guò)相關(guān)算子樹傳遞這些數(shù)據(jù)。最終這些數(shù)據(jù)通過(guò)序列化器寫入到一個(gè)臨時(shí)HDFS文件中(如果不需要 reduce 階段,則在 map 中操作)。臨時(shí)文件用于向計(jì)劃中后面的 map/reduce 階段提供數(shù)據(jù)。iZI28資訊網(wǎng)——每日最新資訊28at.com

步驟7、8和9:最終的臨時(shí)文件將移動(dòng)到表的位置,確保不讀取臟數(shù)據(jù)(文件重命名在HDFS中是原子操作)。對(duì)于用戶的查詢,臨時(shí)文件的內(nèi)容由執(zhí)行引擎直接從HDFS讀取,然后通過(guò)Driver發(fā)送到UI。iZI28資訊網(wǎng)——每日最新資訊28at.com

Hive SQL 編譯成 MapReduce 過(guò)程

編譯 SQL 的任務(wù)是在上節(jié)中介紹的 COMPILER(編譯器組件)中完成的。Hive將SQL轉(zhuǎn)化為MapReduce任務(wù),整個(gè)編譯過(guò)程分為六個(gè)階段:iZI28資訊網(wǎng)——每日最新資訊28at.com

Hive SQL編譯過(guò)程Hive SQL編譯過(guò)程iZI28資訊網(wǎng)——每日最新資訊28at.com

  1. 詞法、語(yǔ)法解析: Antlr 定義 SQL 的語(yǔ)法規(guī)則,完成 SQL 詞法,語(yǔ)法解析,將 SQL 轉(zhuǎn)化為抽象語(yǔ)法樹 AST Tree;

Antlr是一種語(yǔ)言識(shí)別的工具,可以用來(lái)構(gòu)造領(lǐng)域語(yǔ)言。使用Antlr構(gòu)造特定的語(yǔ)言只需要編寫一個(gè)語(yǔ)法文件,定義詞法和語(yǔ)法替換規(guī)則即可,Antlr完成了詞法分析、語(yǔ)法分析、語(yǔ)義分析、中間代碼生成的過(guò)程。iZI28資訊網(wǎng)——每日最新資訊28at.com

  1. 語(yǔ)義解析: 遍歷 AST Tree,抽象出查詢的基本組成單元 QueryBlock;
  2. 生成邏輯執(zhí)行計(jì)劃: 遍歷 QueryBlock,翻譯為執(zhí)行操作樹 OperatorTree;
  3. 優(yōu)化邏輯執(zhí)行計(jì)劃: 邏輯層優(yōu)化器進(jìn)行 OperatorTree 變換,合并 Operator,達(dá)到減少 MapReduce Job,減少數(shù)據(jù)傳輸及 shuffle 數(shù)據(jù)量;
  4. 生成物理執(zhí)行計(jì)劃: 遍歷 OperatorTree,翻譯為 MapReduce 任務(wù);
  5. 優(yōu)化物理執(zhí)行計(jì)劃: 物理層優(yōu)化器進(jìn)行 MapReduce 任務(wù)的變換,生成最終的執(zhí)行計(jì)劃。
下面對(duì)這六個(gè)階段詳細(xì)解析:

為便于理解,我們拿一個(gè)簡(jiǎn)單的查詢語(yǔ)句進(jìn)行展示,對(duì)5月23號(hào)的地區(qū)維表進(jìn)行查詢:iZI28資訊網(wǎng)——每日最新資訊28at.com

select * from dim.dim_region where dt = '2021-05-23';

階段一:詞法、語(yǔ)法解析iZI28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)Antlr定義的sql語(yǔ)法規(guī)則,將相關(guān)sql進(jìn)行詞法、語(yǔ)法解析,轉(zhuǎn)化為抽象語(yǔ)法樹AST Tree:iZI28資訊網(wǎng)——每日最新資訊28at.com

ABSTRACT SYNTAX TREE:TOK_QUERY    TOK_FROM     TOK_TABREF           TOK_TABNAME               dim                 dim_region    TOK_INSERT      TOK_DESTINATION          TOK_DIR              TOK_TMP_FILE        TOK_SELECT          TOK_SELEXPR              TOK_ALLCOLREF        TOK_WHERE          =              TOK_TABLE_OR_COL                  dt                    '2021-05-23'

階段二:語(yǔ)義解析iZI28資訊網(wǎng)——每日最新資訊28at.com

遍歷AST Tree,抽象出查詢的基本組成單元QueryBlock:iZI28資訊網(wǎng)——每日最新資訊28at.com

AST Tree生成后由于其復(fù)雜度依舊較高,不便于翻譯為mapreduce程序,需要進(jìn)行進(jìn)一步抽象和結(jié)構(gòu)化,形成QueryBlock。iZI28資訊網(wǎng)——每日最新資訊28at.com

QueryBlock是一條SQL最基本的組成單元,包括三個(gè)部分:輸入源,計(jì)算過(guò)程,輸出。簡(jiǎn)單來(lái)講一個(gè)QueryBlock就是一個(gè)子查詢。iZI28資訊網(wǎng)——每日最新資訊28at.com

QueryBlock的生成過(guò)程為一個(gè)遞歸過(guò)程,先序遍歷 AST Tree ,遇到不同的 Token 節(jié)點(diǎn)(理解為特殊標(biāo)記),保存到相應(yīng)的屬性中。iZI28資訊網(wǎng)——每日最新資訊28at.com

階段三:生成邏輯執(zhí)行計(jì)劃iZI28資訊網(wǎng)——每日最新資訊28at.com

遍歷QueryBlock,翻譯為執(zhí)行操作樹OperatorTree:iZI28資訊網(wǎng)——每日最新資訊28at.com

Hive最終生成的MapReduce任務(wù),Map階段和Reduce階段均由OperatorTree組成。iZI28資訊網(wǎng)——每日最新資訊28at.com

基本的操作符包括:iZI28資訊網(wǎng)——每日最新資訊28at.com

  • TableScanOperator
  • SelectOperator
  • FilterOperator
  • JoinOperator
  • GroupByOperator
  • ReduceSinkOperator`

Operator在Map Reduce階段之間的數(shù)據(jù)傳遞都是一個(gè)流式的過(guò)程。每一個(gè)Operator對(duì)一行數(shù)據(jù)完成操作后之后將數(shù)據(jù)傳遞給childOperator計(jì)算。iZI28資訊網(wǎng)——每日最新資訊28at.com

由于Join/GroupBy/OrderBy均需要在Reduce階段完成,所以在生成相應(yīng)操作的Operator之前都會(huì)先生成一個(gè)ReduceSinkOperator,將字段組合并序列化為Reduce Key/value, Partition Key。iZI28資訊網(wǎng)——每日最新資訊28at.com

階段四:優(yōu)化邏輯執(zhí)行計(jì)劃iZI28資訊網(wǎng)——每日最新資訊28at.com

Hive中的邏輯查詢優(yōu)化可以大致分為以下幾類:iZI28資訊網(wǎng)——每日最新資訊28at.com

  • 投影修剪
  • 推導(dǎo)傳遞謂詞
  • 謂詞下推
  • 將Select-Select,F(xiàn)ilter-Filter合并為單個(gè)操作
  • 多路 Join
  • 查詢重寫以適應(yīng)某些列值的Join傾斜

階段五:生成物理執(zhí)行計(jì)劃iZI28資訊網(wǎng)——每日最新資訊28at.com

生成物理執(zhí)行計(jì)劃即是將邏輯執(zhí)行計(jì)劃生成的OperatorTree轉(zhuǎn)化為MapReduce Job的過(guò)程,主要分為下面幾個(gè)階段:iZI28資訊網(wǎng)——每日最新資訊28at.com

  1. 對(duì)輸出表生成MoveTask
  2. 從OperatorTree的其中一個(gè)根節(jié)點(diǎn)向下深度優(yōu)先遍歷
  3. ReduceSinkOperator標(biāo)示Map/Reduce的界限,多個(gè)Job間的界限
  4. 遍歷其他根節(jié)點(diǎn),遇過(guò)碰到JoinOperator合并MapReduceTask
  5. 生成StatTask更新元數(shù)據(jù)
  6. 剪斷Map與Reduce間的Operator的關(guān)系

階段六:優(yōu)化物理執(zhí)行計(jì)劃iZI28資訊網(wǎng)——每日最新資訊28at.com

Hive中的物理優(yōu)化可以大致分為以下幾類:iZI28資訊網(wǎng)——每日最新資訊28at.com

  • 分區(qū)修剪(Partition Pruning)
  • 基于分區(qū)和桶的掃描修剪(Scan pruning)
  • 如果查詢基于抽樣,則掃描修剪
  • 在某些情況下,在 map 端應(yīng)用 Group By
  • 在 mapper 上執(zhí)行 Join
  • 優(yōu)化 Union,使Union只在 map 端執(zhí)行
  • 在多路 Join 中,根據(jù)用戶提示決定最后流哪個(gè)表
  • 刪除不必要的 ReduceSinkOperators
  • 對(duì)于帶有Limit子句的查詢,減少需要為該表掃描的文件數(shù)
  • 對(duì)于帶有Limit子句的查詢,通過(guò)限制 ReduceSinkOperator 生成的內(nèi)容來(lái)限制來(lái)自 mapper 的輸出
  • 減少用戶提交的SQL查詢所需的Tez作業(yè)數(shù)量
  • 如果是簡(jiǎn)單的提取查詢,避免使用MapReduce作業(yè)
  • 對(duì)于帶有聚合的簡(jiǎn)單獲取查詢,執(zhí)行不帶 MapReduce 任務(wù)的聚合
  • 重寫 Group By 查詢使用索引表代替原來(lái)的表
  • 當(dāng)表掃描之上的謂詞是相等謂詞且謂詞中的列具有索引時(shí),使用索引掃描

經(jīng)過(guò)以上六個(gè)階段,SQL 就被解析映射成了集群上的 MapReduce 任務(wù)。iZI28資訊網(wǎng)——每日最新資訊28at.com

SQL編譯成MapReduce具體原理

在階段五-生成物理執(zhí)行計(jì)劃,即遍歷 OperatorTree,翻譯為 MapReduce 任務(wù),這個(gè)過(guò)程具體是怎么轉(zhuǎn)化的呢iZI28資訊網(wǎng)——每日最新資訊28at.com

我們接下來(lái)舉幾個(gè)常用 SQL 語(yǔ)句轉(zhuǎn)化為 MapReduce 的具體步驟:iZI28資訊網(wǎng)——每日最新資訊28at.com

Join的實(shí)現(xiàn)原理

以下面這個(gè)SQL為例,講解 join 的實(shí)現(xiàn):iZI28資訊網(wǎng)——每日最新資訊28at.com

select u.name, o.orderid from order o join user u on o.uid = u.uid;

在map的輸出value中為不同表的數(shù)據(jù)打上tag標(biāo)記,在reduce階段根據(jù)tag判斷數(shù)據(jù)來(lái)源。MapReduce的過(guò)程如下:iZI28資訊網(wǎng)——每日最新資訊28at.com

MapReduce CommonJoin的實(shí)現(xiàn)MapReduce CommonJoin的實(shí)現(xiàn)iZI28資訊網(wǎng)——每日最新資訊28at.com

Group By的實(shí)現(xiàn)原理

以下面這個(gè)SQL為例,講解 group by 的實(shí)現(xiàn):iZI28資訊網(wǎng)——每日最新資訊28at.com

select rank, isonline, count(*) from city group by rank, isonline;

將GroupBy的字段組合為map的輸出key值,利用MapReduce的排序,在reduce階段保存LastKey區(qū)分不同的key。MapReduce的過(guò)程如下:iZI28資訊網(wǎng)——每日最新資訊28at.com

MapReduce Group By的實(shí)現(xiàn)MapReduce Group By的實(shí)現(xiàn)iZI28資訊網(wǎng)——每日最新資訊28at.com

Distinct的實(shí)現(xiàn)原理

以下面這個(gè)SQL為例,講解 distinct 的實(shí)現(xiàn):iZI28資訊網(wǎng)——每日最新資訊28at.com

select dealid, count(distinct uid) num from order group by dealid;

當(dāng)只有一個(gè)distinct字段時(shí),如果不考慮Map階段的Hash GroupBy,只需要將GroupBy字段和Distinct字段組合為map輸出key,利用mapreduce的排序,同時(shí)將GroupBy字段作為reduce的key,在reduce階段保存LastKey即可完成去重:iZI28資訊網(wǎng)——每日最新資訊28at.com

MapReduce Distinct的實(shí)現(xiàn)MapReduce Distinct的實(shí)現(xiàn)iZI28資訊網(wǎng)——每日最新資訊28at.com


iZI28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-88727-0.htmlHive SQL底層執(zhí)行過(guò)程詳細(xì)剖析

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 不一樣的SVG!SVG在CSS背景平鋪中的應(yīng)用

下一篇: Span 在網(wǎng)絡(luò)編程中可以提供高性能的內(nèi)存訪問(wèn)和數(shù)據(jù)處理能力

標(biāo)簽:
  • 熱門焦點(diǎn)
Top