presot要解決的問題
這些系統(tǒng)不允許你使用標準工具來查詢和檢視數(shù)據(jù)击孩。面向特定系統(tǒng)的查詢語言和分析工具比比皆是特愿。
然而商業(yè)分析師已習慣使用業(yè)界標準——SQL移必,無數(shù)強大的工具依賴 SQL 來分析數(shù)據(jù)友鼻、創(chuàng)建儀表盤奋姿、制作富文本報告以及完成其他商業(yè)智能工作。
數(shù)據(jù)分散在各個孤島上古沥,其中有些系統(tǒng)甚至不能提供滿足分析所需的查詢性能瘸右,其他一些系統(tǒng)則將數(shù)據(jù)存儲在單一龐大的系統(tǒng)上,因而不能像現(xiàn)代的云應(yīng)用程序一樣橫向擴展岩齿。沒有這樣的能力尊浓,你就只能縮小潛在的使用場景和用戶數(shù)量,因此降低了數(shù)據(jù)的實用價值纯衍。
presto來救場:
通過支持不同系統(tǒng)上的聯(lián)邦查詢、并行查詢和橫向集群擴展等功能苗胀,它還為我們提供了更多可能性襟诸。
Presto 是一個開源的分布式 SQL 查詢引擎,它是為了高效查詢不同系統(tǒng)和各種規(guī)模(從 GB 級到 PB 級)的數(shù)據(jù)源而從頭開始設(shè)計和編寫的一套系統(tǒng)基协。
Presto 使用分布式執(zhí)行來快速查詢海量數(shù)據(jù)歌亲。如果有 TB 級乃至 PB 級的數(shù)據(jù)需要查詢,你可能會使用 Apache Hive 等工具澜驮,這些工具基于 Hadoop 和 Hadoop 分布式文件系統(tǒng)(Hadoop Distributed File System陷揪,HDFS)工作。
盡管 Presto 能理解并高效地執(zhí)行 SQL杂穷,但它并不是一個數(shù)據(jù)庫悍缠,因為它并不包含自己的數(shù)據(jù)存儲系統(tǒng)。
Presto 同時使用了眾所周知的技術(shù)和新穎的技術(shù)來執(zhí)行分布式查詢耐量,這些技術(shù)包括內(nèi)存并行處理飞蚓、跨集群節(jié)點管線執(zhí)行、多線程執(zhí)行模型(以充分利用所有 CPU 核心)廊蜒、高效的扁平內(nèi)存數(shù)據(jù)結(jié)構(gòu)(以最小化 Java 的垃圾回收)和 Java 字節(jié)碼生成等趴拧。
SQL-on-Anything
Presto 在原地查詢數(shù)據(jù),無須事先將數(shù)據(jù)遷移集中到某個位置山叮。因此著榴,Presto 不僅可以查詢 HDFS 和其他分布式對象存儲系統(tǒng)中的數(shù)據(jù),而且還可以查詢 RDBMS 和其他數(shù)據(jù)源屁倔。無論數(shù)據(jù)存放在何處脑又,Presto 都可以查詢,因此它可以取代傳統(tǒng)、昂貴和笨重的抽取–變換–加載(ETL)過程挂谍,至少可以幫你減輕相關(guān)任務(wù)的負擔叔壤。
Presto 可以通過動態(tài)擴展計算集群的規(guī)模來擴展查詢能力,并可以在數(shù)據(jù)源中數(shù)據(jù)所在的位置查詢數(shù)據(jù)口叙。借助這一特性,你可以極大地優(yōu)化硬件資源需求并降低成本妄田。
聯(lián)邦查詢是在一個語句中引用并使用不同數(shù)據(jù)庫和模式(schema)的SQL 查詢俺亮,這些數(shù)據(jù)庫和 schema 來自于完全不同的系統(tǒng)。在同一條 SQL 查詢中疟呐,可以查詢 Presto 中可用的所有數(shù)據(jù)源脚曾。
Presto的架構(gòu)
Presto 的查詢執(zhí)行模型、查詢計劃以及基于代價的查詢優(yōu)化算法启具。
Presto 通過在整個集群的服務(wù)器上分配處理任務(wù)來實現(xiàn)橫向擴展本讥,而非通過提高單臺服務(wù)器性能來進行縱向擴展。這意味著鲁冯,你可以通過添加更多的計算節(jié)點來獲得更強大的處理能力拷沸。
- 協(xié)調(diào)器用于接受用戶查詢并管理工作節(jié)點以執(zhí)行查詢工作。
- 工作節(jié)點負責執(zhí)行任務(wù)和處理數(shù)據(jù)薯演。
- 協(xié)調(diào)器上通常會運行一個節(jié)點發(fā)現(xiàn)服務(wù)(discovery service)撞芍,工作節(jié)點通過注冊到此服務(wù)以加入集群】绨纾客戶端序无、協(xié)調(diào)器和工作節(jié)點之間的通信和數(shù)據(jù)傳輸完全通過基于 HTTP/HTTPS 的 RESTful API 調(diào)用。
協(xié)調(diào)器為工作節(jié)點分配任務(wù)衡创、更新狀態(tài)并從工作節(jié)點獲取頂層的結(jié)果集返回給用戶帝嗡。工作節(jié)點從數(shù)據(jù)源以及運行在其他節(jié)點上的上游任務(wù)中獲取數(shù)據(jù)。
一個 Presto 集群至少包含一個協(xié)調(diào)器璃氢,可能包含一個或多個工作節(jié)點丈探。
一旦接收到一條 SQL 語句,協(xié)調(diào)器就負責解析拔莱、分析碗降、優(yōu)化和調(diào)度查詢?nèi)蝿?wù)在 Presto 工作節(jié)點上的執(zhí)行,查詢語句被翻譯成一系列相連的任務(wù)(Task)塘秦,這些任務(wù)被分發(fā)到各個工作節(jié)點上執(zhí)行讼渊。在工作節(jié)點處理數(shù)據(jù)的同時,協(xié)調(diào)器會將結(jié)果抽取出來放到輸出緩沖區(qū)中尊剔,并將緩沖區(qū)的內(nèi)容暴露給客戶端爪幻。一旦客戶端讀完輸出緩沖區(qū)的內(nèi)容,協(xié)調(diào)器就會代表客戶端向工作節(jié)點請求更多的數(shù)據(jù)。另外挨稿,工作節(jié)點也在不斷地與數(shù)據(jù)源交互并從中讀取數(shù)據(jù)仇轻。最終,客戶端不斷地請求數(shù)據(jù)奶甘,工作節(jié)點則不斷地從數(shù)據(jù)源讀取數(shù)據(jù)并提供給客戶端篷店,直到查詢執(zhí)行結(jié)束。協(xié)調(diào)器臭家、工作節(jié)點和客戶端基于 HTTP 進行通信疲陕。
基于連接器的架構(gòu)
Presto 存儲與計算分離的核心是基于連接器的架構(gòu)。連接器為 Presto 提供了連接任意數(shù)據(jù)源的接口钉赁。每個連接器在底層數(shù)據(jù)源上提供了一個基于表的抽象蹄殃。只要數(shù)據(jù)可以用 Presto 支持的數(shù)據(jù)類型表示成表、列和行你踩,就可以創(chuàng)建連接器并讓查詢引擎使用這些數(shù)據(jù)進行查詢處理诅岩。
查詢執(zhí)行模型
SQL 語句首先以文本形式提交到協(xié)調(diào)器,協(xié)調(diào)器解析和分析這條語句带膜,之后創(chuàng)建一個由 Presto 內(nèi)部數(shù)據(jù)結(jié)構(gòu)表示的執(zhí)行計劃按厘,叫作查詢計劃。圖 4-6 展示了這一流程钱慢。查詢計劃全面地表示了一條SQL 語句處理數(shù)據(jù)和返回結(jié)果所需進行的步驟。
- 協(xié)調(diào)器通過元數(shù)據(jù) SPI 獲取表卿堂、列和數(shù)據(jù)類型的信息束莫。這些信息用于對查詢進行語義校驗、類型檢查和安全檢查草描。
- 統(tǒng)計 SPI 用于獲取行數(shù)和表大小的信息览绿,從而在計劃期間進行基于代價的查詢優(yōu)化。
- 在創(chuàng)建分布式查詢計劃時會利用數(shù)據(jù)位置 SPI 來生成表內(nèi)容的邏輯切片穗慕。切片是任務(wù)分配和并行的最小單位饿敲。
連接器
連接器將底層數(shù)據(jù)源(如 RDBMS、對象存儲或鍵值存儲)的查詢和存儲概念翻譯成 SQL 和 Presto 中的表逛绵、列怀各、行和數(shù)據(jù)類型的概念。它們可以是簡單的 SQL 到 SQL 之間的轉(zhuǎn)換和映射术浪,也可以是更復雜的 SQL 到對象存儲或 NoSQL 系統(tǒng)的轉(zhuǎn)換瓢对,還可以是由用戶定義的。