Presto入門簡介(含和Hive對比)

一、簡介

Presto是由Facebook開發的,是一個運行在多臺服務器上的分佈式查詢引擎,本身並不存儲數據,但是可以接入多種數據源(Hive、Oracle、MySql、Kafka、Redis等),並且支持跨數據源的級聯查詢,比如:
select * from a join b where a.id=b.id;,其中表a可以來自Hive,表b可以來自Mysql。

優勢(相對於Hive):
Presto是一個低延遲高併發的內存計算引擎,相比Hive,執行效率要高很多。
Presto以分析師的需求作爲目標,他們期望響應時間小於1秒到幾分鐘。 Presto終結了數據分析的兩難選擇,要麼使用速度快的昂貴的商業方案,要麼使用消耗大量硬件的慢速的“免費”方案。
那麼,爲什麼presto查詢速度比Hive快?
Presto是常駐任務,接受請求立即執行,全內存並行計算;hive需要用yarn做資源調度,接受查詢需要先申請資源,啓動進程,並且採用mapreduce計算模型,中間結果會經過磁盤。

基礎概念:
catalogs -> 數據源,配置的數據倉庫名稱,不同的數據連接如:hive、mysql
schemas -> 相當於數據庫 database
tables -> 表 tables

接入方式:
Presto的接入方式有多種:presto-cli,pyhive,jdbc,http,golang,SQLAlchemy,PHP等,其中presto-cli命令行模式是Presto官方提供的,以此爲例:
./presto-cli.jar --server 服務IP:端口 --catalog hive --user xxxx --source 'pf=adhoc;client=cli
 

二、安裝及結構

完整安裝包括一個coordinator和多個worker。 由客戶端提交查詢,從Presto命令行CLI提交到coordinator。 coordinator進行解析,分析並執行查詢計劃,然後分發處理隊列到worker。
查詢原理:完全基於內存的並行計算;流水線;本地化計算;動態編譯執行。

由於 Presto 的數據源具有完全解耦、高性能,以及對 ANSI SQL 的支持等特性(包括聯合查詢、左右聯接、子查詢以及一些聚合和計算函數),使得 Presto 在 ETL、實時數據計算、 Ad-Hoc 查詢和實時數據流分析等多個業務場景中均能發揮重要的作用。
由於 Presto 卓越的性能表現,使得 Presto 可以彌補 Hive 無法滿足的實時計算空白,因此可以將 Presto 與 Hive 配合使用:對於海量數據的批處理和計算由 Hive 來完成;對於大量數據(單次計算掃描數據量級在 GB 到 TB)的計算由 Presto 完成。

三、 常用業務場景

1、基於 T+1 數據的實時計算 
在這種業務場景中,用戶並不要求基準數據的實時更新,但是要求每次查詢數據都能夠快速響應。需要 Presto 和 Hive 配合使用來滿足實際的業務需求。每天凌晨通過azkaban 調度 Hive 腳本,根據前一天的數據計算生成中間結果表,生成完畢之後使用 Presto 查詢中間結果表,得出用戶最終所需要的數據。滿足該業務場景的解決方案如下圖:

2、基於 RDBMS 的實時計算 
在這種業務場景中,用戶要求查詢的數據完全實時,即只要業務庫中的數據發生改變,通過 Presto 查詢的時候,就可以查詢到剛剛改變之後的數據。要達到這個效果,我們需要使用合理的機制保證數據實時同步,因此我們使用數據庫複製技術,爲線上的業務數據庫建立實時同步的從庫,然後用 Presto 查詢數據庫中的數據,進而進行計算(請注意:使用官方的 Presto 直接讀取數據庫的性能還太低,因此建議使用JD-Presto 中的 PDBO 從數據庫中讀取數據並進行計算)。滿足該業務場景的解決方案如下圖:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章