Presto™ (PrestoDB) is an open source distributed SQL query engine for running interactive analytic queries against data sources of all sizes ranging from gigabytes to petabytes.
Presto™ (PrestoSQL) is a high performance, distributed SQL query engine for big data.
下文將詳細介紹二者的區別
基本概念組件Coordinator負責管理 Worker 和 MetaStore 節點,以及接受客戶端查詢請求,並進行 SQL 的語法解析(Parser)、執行計劃生成與優化(Planner)和查詢任務的調度(Scheduler)
Coordinator 通過 RESTful 接口與 Client 和 Worker 交互
Worker負責具體的查詢計算和數據讀寫
Discovery Server負責發現集群的各個節點,用於節點間心跳監控
一般 Discovery Server 混布在 Coordinator 節點上,也支持單獨部署
數據源Connector負責訪問不同的數據源,相當於訪問資料庫的驅動
Catalog負責記錄 Schema 信息和 DataSource 的引用。Presto 中一個完整的表名通過 <Catalog>.<Schema>.<Table> 組合表示。例如 hive.test_data.test,則表示 Catalog 為 hive,Schema 為 test_data,Table 為 test
Schema一種組織 Table 的方式
Table等同於關係型資料庫中表的概念
查詢模型Statement兼容 ANSI 標準的 SQL 字符串
Query當 Presto 解析一條 SQL 語句時,會將其轉換為 Query,並創建一個分布式 Query 執行計劃
整個查詢過程涉及 Stage、Task、Split、Connector 和 DataSource 等組件的協同工作
Stage當 Presto 執行查詢時,會進一步分為多個 Stage 階段來執行
TaskStage 包含了一系列的 Task,而 Task 才是真正在 Worker 之上被執行的邏輯
SplitSplit 主要是為了拆分大規模數據集,以便 Task 在此之上執行
DriverDriver 是一系列運算實例,可以理解為是內存中的一組物理運算符
Task 可以包含一個或者多個並行的 Driver
OperatorOperator 可以消費(Consume)、轉換(Transform)和生產(Produce)數據。例如,一個 Table Scan 從一個 Connector 中 fetch 數據,並生產數據以供給 Operator 消費
ExchangeExchanage 負責在 Presto 的節點之間,傳輸一個 Query 的不同 Stage 的數據。Task 可以生產數據到一個 output 緩存區,也可以通過 Exchange 客戶端消費其他 Task 生產的數據
優缺點優勢Ad Hoc(即席查詢,秒級或分鐘級的查詢響應)
比 Hive 快 10 倍
完全基於內存的並行計算
流水線
本地化計算
動態編譯執行計劃
內存規劃
近似查詢(類似於 BlinkDB)
GC 控制
支持多種數據源(Hive、Druid、Kafka、MySQL、MongoDB、Redis、JMX、ORC 等)
Client 支持多種程式語言(Java、Python、Ruby、PHP、Node.js 等)
支持 JDBC / ODBC 連接
支持 Kerberos 認證
支持查詢 LZO 壓縮的數據
ANSI SQL(窗口函數、Join、聚合、複雜查詢等)
Ad Hoc(拉丁短語,英語直譯為 for this)即席查詢,用戶根據實際需求,靈活地選擇查詢條件,系統生成相應的統計報表。與普通應用查詢不同的是,普通應用查詢需要通過編程定製開發
即席(jí xí),表示入席、就位、當場等含義
ANSI(American National Standards Institute)美國國家標準學會
劣勢Presto 屬於強數據類型,並不支持類型的隱式轉換,所以無法進行不同數據類型之間的比較,例如 '2' > 1 等。不過,在對應算子中增加新的語義行為即可支持。下文將介紹具體的編碼過程
架構MPPPresto 採用 MPP(Massively Parallel Processing)大規模並行處理架構,來解決大量數據分析的場景。該架構的主要特徵,如下:
任務並行執行
分布式計算
Shared Nothing
橫向擴展
數據分布式存儲(本地化)
SPIPresto 採用 SPI(Service Provider Interface)服務提供發現機制,來插件化地支持多種數據源,以實現聯邦查詢(Federation Query,指能夠通過一條 SQL 查詢,對處於完全不同的系統中的不同的資料庫和模式,進行引用和使用)
比對Presto vs. Apache Hive優勢比較本質上,Amazon Athena(雅典娜)是一款完全支持標準 SQL 的 Presto
PrestoDB vs. PrestoSQL上表中 PR、Issues 和代碼行數的統計時間範圍是過去一個月的
踩過的坑不支持類型的隱式轉換描述原本只支持數值類型之間的比較,例如 2 > 1:
@ScalarOperator(GREATER_THAN)
@SqlType(StandardTypes.BOOLEAN)
public static boolean greaterThan(@SqlType(StandardTypes.BIGINT) long left, @SqlType(StandardTypes.BIGINT) long right)
{
return left > right;
}
解決增加以下方法,以支持字符串與數值之間的比較,例如 '2' > 1:
@ScalarOperator(GREATER_THAN)
@SqlType(StandardTypes.BOOLEAN)
public static boolean greaterThan(@SqlType(StandardTypes.VARCHAR) String left, @SqlType(StandardTypes.BIGINT) long right)
{
return Long.parseLong(left) > right;
}
當然也可以顯示地調用 cast 函數進行類型轉換