Presto:分布式 SQL 查詢引擎

2021-02-21 宇宙灣
Presto 是什麼?

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 階段來執行

Task

 Stage 包含了一系列的 Task,而 Task 才是真正在 Worker 之上被執行的邏輯

Split

 Split 主要是為了拆分大規模數據集,以便 Task 在此之上執行

Driver

 Driver 是一系列運算實例,可以理解為是內存中的一組物理運算符

Task 可以包含一個或者多個並行的 Driver

Operator

 Operator 可以消費(Consume)、轉換(Transform)和生產(Produce)數據。例如,一個 Table Scan 從一個 Connector 中 fetch 數據,並生產數據以供給 Operator 消費

Exchange

 Exchanage 負責在 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 等。不過,在對應算子中增加新的語義行為即可支持。下文將介紹具體的編碼過程

架構MPP

 Presto 採用 MPP(Massively Parallel Processing)大規模並行處理架構,來解決大量數據分析的場景。該架構的主要特徵,如下:

任務並行執行

分布式計算

Shared Nothing

橫向擴展

數據分布式存儲(本地化)

SPI

 Presto 採用 SPI(Service Provider Interface)服務提供發現機制,來插件化地支持多種數據源,以實現聯邦查詢(Federation Query,指能夠通過一條 SQL 查詢,對處於完全不同的系統中的不同的資料庫和模式,進行引用和使用)

比對Presto vs. Apache Hive優勢比較
PrestoApache Hive場景特徵交互式查詢高吞吐Join一個較大的事實表 + 多個較小的維度表事實表 + 事實表窗口函數支持支持SQL 標準化ANSI SQLHiveQLPresto vs. Amazon Athena

 本質上,Amazon Athena(雅典娜)是一款完全支持標準 SQL 的 Presto

PrestoDB vs. PrestoSQL
PrestoDBPrestoSQL開源時間20122018研發主力FacebookMartin、Dain、David通訊模式支持 RESTful 和二進位僅支持 RESTful查詢下推支持支持技術輸出博客博客+ 視頻 + 書籍Connector 數量2430社區活躍度相對不活躍相對活躍合併 PR 數量90205解決 Issues 數量5281改動的代碼行數2008863297

上表中 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 函數進行類型轉換

