1、概述
Presto是一個分布式SQL查詢引擎,用於查詢分布在一個或多個不同數據源中的大數據集。presto可以通過使用分布式查詢,可以快速高效的完成海量數據的查詢。它是完全基於內存的,所以速度非常快。presto不僅可以查詢HDFS,還可以查詢RDMBS數據庫。
具體的介紹可以參考官方:https://prestodb.io/docs/current/overview/concepts.html
presto是facebook開源的,目前很多國內知名企業都在用如唯品會、美團、阿里。
2、部署
目前最新的版本是presto-server-0.189.tar.gz,下載地址:http://maven.aliyun.com/nexus/content/groups/public/com/facebook/presto/presto-server/
相應的cli版本presto-cli-0.189-executable.jar,下載地址:http://maven.aliyun.com/nexus/content/groups/public/com/facebook/presto/presto-cli/
下載需要的版本后,進行解壓並重命名:
# tar xf presto-server-0.189.tar.gz
#mv presto-server-0.189 presto
presto集群包括coordinator(調度節點)和多個worker。 由客戶端提交查詢,從Presto命令行CLI提交到coordinator。 coordinator進行解析,分析並執行查詢計划,然后分發處理隊列到worker
presto需要一個data目錄用來存放logs、etc,建議目錄創建在安裝目錄外面,方便升級。
在安裝目錄中創建一個etc目錄。 在這個etc目錄中放入以下配置信息:
- 節點屬性:每個節點的環境配置信息
- JVM 配置:JVM的命令行選項
- 配置屬性:Presto server的配置信息
- Catalog屬性:configuration forConnectors(數據源)的配置信息
coordinator節點:
#mkdir presto/etc
#ls presto/etc
catalog config.properties jvm.config log.properties node.properties
#cat node.properties
node.environment=huoqiu
node.id=huoqiu_coordinator
node.data-dir=/data/presto/data
- node.environment: 集群名稱。所有在同一個集群中的Presto節點必須擁有相同的集群名稱。
- node.id: 每個Presto節點的唯一標示。每個節點的node.id都必須是唯一的。在Presto進行重啟或者升級過程中每個節點的node.id必須保持不變。如果在一個節點上安裝多個Presto實例(例如:在同一台機器上安裝多個Presto節點),那么每個Presto節點必須擁有唯一的node.id。
- node.data-dir: 數據存儲目錄的位置(操作系統上的路徑)。Presto將會把日期和數據存儲在這個目錄下。
# cat config.properties
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8080
query.max-memory=3GB
query.max-memory-per-node=3GB
discovery-server.enabled=true
discovery.uri=http://192.168.1.202:8080
- coordinator:指定是否運維Presto實例作為一個coordinator(接收來自客戶端的查詢情切管理每個查詢的執行過程)。
- node-scheduler.include-coordinator:是否允許在coordinator服務中進行調度工作。對於大型的集群,在一個節點上的Presto server即作為coordinator又作為worke將會降低查詢性能。因為如果一個服務器作為worker使用,那么大部分的資源都不會被worker占用,那么就不會有足夠的資源進行關鍵任務調度、管理和監控查詢執行。
- http-server.http.port:指定HTTP server的端口。Presto 使用 HTTP進行內部和外部的所有通訊。
- query.max-memory=3GB:一個單獨的任務使用的最大內存 (一個查詢計划的某個執行部分會在一個特定的節點上執行)。 這個配置參數限制的GROUP BY語句中的Group的數目、JOIN關聯中的右關聯表的大小、ORDER BY語句中的行數和一個窗口函數中處理的行數。 該參數應該根據並發查詢的數量和查詢的復雜度進行調整。如果該參數設置的太低,很多查詢將不能執行;但是如果設置的太高將會導致JVM把內存耗光。
- discovery-server.enabled:Presto 通過Discovery 服務來找到集群中所有的節點。為了能夠找到集群中所有的節點,每一個Presto實例都會在啟動的時候將自己注冊到discovery服務。Presto為了簡化部署,並且也不想再增加一個新的服務進程,Presto coordinator 可以運行一個內嵌在coordinator 里面的Discovery 服務。這個內嵌的Discovery 服務和Presto共享HTTP server並且使用同樣的端口。
- discovery.uri:Discovery server的URI。由於啟用了Presto coordinator內嵌的Discovery 服務,因此這個uri就是Presto coordinator的uri。修改example.net:8080,根據你的實際環境設置該URI。注意:這個URI一定不能以“/“結尾。
# cat jvm.config
-server
-Xmx1G
-XX:+UseG1GC
-XX:+ExplicitGCInvokesConcurrent
-XX:+CMSClassUnloadingEnabled
-XX:+AggressiveOpts
-XX:+HeapDumpOnOutOfMemoryError
-XX:OnOutOfMemoryError=kill -9 %p
-XX:ReservedCodeCacheSize=150M
# cat log.properties
com.facebook.presto=INFO
@This would set the minimum level to INFO for both com.facebook.presto.server and com.facebook.presto.hive. The default minimum level is INFO (thus the above example does not actually change anything). There are four levels: DEBUG, INFO, WARN and ERROR.
# cd catalog/
# cat hive.properties
connector.name=hive-hadoop2
hive.metastore.uri=thrift://192.168.1.202:9083
hive.config.resources=/data/hadoop-2.7.3/etc/hadoop/core-site.xml,/data/hadoop-2.7.3/etc/hadoop/hdfs-site.xml
#hive.allow-drop-table=true
# cat jmx.properties
connector.name=jmx
@Presto通過connectors訪問數據。這些connectors掛載在catalogs上。 connector 可以提供一個catalog中所有的schema和表。 例如: Hive connector 將每個hive的database都映射成為一個schema, 所以如果hive connector掛載到了名為hive的catalog, 並且在hive的web有一張名為clicks的表, 那么在Presto中可以通過hive.web.clicks來訪問這張表。
通過在etc/catalog目錄下創建catalog屬性文件來完成catalogs的注冊.
worker節點:
#mkdir presto/etc
#ls presto/etc
catalog config.properties jvm.config log.properties node.properties
#cat node.properties
node.environment=huoqiu
node.id=huoqiu_worker1
node.data-dir=/data/presto/data
- node.environment: 集群名稱。所有在同一個集群中的Presto節點必須擁有相同的集群名稱。
- node.id: 每個Presto節點的唯一標示。每個節點的node.id都必須是唯一的。在Presto進行重啟或者升級過程中每個節點的node.id必須保持不變。如果在一個節點上安裝多個Presto實例(例如:在同一台機器上安裝多個Presto節點),那么每個Presto節點必須擁有唯一的node.id。
- node.data-dir: 數據存儲目錄的位置(操作系統上的路徑)。Presto將會把日期和數據存儲在這個目錄下。
# cat config.properties
coordinator=true node-scheduler.include-coordinator=false http-server.http.port=8082 query.max-memory=7GB query.max-memory-per-node=4GB query.client.timeout=3m query.max-length=100000000 query.min-expire-age=30m discovery-server.enabled=true discovery.uri=http://192.168.1.202:8080
- coordinator:指定是否運維Presto實例作為一個coordinator(接收來自客戶端的查詢情切管理每個查詢的執行過程)。
- node-scheduler.include-coordinator:是否允許在coordinator服務中進行調度工作。對於大型的集群,在一個節點上的Presto server即作為coordinator又作為worke將會降低查詢性能。因為如果一個服務器作為worker使用,那么大部分的資源都不會被worker占用,那么就不會有足夠的資源進行關鍵任務調度、管理和監控查詢執行。
- http-server.http.port:指定HTTP server的端口。Presto 使用 HTTP進行內部和外部的所有通訊。
- query.max-memory=3GB:一個單獨的任務使用的最大內存 (一個查詢計划的某個執行部分會在一個特定的節點上執行)。 這個配置參數限制的GROUP BY語句中的Group的數目、JOIN關聯中的右關聯表的大小、ORDER BY語句中的行數和一個窗口函數中處理的行數。 該參數應該根據並發查詢的數量和查詢的復雜度進行調整。如果該參數設置的太低,很多查詢將不能執行;但是如果設置的太高將會導致JVM把內存耗光。
- query.max-length=100000000: 這個參數在查詢和寫入數據量較大的時候會用到,默認值是1000000。
- discovery-server.enabled:Presto 通過Discovery 服務來找到集群中所有的節點。為了能夠找到集群中所有的節點,每一個Presto實例都會在啟動的時候將自己注冊到discovery服務。Presto為了簡化部署,並且也不想再增加一個新的服務進程,Presto coordinator 可以運行一個內嵌在coordinator 里面的Discovery 服務。這個內嵌的Discovery 服務和Presto共享HTTP server並且使用同樣的端口。
- discovery.uri:Discovery server的URI。由於啟用了Presto coordinator內嵌的Discovery 服務,因此這個uri就是Presto coordinator的uri。修改example.net:8080,根據你的實際環境設置該URI。注意:這個URI一定不能以“/“結尾。
# cat jvm.config
-server -Xmx2G -XX:+UseG1GC -XX:+ExplicitGCInvokesConcurrent -XX:+CMSClassUnloadingEnabled -XX:+AggressiveOpts -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError=kill -9 %p -XX:ReservedCodeCacheSize=150M
# cat log.properties
com.facebook.presto=INFO
@This would set the minimum level to INFO for both com.facebook.presto.server and com.facebook.presto.hive. The default minimum level is INFO (thus the above example does not actually change anything). There are four levels: DEBUG, INFO, WARN and ERROR.
# cd catalog/
# cat hive.properties
connector.name=hive-hadoop2 hive.metastore.uri=thrift://192.168.1.202:9083 hive.config.resources=/data/hadoop-2.7.3/etc/hadoop/core-site.xml,/data/hadoop-2.7.3/etc/hadoop/hdfs-site.xml #hive.allow-drop-table=true
# cat jmx.properties
connector.name=jmx
@Presto通過connectors訪問數據。這些connectors掛載在catalogs上。 connector 可以提供一個catalog中所有的schema和表。 例如: Hive connector 將每個hive的database都映射成為一個schema, 所以如果hive connector掛載到了名為hive的catalog, 並且在hive的web有一張名為clicks的表, 那么在Presto中可以通過hive.web.clicks來訪問這張表。
通過在etc/catalog目錄下創建catalog屬性文件來完成catalogs的注冊.
worker節點只需要修改node.id=huoqiu_worker1,coordinator=false。可以創建多個worker節點。
3、啟動
如果連接hive metastore,需要先配置hive-site.xml
<property> <name>hive.metastore.local</name> <value>false</value> </property> <property> <name>hive.metastore.uris</name> <value>thrift://192.168.1.202:9083</value> </property>
首先要啟動hive metatsore:
# nohup ./hive --service metastore >>/data/nohuo.out 2>&1 &
在安裝目錄下有個bin目錄,有個可執行文件:
launcher
有兩種啟動方式:
1)./launcher run
這種方式是前台運行,日志直接輸出在屏幕上。
2)./launcher start
這種方式是后台運行,會在上面配置的data(node.data-dir=/data/presto/data)生成var目錄,里面是程序的日志,還有etc、plugin的軟鏈接。
4、客戶端
將下載的presto-cli-0.189-executable.jar上傳至服務器,
只能連接coordinator,因為他是整個個入口:
#mv presto-cli-0.189-executable.jar presto
#chmod +x presto
#./presto --server 192.168.1.202:8080 --catalog hive --schema default
presto:default> show tables;
Table
-------
test
(1 row)
Query 20171123_163250_00025_s3abt, FINISHED, 2 nodes
Splits: 18 total, 18 done (100.00%)
0:01 [1 rows, 21B] [0 rows/s, 16B/s]
5、web
http://192.168.1.202:8080
QA:
1、最近在使用presto的時候碰到一個請求報錯:
[Simba][Presto] (1060) Presto Query Error: Query text length (1012684) exceeds the maximum length (1000000) (35)
超過最大長度限制了,然而去官網並沒有找到相關的參數設置,於是google一番找到一個解決方法,原來有一個可以參數可以修改這個默認值。下面給出鏈接:
https://github.com/prestodb/presto/pull/7001/files#diff-3ac3edac3816e47832034679379d250cR172
import io.airlift.units.Duration; import io.airlift.units.MinDuration; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; @@ -40,6 +41,7 @@ private int initialHashPartitions = 100; private Duration minQueryExpireAge = new Duration(15, TimeUnit.MINUTES); private int maxQueryHistory = 100; private int maxQueryLength = 1_000_000; private Duration clientTimeout = new Duration(5, TimeUnit.MINUTES); private int queryManagerExecutorPoolSize = 5; @@ -160,6 +162,20 @@ public QueryManagerConfig setMaxQueryHistory(int maxQueryHistory) return this; } @Min(0) @Max(1_000_000_000) public int getMaxQueryLength() { return maxQueryLength; } @Config("query.max-length") public QueryManagerConfig setMaxQueryLength(int maxQueryLength) { this.maxQueryLength = maxQueryLength; return this; } @MinDuration("5s") @NotNull public Duration getClientTimeout()
有一個 query.max-length的配置可以修改那個默認值,在配置文件config.properties文件里面添加這個配置,重啟presto server生效,再次嘗試發現問題解決了。
coordinator=true node-scheduler.include-coordinator=false http-server.http.port=8082 query.max-memory=7GB query.max-memory-per-node=4GB query.client.timeout=3m query.max-length=100000000 query.min-expire-age=30m discovery-server.enabled=true discovery.uri=http://192.168.1.202:8080
2、升級presto到0.218版本后,使用presto查詢的時候總是報錯:
Presto Upgraded to 0.218 Version, Corrupted statistics for column "[nickname] BINARY" in Parquet file
原因是存儲的parquet文件有部分是損壞的,而presto在0.216開始添加了一個文件完整性檢測,這個默認是開啟的,可以直接關掉:
# vim catalog/hive.properties
hive.parquet.fail-on-corrupted-statistics=false
重啟服務即可解決。