雖然Presto能夠解析SQL,但它不是一個標準的數據庫。不是MySQL、PostgreSQL或者Oracle的代替品,也不能用來處理在線事務(OLTP)html
Presto經過使用分佈式查詢,能夠快速高效的完成海量數據的查詢。做爲Hive和Pig的替代者,Presto不只能訪問HDFS,也能訪問不一樣的數據源,包括:RDBMS和其餘數據源(如Cassandra)。node
圖中各個組件的概念及做用會在下文講述。mysql
使用內存計算,減小與硬盤交互。web
1.Presto與hive對比,都可以處理PB級別的海量數據分析,但Presto是基於內存運算,減小不必的硬盤IO,因此更快。
2.可以鏈接多個數據源,跨數據源連表查,如從hive查詢大量網站訪問記錄,而後從mysql中匹配出設備信息。
3.部署也比hive簡單,由於hive是基於HDFS的,須要先部署HDFS。sql
1.雖然可以處理PB級別的海量數據分析,但不是表明Presto把PB級別都放在內存中計算的。而是根據場景,如count,avg等聚合運算,是邊讀數據邊計算,再清內存,再讀數據再計算,這種耗的內存並不高。可是連表查,就可能產生大量的臨時數據,所以速度會變慢,反而hive此時會更擅長。
2.爲了達到實時查詢,可能會想到用它直連MySql來操做查詢,這效率並不會提高,瓶頸依然在MySql,此時還引入網絡瓶頸,因此會比本來直接操做數據庫要慢。shell
Presto有兩類服務器:coordinator和worker。數據庫
Coordinator服務器是用來解析語句,執行計劃分析和管理Presto的worker結點。Presto安裝必須有一個Coordinator和多個worker。若是用於開發環境和測試,則一個Presto實例能夠同時擔任這兩個角色。 bash
Coordinator跟蹤每一個work的活動狀況並協調查詢語句的執行。 Coordinator爲每一個查詢創建模型,模型包含多個stage,每一個stage再轉爲task分發到不一樣的worker上執行。服務器
Coordinator與Worker、client通訊是經過REST API。網絡
Worker是負責執行任務和處理數據。Worker從connector獲取數據。Worker之間會交換中間數據。Coordinator是負責從Worker獲取結果並返回最終結果給client。
當Worker啓動時,會廣播本身去發現 Coordinator,並告知 Coordinator它是可用,隨時能夠接受task。
Worker與Coordinator、Worker通訊是經過REST API。
貫穿全文,你會看到一些術語:connector、catelog、schema和table。這些是Presto特定的數據源
Connector是適配器,用於Presto和數據源(如Hive、RDBMS)的鏈接。你能夠認爲相似JDBC那樣,但倒是Presto的SPI的實現,使用標準的API來與不一樣的數據源交互。
Presto有幾個內建Connector:JMX的Connector、System Connector(用於訪問內建的System table)、Hive的Connector、TPCH(用於TPC-H基準數據)。還有不少第三方的Connector,因此Presto能夠訪問不一樣數據源的數據。
每一個catalog都有一個特定的Connector。若是你使用catelog配置文件,你會發現每一個文件都必須包含connector.name屬性,用於指定catelog管理器(建立特定的Connector使用)。一個或多個catelog用一樣的connector是訪問一樣的數據庫。例如,你有兩個Hive集羣。你能夠在一個Presto集羣上配置兩個catelog,兩個catelog都是用Hive Connector,從而達到能夠查詢兩個Hive集羣。
一個Catelog包含Schema和Connector。例如,你配置JMX的catelog,經過JXM Connector訪問JXM信息。當你執行一條SQL語句時,能夠同時運行在多個catelog。
Presto處理table時,是經過表的徹底限定(fully-qualified)名來找到catelog。例如,一個表的權限定名是hive.test_data.test,則test是表名,test_data是schema,hive是catelog。
Catelog的定義文件是在Presto的配置目錄中。
Schema是用於組織table。把catelog好schema結合在一塊兒來包含一組的表。當經過Presto訪問hive或Mysq時,一個schema會同時轉爲hive和mysql的同等概念。
Table跟關係型的表定義同樣,但數據和表的映射是交給Connector。
Presto執行ANSI兼容的SQL語句。當Presto提起語句時,指的就是ANSI標準的SQL語句,包含着列名、表達式和謂詞。
之因此要把語句和查詢分開說,是由於Presto裏,語句知識簡單的文本SQL語句。而當語句執行時,Presto則會建立查詢和分佈式查詢計劃並在Worker上運行。
當Presto解析一個語句時,它將其轉換爲一個查詢,並建立一個分佈式查詢計劃(多個互信鏈接的stage,運行在Worker上)。若是想獲取Presto的查詢狀況,則獲取每一個組件(正在執行這語句的結點)的快照。
查詢和語句的區別是,語句是存SQL文本,而查詢是配置和實例化的組件。一個查詢包含:stage、task、split、connector、其餘組件和數據源。
當Presto執行查詢時,會將執行拆分爲有層次結構的stage。例如,從hive中的10億行數據中聚合數據,此時會建立一個用於聚合的根stage,用於聚合其餘stage的數據。
層次結構的stage相似一棵樹。每一個查詢都由一個根stage,用於聚合其餘stage的數據。stage是Coordinator的分佈式查詢計劃(distributed query plan)的模型,stage不是在worker上運行。
因爲stage不是在worker上運行。stage又會被分爲多個task,在不一樣的work上執行。
Task是Presto結構裏是「work horse」。一個分佈式查詢計劃會被拆分爲多個stage,並再轉爲task,而後task就運行或處理split。Task有輸入和輸出,一個stage能夠分爲多個並行執行的task,一個task能夠分爲多個並行執行的driver。
Task運行在split上。split是一個大數據集合中的一塊。分佈式查詢計劃最底層的stage是經過split從connector上獲取數據,分佈式查詢計劃中間層或頂層則是從它們下層的stage獲取數據。
Presto調度查詢,coordinator跟蹤每一個機器運行什麼任務,那些split正在被處理。
Task包含一個或多個並行的driver。Driver在數據上處理,並生成輸出,而後由Task聚合,最後傳送給stage的其餘task。一個driver是Operator的序列。driver是Presto最最低層的並行機制。一個driver有一個輸出和一個輸入。
Operator消費,傳送和生產數據。如一個Operator從connector中掃表獲取數據,而後生產數據給其餘Operator消費。一個過濾Operator消費數據,並應用謂詞,最後生產出子集數據。
Exchange在Presto結點的不一樣stage之間傳送數據。Task生產和消費數據是經過Exchange客戶端。
參考:https://prestodb.io/docs/curr...
1.下載
wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.200/presto-server-0.200.tar.gz
2.解壓
tar -zxvf presto-server-0.200.tar.gz -C /usr/local/
/usr/local/presto-server-0.200則爲安裝目錄,另外Presto還須要數據目錄,數據目錄最好不要在安裝目錄裏面,方便後面Presto的版本升級。
在安裝目錄裏建立etc目錄。這目錄會有如下配置:
結點屬性文件etc/node.properties,包含每一個結點的配置。一個結點是一個Presto實例。這文件通常是在Presto第一次安裝時建立的。如下是最小配置:
node.environment=production node.id=ffffffff-ffff-ffff-ffff-ffffffffffff node.data-dir=/var/presto/data
node.environment: 環境名字,Presto集羣中的結點的環境名字都必須是同樣的。
node.id: 惟一標識,每一個結點的標識都必須是爲一的。就算重啓或升級Presto都必須還保持原來的標識。
node.data-dir: 數據目錄,Presto用它來保存log和其餘數據。
JVM配置文件etc/jvm.config,包含啓動Java虛擬機時的命令行選項。格式是每一行是一個命令行選項。此文件數據是由shell解析,因此選項中包含空格或特殊字符會被忽略。
如下是參考配置:
-server -Xmx16G -XX:+UseG1GC -XX:G1HeapRegionSize=32M -XX:+UseGCOverheadLimit -XX:+ExplicitGCInvokesConcurrent -XX:+HeapDumpOnOutOfMemoryError -XX:+ExitOnOutOfMemoryError
由於OutOfMemoryError會致使JVM存在不一致狀態,因此用heap dump來debug,來找出進程爲何崩潰的緣由。
配置屬性文件etc/config.properties,包含Presto server的配置。Presto server能夠同時爲coordinator和worker,但一個大集羣裏最好就是隻指定一臺機器爲coordinator。
如下是coordinator的最小配置:
coordinator=true node-scheduler.include-coordinator=false http-server.http.port=8080 query.max-memory=50GB query.max-memory-per-node=1GB discovery-server.enabled=true discovery.uri=http://example.net:8080
如下是worker的最小配置:
coordinator=false http-server.http.port=8080 query.max-memory=50GB query.max-memory-per-node=1GB discovery.uri=http://example.net:8080
若是適用於測試目的,須要將一臺機器同時配置爲coordinator和worker,則使用如下配置:
coordinator=true node-scheduler.include-coordinator=true http-server.http.port=8080 query.max-memory=5GB query.max-memory-per-node=1GB discovery-server.enabled=true discovery.uri=http://example.net:8080
coordinator: 是否運行該實例爲coordinator(接受client的查詢和管理查詢執行)。
node-scheduler.include-coordinator:coordinator是否也做爲work。對於大型集羣來講,在coordinator裏作worker的工做會影響查詢性能。
http-server.http.port:指定HTTP端口。Presto使用HTTP來與外部和內部進行交流。
query.max-memory: 查詢能用到的最大總內存
query.max-memory-per-node: 查詢能用到的最大單結點內存
discovery-server.enabled: Presto使用Discovery服務去找到集羣中的全部結點。每一個Presto實例在啓動時都會在Discovery服務裏註冊。這樣能夠簡化部署,不須要額外的服務,Presto的coordinator內置一個Discovery服務。也是使用HTTP端口。
discovery.uri: Discovery服務的URI。將example.net:8080替換爲coordinator的host和端口。這個URI不能以斜槓結尾,這個錯誤需特別注意,否則會報404錯誤。
另外還有如下屬性:
jmx.rmiregistry.port: 指定JMX RMI的註冊。JMX client能夠鏈接此端口
jmx.rmiserver.port: 指定JXM RMI的服務器。可經過JMX監聽。
詳情請查看Resource Groups
Presto經過connector訪問數據。而connector是掛載(mount)在catelog中。connector支持catelog裏全部的schema和table。舉個例子,Hive connector映射每一個Hive數據庫到schema,所以Hive connector掛載在hive catelog(因此能夠把catelog理解爲目錄,掛載),並且Hive包含table clicks在數據庫web,因此這個table在Presto是hive.web.clicks。
Catalog的註冊是經過etc/catalog目錄下的catalog屬性文件。例如,建立etc/catalog/jmx.properties,將jmxconnector掛載在jmx catelog:
connector.name=jmx
查看Connectors查看更多信息。
啓動命令:
bin/launcher start
日誌在val/log目錄下:
launcher.log: 記錄服務初始化狀況和一些JVM的診斷。
server.log: Presto的主要日誌文件。會自動被壓縮。
http-request.log: 記錄HTTP請求。會自動被壓縮。
1.下載 presto-cli-0.200-executable.jar,
2.修更名字 presto-cli-0.200-executable.jar爲 presto
3.修改執行權限chmod +x
4.運行
./presto --server localhost:8080 --catalog hive --schema default