Hive查詢流程分析git
各個組件的做用api
UI(user interface)(用戶接口):提交數據操做的窗口
Driver(引擎):負責接收數據操做,實現了會話句柄,並提供基於JDBC / ODBC的execute和fetch API
Metastore(元數據):Hive元數據,存儲全部表信息以及相關的HDFS文件存儲目錄,通常採用MySQL或者derby存儲
Compiler(編譯器):解析查詢的SQL,生成階段性的執行計劃(包含MapReduce、元數據操做)
Execution Engine(執行引擎):執行compiler生成的執行計劃。該執行計劃是一個階段的DAG
網絡
查詢流程併發
Step 1:UI調用的Driver的execute接口
Step 2:Driver爲查詢建立會話句柄,並將查詢發送給compiler以生成執行計劃,
Step 3,4:compiler從metastore獲取相關的元數據
Step 5:檢查元數據,基於查詢謂詞調整分區,解析SQL,生成執行計劃
Step 6,6.1,6.2,6.3:由compiler生成的執行計劃是階段的DAG,每一個階段都會涉及到Map/Reduce job,元數據的操做或者HDFS文件的操做。
在Map/Reduce階段,執行計劃包含Map操做樹(操做樹在Mappers上執行)和reduce操做樹(Reduce 操做樹在 Reducers上執行),
Execution Engine 將各個階段提交個適當的組件執行。
Step 7, 8 and 9:在每一個任務(mapper / reducer)中,表或者中間輸出相關的反序列化器從HDFS讀取行,並經過相關的操做樹進行傳遞。
一旦這些輸出產生,將經過序列化器生成零時的的HDFS文件(這個只發生在只有Map沒有reduce的狀況),生成的HDFS零時文件用於執行計劃後續的Map/Reduce階段。
對於DML操做,臨時文件最終移動到表的位置。該方案確保不出現髒數據讀取(文件重命名是HDFS中的原子操做),
對於查詢,臨時文件的內容由Execution Engine直接從HDFS讀取,做爲從Driver Fetch API的一部分
app
Presto查詢流程分析
gitlab
在Map/Reduce階段 執⾏計劃包含Map操做樹 操做樹在Mappers上執⾏ 和reduce性能
各個組件的做用
fetch
Client(客戶端):提交數據操做的窗口
插件
Discovery Server(服務發現者):存儲可用的Server列表
Coordinator(協調者): 接收數據操做,解析SQL語句,生成查詢計劃,分發任務至Worker機
Connector Plugin(鏈接插件):鏈接Storagr,提供元數據,支持Hive、Kafka、MySQL、MonogoDB、Redis、JMX等數據源,可自定義
Worker(執行者):執行查詢計劃
rest
查詢流程
一、Client使用HTTP協議發送一個query請求
二、經過Discovery Server發現可用的Server
三、Coordinator構建查詢計劃(經過Anltr3解析爲AST(抽象語法樹),而後經過Connector獲取原始數據的Metadata信息,生成分發計劃和執行計劃)
四、Coordinator向workers發送任務
五、Worker經過Connector插件讀取數據
六、Worker在內存裏執行任務(Worker是純內存型計算引擎)
七、Worker將數據返回給Coordinator,彙總以後再響應客戶端
Presto與Hive對比
區別:
MapReduce每一個操做都須要寫磁盤,每一個stage須要等待前一個stage所有完成纔開始執行,
而Presto將SQL轉換爲stage,每一個stage又由多個tasks執行,每一個tasks又將分爲多個split。
全部的task是並行的方式執行,stage之間數據是以pipeline形式流式的執行,
數據之間的傳輸也是經過網絡以Memory-to-Memory的形式進行,沒有磁盤io操做。
這也是Presto性能比Hive快5-10倍的決定性緣由
Presto缺點
一、沒有容錯能力,當一個query分發到多個Worker去執行時,當有一個Worker由於各類緣由查詢失敗,Master感知到以後,整個query也會失敗
二、內存限制,因爲Presto是純內存計算,因此當內存不夠時,Presto並不會將結果dump到磁盤上,因此查詢也就失敗了(聽說最新版本的Presto已經支持寫盤操做)
三、並行查詢,由於全部的task都是並行執行,若是其中一臺Worker由於各類緣由查詢很慢,那麼整個query就會變得很慢
四、併發限制,由於全內存操做+內存限制,能同時處理的數據量有限,於是致使併發能力不足
Mob項目的應用http://gitlab.code.mob.com/mobdata-plat/dbcloud-api