Presto介紹
一、Presto出現背景
Presto是Facebook在2012年開發的,是專為Hadoop打造的一款數據倉庫工具。在早期Facebook依賴Hive做數據分析,Hive底層依賴MapReduce,隨著數據量越來越大,使用Hive進行數據分析,時間可能需要分鐘級到小時級別,不能滿足交互式查詢的數據分析場景。2012年秋季,Facebook開發Presto,目前該項目在Facebook中運行超過30000個查詢,每日處理數據PB以上。Presto的查詢速度是Hive的5-10倍。
綜上,Presto是由Facebook2012年開發,基於內存、支持並行計算的分布式SQL交互式查詢引擎,不是資料庫,支持多種數據源,針對GB~PB數據查詢可以達到秒級返回結果,主要用於秒級查詢OLAP數據分析場景。
Presto官網地址:https://prestodb.io
二、Presto特點
- 多數據源
Presto可以支持MySQL、PostgreSQL、cassandra、Hive、Kafka等多種數據源查詢。
- 支持SQL
Presto支持部分標準SQL對數據進行查詢,並提供SQL shell進行SQL查詢。但是Presto不支持存儲過程,不適合大表Join操作,因為Presto是基於內存的,多張大表關聯可能給內存帶來壓力。
- 擴展性
Presto有很好的擴展向,可以自定義開發特定數據源的Connector,使用SQL分析指定Connector中的數據。
- 混合計算
在Presto中可以根據業務需要使用特定類型的Connector來讀取不同數據源的數據,進行join關聯計算。
- 基於內存計算,高性能
Presto是基於內存計算的,減少磁碟IO,計算更快。Presto性能是Hive的10倍以上。Presto能夠處理PB級別的數據,但Presto並不是把PB級別的數據一次性加載到內存中計算,而是根據處理方式,例如:聚合場景,邊讀取數據,聚合,再清空內存,再去讀取數據加載內存,再聚合計算,再清空內存... 這種方式。如果使用Join查詢,那麼就會產生大量的中間數據,速度會變慢。
- 流水線
由於Presto是基於PipeLine進行設計的,因此在進行海量數據處理過程中,終端用戶不用等到所有的數據都處理完成才能看到結果,而是可以向自來水管一樣,一旦計算開始,就可以產生一部分結果數據,並且結果數據會一部分接一部分的返回到客戶端。
三、Presto架構
Presto查詢引擎是一個Master-Slave的架構,由一個Coordinator節點,一個Discovery Server節點,多個Worker節點組成,Discovery Server通常內嵌於Coordinator節點中。Presto架構圖如下:
上圖中各個角色功能如下:
- Presto Coordinator:
主要負責解析SQL語句,生成執行計劃,分發執行任務給Worker節點執行。所有的Worker啟動後都會註冊給Discovery Server,Coordinator通過內嵌的Discovery Server來知道將任務發送給哪些個Worker節點。
- Presto Worker:
主要負責實際執行查詢任務,Worker節點啟動之後,向Discovery Server服務註冊,Coordinator從Discovery Server獲得可以正常工作的Worker節點。當Worker接收到task後,就會到對應的數據源通過各種Connnector將數據提取出來。
- Hive Metastore(配置Hive Connector才會有)
Presto通過Hive Connector讀取Hive數據時,配置Hive Metastore服務為Presto提供Hive元數據信息,可以讓Worker節點與HDFS交互讀取數據。