背景
MapReduce不能滿足大數據快速實時adhoc查詢計算的性能要求。
Facebook的數據倉庫存儲在少量大型Hadoop/HDFS集群。Hive是Facebook在幾年前專為Hadoop打造的一款數據倉庫工具。
在以前,Facebook的科學家和分析師一直依靠Hive來做數據分析。但Hive使用MapReduce作為底層計算框架,是專為批處理設計的。但隨着數據越來越多,使用Hive進行一個簡單的數據查詢可能要花費幾分到幾小時,顯然不能滿足交互式查詢的需求。Facebook也調研了其他比Hive更快的工具,但它們要么在功能有所限制要么就太簡單,以至於無法操作Facebook龐大的數據倉庫。
2012年開始試用的一些外部項目都不合適,他們決定自己開發,這就是Presto。2012年秋季開始開發,目前該項目已經在超過 1000名Facebook雇員中使用,運行超過30000個查詢,每日數據在1PB級別。Facebook稱Presto的性能比Hive要好上10倍多。2013年Facebook正式宣布開源Presto。
簡介
基於內存的並行計算,Facebook推出的分布式SQL交互式查詢引擎。
多個節點管道式執行。
支持任意數據源,包括Hive、RDBMS(Mysql、Oracle、Tidb等)、Kafka、MongoDB、Redis等。
數據規模GB~PB,是一種Massively parallel processing(mpp)(大規模並行處理)模型。
數據規模PB,並不是把PB數據放到內存,只是在計算中拿出一部分放在內存、計算、拋出、再拿、再計算。
Presto是一個分布式的查詢引擎,本身並不存儲數據,但是可以接入多種數據源,並且支持跨數據源的級聯查詢。
Presto是一個OLAP的工具,擅長對海量數據進行復雜的分析;但是對於OLTP場景,並不是Presto所擅長,所以不要把Presto當做數據庫來使用。
架構
Presto查詢引擎是一個Master-Slave的拓撲架構。
-
由一個Coordinator節點,一個Discovery Server節點,多個Worker節點組成,Discovery Server通常內嵌於Coordinator節點中。
-
Coordinator負責解析SQL語句,生成執行計划,分發執行任務給Worker節點執行。
-
Worker節點負責實際執行查詢任務。Worker節點啟動后向Discovery Server服務注冊,Coordinator從Discovery Server獲得可以正常工作的Worker節點。
-
如果配置了Hive Connector,需要配置一個Hive MetaStore服務為Presto提供Hive元信息,Worker節點與HDFS交互讀取數據。

一個查詢分解為多個stage 每個 stage拆分多個task,每個task處理一個or多個split ,一個task被分解為一個或多個Driver
數據模型
Presto使用Catalog、Schema和Table這3層結構來管理數據。
- Catalog:就是數據源。Hive是數據源,Mysql也是數據源,Hive 和Mysql都是數據源類型,可以連接多個Hive和多個Mysql,每個連接都有一個名字。一個Catalog可以包含多個Schema,可以通過
show catalogs命令看到Presto連接的所有數據源。 - Schema:相當於一個數據庫實例,一個Schema包含多張數據表。
show schemas from 'catalog_name'可列出catalog_name下的所有schema。 - Table:數據表,與一般意義上的數據庫表相同。
show tables from 'catalog_name.schema_name'可查看'catalog_name.schema_name'下的所有表。
在Presto中定位一張表,一般是catalog為根,例如:一張表的全稱為 hive.test_data.test,標識 hive(catalog)下的 test_data(schema)中test表。
可以簡理解為:數據源的大類.數據庫.數據表。
優點 & 特點
多數據源、支持SQL、擴展性(可以自己擴展新的connector)、混合計算(同一種數據源的不同庫 or表;將多個數據源的數據進行合並)、高性能、流水線(pipeline)。
與其他組件的關系及對比
其他組件
hive
數據倉庫、交互式略弱的查詢引擎、只能訪問HDFS文件磁盤
但是presto無法代替hive
Presto是一個低延遲高並發的內存計算引擎,相比Hive,執行效率要高很多。
在使用Hive數據源的時候,如果表是分區表,一定要添加分區過濾,不加分區掃描全表是一個很暴力的操作,執行效率低下並且占用大量集群資源,大家盡量避免這種寫法。
Hive分區就是分目錄,把一個大的數據集根據業務需要分割成更細的數據集。
presto是常駐任務,接受請求立即執行,全內存並行計算;
hive需要用yarn做資源調度,接受查詢需要先申請資源,啟動進程,並且中間結果會經過磁盤。
Spark SQL
基於Spark core mpp模式
kylin
cube預計算
Druid
時序、數據放內存、索引、預計算
MySQL
和MySQL相比,首先Mysql是一個數據庫,具有存儲和計算分析能力,而Presto只有計算分析能力;
其次數據量方面,Mysql作為傳統單點關系型數據庫不能滿足當前大數據量的需求,於是有各種大數據的存儲和分析工具產生,Presto就是這樣一個可以滿足大數據量分析計算需求的一個工具。
缺點
不適合多個大表的join操作,因為presto是基於內存的,太多數據內存放不下的。
如果一個presto查詢查過30分鍾,那就kill吧,說明不適合,也違背了presto的實時初衷。
參考鏈接1:Presto簡介
參考鏈接2:Presto
參考鏈接3:Presto入門介紹
參考鏈接4:Presto原理分析
