本文简单记录一次实践使用过程,涉及presto-mysql,presto-elasticsearch,及关联查询
1 下载安装 presto-0.228
<1>下载
服务端
客户端
相关jar
官方文档:
<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
com.facebook.presto
presto-jdbc
0.228
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.ResultSet;
importjava.sql.Statement;
public classPrestoJdbcDemo {
public static voidmain(String[] args) throwsException{
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();
}
}