本文簡單記錄一次實踐使用過程,涉及presto-mysql,presto-elasticsearch,及關聯查詢
1 下載安裝 presto-0.228
<1>下載
服務端
https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.228/presto-server-0.228.tar.gz
客戶端
https://repo1.maven.org/maven2/com/facebook/presto/presto-cli/0.228/presto-cli-0.228-executable.jar
相關jar
https://repo1.maven.org/maven2/com/facebook/presto/presto-base-jdbc/0.228/presto-base-jdbc-0.228.jar
https://repo1.maven.org/maven2/com/facebook/presto/presto-spi/0.228/presto-spi-0.228.jar
官方文檔:
http://prestodb.github.io/docs/current/connector/elasticsearch.html
<2>安裝:
1> 解壓
tar -zxvf presto-server-0.228.tar.gz
2>創建配置目錄 etc etc/catalog
cd presto-server-0.228/
mk dir etc
mkdir etc
mkdir data
cd etc
mkdir catalog
3>創建config.properties 集群配置
在新建的etc目錄下vim config.properties
文件內容:
#是否為Coordinator調度節點
coordinator=true
#是否也作為work。對於大型集群來說,在coordinator里做worker的工作會影響查詢性能
node-scheduler.include-coordinator=true
#指定HTTP端口。Presto使用HTTP來與外部和內部進行交流
http-server.http.port=9080
#查詢能用到的最大總內存
query.max-memory=8GB
#查詢能用到的最大單結點內存
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
#Presto使用Discovery服務去找到集群中的所有結點。每個Presto實例在啟動時都會在Discovery服務里注冊。這樣可以簡化部署, 不需要額外的服務,Presto的coordinator內置一個Discovery服務。也是使用HTTP端口
discovery-server.enabled=true
#Coordinator節點的域名或者IP,Presto使用Discovery服務去找到集群中的所有結點。每個Presto實例在啟動時都會在Discovery服務里注冊。這樣可以簡化部署, 不需要額外的服務,Presto的coordinator內置一個Discovery服務。也是使用HTTP端口
discovery.uri=http://xinyi:9080
4>創建jvm.config 運行環境配置
在新建的etc目錄下
vim jvm.config
-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
5>創建log.properties 日志配置
在新建的etc目錄下
vim log.properties
com.facebook.presto=INFO
6>創建node.properties ,節點配置
在新建的etc目錄下vim log.properties
文件內容:
#自定義環境名字,Presto集群中的結點的環境名字都必須是一樣的。
node.environment=production
#唯一標識,每個結點的標識都必須是為一的。就算重啟或升級Presto都必須還保持原來的標識。
node.id=ffffffff-ffff-ffff-ffff-fffffffffff1
#數據目錄,Presto用它來保存log和其他數據
node.data-dir=/opt/presto-server-0.228/data
7>啟動
cd /安裝目錄/bin
./launcher start 后台啟動
./launcher stop停止
./launcher run 前台啟動,輸出日志
./launcher restart 重啟
8> JDK配置
通過修改presto安裝目錄如: /presto/bin/launther
修改launther,引入jdk1.8。
vim launther
PATH=/jdk安裝目錄/bin:$PATH
exec "$(dirname "$0)/launcher.py" "$@"
9>/安裝目錄/var/log以下位置找到日志文件
launcher.log
server.log
http-request.log
10>查看web界面 http://serverIp:9080/ui/
<3> 安裝客戶端
重命名客戶端jar包presto-cli-0.228-executable.jar為presto 可執行文件
mv presto-cli-0.228-executable.jar presto
使用命令:
./presto --server locahost:9080 --catalog mysql--schema test
2 presto-mysql
<1>在 /etc/catalog/目錄下創建mysql.properties
connector.name=mysql
connection-url=jdbc:mysql://localhost:3306
connection-user=root
connection-password=root
<2>重啟presto-server
/launcher restart
<3>測試
在客戶端安裝目錄執行
./presto --server locahost:9080 --catalog mysql--schema test
presto:es> select * from mysql.test.test;
3 presto-elasticsearch
<1>在 /安裝目錄/etc/catalog/目錄下創建elasticsearch.properties
connector.name=elasticsearch
#elasticsearch.default-schema=default
#指定表定義文件所在目錄
elasticsearch.table-description-directory=etc/elasticsearch/
elasticsearch.scroll-size=1000
elasticsearch.scroll-timeout=2s
elasticsearch.request-timeout=2s
elasticsearch.max-request-retries=5
elasticsearch.max-request-retry-time=10s
<2>創建elasticsearch目錄
cd /安裝目錄/etc/
mkdir elasticsearch
cd elasticsearch
<3>定義表的描述文件(自定義表名.json)
每個表對應建立json映射文件,定義表名,es地址,索引名,類型,字段對應格式
cd elasticsearch
vim test.json
{"tableName": "es_test",
"schemaName": "es",
"host": "es-ip地址",
"port": 9300,
"clusterName": "my-application",
"index": "test",
"indexExactMatch": false,
"type": "test",
"columns": [
{
"name": "name",
"type": "varchar",
"jsonPath":"name",
"jsonType":"varchar"
},
{
"name": "age",
"type": "integer",
"jsonPath":"age",
"jsonType":"integer"
}
]
}
<4>重啟presto-server
/launcher restart
<5>測試
./presto --server locahost:9080 --catalog elasticsearch --schema es
presto:es> select * from elasticsearch.es.es_test;
name | age
------+-----
HL | 12
HLl | 18
(2 rows)
4 多數據源查詢
./presto --server locahost:9080 --catalog elasticsearch --schema es
presto:es> select * from mysql.test.user t left join elasticsearch.es.es_test t1 on t.age=t1.age;
5 JDBC-JAVA
<dependency>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-jdbc</artifactId>
<version>0.228</version>
</dependency>
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class PrestoJdbcDemo {
public static void main(String[] args) throws Exception{
Class.forName("com.facebook.presto.jdbc.PrestoDriver");
Connection connection = DriverManager.getConnection("jdbc:presto://localhost:9080/mysql/test","root",null); ;
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("select * from mysql.test.user t left join elasticsearch.es.es_test t1 on t.age=t1.age");
while (rs.next()) {
System.out.println(rs.getString(1));
}
rs.close();
connection.close();
}
}