相關焦點

  • Presto 分布式SQL查詢引擎及原理分析
    前言:Presto是由 Facebook 推出的一個基於Java開發的開源分布式SQL查詢引擎,適用於交互式分析查詢,數據量支持GB到PB字節。Presto本身並不存儲數據,但是可以接入多種數據源,並且支持跨數據源的級聯查詢。為何是SQL查詢引擎?
  • 分布式SQL查詢引擎之Presto
    Presto 是一個開放原始碼的分布式SQL 查詢引擎,用於對大小從GB 到PB 的各種數據源運行交互式分析查詢。Presto 是專為交互式分析而設計和編寫的,可在擴展到Facebook 之類的組織規模的同時,實現商業數據倉庫的速度。Presto 能做什麼?
  • 分布式SQL查詢引擎:Presto
    Presto是由Facebook開發的一個分布式SQL查詢引擎,為進行大數據實時查詢計算而專門設計開發的產品。它解決了Hive的MapReduce模型太慢,不能通過BI或Dashboards直接展現HDFS數據等問題。Presto適用於交互式分析查詢,數據量支持GB到PB字節級別。它可以用來完成聯機分析處理(OLAP)任務,如數據分析、聚合大量數據和生成報告等。
  • Presto系列 | Presto基本介紹
    前言Presto是一款Facebook開源的MPP架構的OLAP查詢引擎,可針對不同數據源執行大容量數據集的一款分布式SQL執行引擎。因為工作中接觸到Presto,研究它對理解SQL Parser、常見算子的實現(如SQL中table scan,join,aggregation)、資源管理與調度、查詢優化(如向量化執行、動態代碼生成)、大數據下各個組件為何適用不同場景等等都有幫助。
  • 如何在CDH集群中部署Presto
    SQL交互式查詢引擎。同Impala一樣,作為Hadoop之上的SQL交互式查詢引擎,通常比Hive要快5-10倍。另外,Presto不僅可以訪問HDFS,還可以訪問RDBMS中的數據,以及其他數據源比如CASSANDRA。Presto是一個運行在多臺伺服器上的分布式系統。 完整安裝包括一個coordinator和多個worker。
  • Presto
    Presto是一個開源的分布式SQL查詢引擎,數據量支持
  • Delta Lake Presto Integration & Manifests 機制
    」Delta Lake 在 0.5 之前只支持通過 Spark 讀取數據,在新版本中增加了其他處理引擎通過 manifest 文件訪問 Delta Lake 的能力。下文以Presto 為例說明如何通過 manifest 文件訪問數據,manifest 文件的生成及其一些限制。
  • Presto 在有贊的實踐之路
    一、Presto 介紹Presto 是由 Facebook 開發的開源大數據分布式高性能 SQL 查詢引擎。起初,Facebook 使用 Hive 來進行交互式查詢分析,但 Hive 是基於 MapReduce 為批處理而設計的,延時很高,滿足不了用戶對於交互式查詢想要快速出結果的場景。
  • Mysql中一條SQL查詢語句是如何執行的?
    2.查詢流程解析select * from table1 where ID=10;這條語句相信大家再熟悉不過了,下面我們就看看這一條語句在mysql中是怎麼執行的。第一步:一條sql語句要經過連接器,客戶端要和mysql建立連接。
  • Presto在大數據領域的實踐和探索
    這是官網對Presto的定義,Presto 是由 Facebook 開源的大數據分布式 SQL 查詢引擎,適用於交互式分析查詢,可支持眾多的數據源,包括 HDFS,RDBMS,KAFKA 等,而且提供了非常友好的接口開發數據源連接器。Presto之所以能在各個內存計算型資料庫中脫穎而出,在於以下幾點:清晰的架構,是一個能夠獨立運行的系統,不依賴於任何其他外部系統。
  • 資料庫SQL腳本優化
    ,因為子查詢會在查詢前建立臨時表,查詢完又刪除臨時表,對於結果集大的查詢,性能影響更加明顯4、避免沒有where過濾條件的查詢 (前兩天就看到一個查詢bc_freight(400W+)表裡所有數據,沒有過濾條件,我看到的時候已經執行一萬多秒了)5、sql語句儘可能簡單點,一個大的sql要是在滿足業務需求的情況下可以分解為多個小
  • spark結構化數據處理:Spark SQL、DataFrame和Dataset
    但無論是哪種API或者是程式語言,它們都是基於同樣的執行引擎,因此你可以在不同的API之間隨意切換,它們各有各的特點,看你喜歡。SQL使用Spark SQL的一種方式就是通過SQL語句來執行SQL查詢。當在程式語言中使用SQL時,其返回結果將被封裝為一個DataFrame。
  • 用Select×進行SQL查詢的七宗罪
    【51CTO.com快譯】如今,網上許多文章都已明確地指出:使用「SELECT * 」作為SQL查詢方式是一種極其危險的代碼書寫習慣。開發人員應該儘量在自己的程序中避免出現此類查詢,取而代之的應該是明確地指定要查詢的列名。不過,大家可能只是「知其然,而不知其所以然」。
  • PrestoSQL 因商標侵權被迫更名
    | IPLaw法律社交媒體 | 全球精英的智慧財產權資訊 IPLaw訊 開源大數據分布式 SQL 查詢引擎 PrestoSQL ,如今已經更名為 Trino 。
  • 面對MySQL 查詢索引失效,程式設計師的六大優化技巧!
    要找到這個原因,我們需要首先了解下SQL在mysql中的執行過程,MYSQL 的整個架構可以分為 server 層 和存儲引擎層2個部分。Server 層 包括連接器,查詢緩存,分析器,優化器,執行器等模塊; 存儲引擎層 負責數據的存儲與提取。其架構模式是插件式的,支持InnoDB、MyISAM、Memory等多個存儲引擎,默認的是InnoDB。
  • Presto Join流程及相關配置
    前言         Presto是一款優秀的分布式SQL查詢引擎
  • SQL on file 工具
    csvsql本質上不是獨立程序,而是個Python腳本,所以必須事先配置好Python環境,又因為許多功能依賴第三方,所以還要下載合適版本的函數庫。這些對程式設計師來說還算容易,但對數據分析師來說,就有點太為難了。csvsql的第二大缺點是沒有自己的計算引擎。
  • 大數據基礎知識:Hadoop分布式系統介紹
    Hadoop是Apache軟體基金會下一個開源分布式計算平臺,以hdfs(Hadoop Distributed File System)、MapReduce(Hadoop2.0加入了YARN,Yarn是資源調度框架,能夠細粒度的管理和調度任務,還能夠支持其他的計算框架,比如spark)為核心的Hadoop為用戶提供了系統底層細節透明的分布式基礎架構。
  • SQL語句面試題目:一般查詢和高級子查詢(上)
    通過兩條 sql 查詢:[sql] view plain copy select manager_id   from employees   where lower(last_name) = 'chen'      select *   from employees
  • 「MySQL系列」分析Sql執行時間及查詢執行計劃(附資料庫和一千萬數據)
    接下來我將更新MySQL系列的文章,主要涉及MySQL的索引、調優、整體架構、引擎、分庫分表、擴容、索引的深入探究等等。感興趣的可以持續關注,不感興趣的略過。我們幹開發面試工作的時候,發現對資料庫的面試比重很大。說明對資料庫的知識掌握對我們程式設計師越來越重要了。