1.说明
1.1PrestoDB是facebook开源的支持多数据源混合查询的一个计算引擎,他的最大特点:1.查询速度快 2.支持多数据源在一条SQL语句中混合查询 3.基于内存的查询。本文主要说明将不同数据源配置进PrestoDB中,使他实现多数据源查询。现在以:Greenpluml和Mysql这2种数据源为例。
2.Mysql数据源
2.1进入Presto的安装目录:
cd /opt/local/presto-server-0.221/
这里选择etc文件夹,该文件夹是Presto的配置文件夹
2.2进入etc配置文件夹
#cd etc/
#ll
里面的catalog文件夹,该文件夹就相当于一个数据库实例,所有的数据库连接都放在该文件夹下
2.3进入catalog文件夹,并创建mysql.properties数据库连接
vim mysql.properties
这里的mysql.properties文件名可以取其他名字,比如:Mymysql.properties,但是properties尾缀一定要是这个。以后进行多数据源查询时,字段全名是:文件名.主题名.表名,比如:查表aa:Mymysql.datacube.aa
2.4编写mysql.properties的连接内容
#vim mysql.properties
connector.name=mysql
connection-url=jdbc:mysql://10.0.18.13:3306
connection-user=root
connection-password=HWW123_yu@qing
(1).其中:
connector.name:他是数据库连接池的名字,需要按固定要求填写,mysql就写mysql,这样PrestoDB内部会根据这个连接名匹配 相应数据库驱动。
connection-url:写的是数据源的url地址,注意不同的数据源,这个url是不一样的,如果不按照规则写将会导致启动PrestoDB失败,或者查询不到信息爆:Query failed (#20190402_122809_00002_c3a4r): Driver returned null connection之类的错误.mysql
数据库在写url时不写主题名,只写 jdbc:mysql://192.168.1.200:3306 就好,写了会报错。
connection-user:数据源的用户名
connection-password:数据源密码
(2). ***.properties就相当于mysql数据库实例里面的datacube,他是一个数据库
(3).mysql.properties的具体配置,严格参考官方标准:https://prestodb.github.io/docs/current/connector/mysql.html
2.5杀死原先的PrestoDB运行进程,并重启PrestoDB引擎
查找进程ID
#ps -ef
根据进程ID杀死进程
#kill -9 ***
重启引擎
进入PrestoDB目录:
启动命令在bin文件夹中
#cd bin/
控制台启动:该启动可实时查看日志,发现错误,但是一旦关闭控制台将会导致引擎关闭)
launcher run
后台永久启动
launcher start
2.6用同样的方法,分别在其他集群的机子上:
(1).创建mysql.properties
(2).编辑相同的数据源内容
(3).重启PrestoDB
2.7完成!
3.postgresql数据源
3.1进入Presto的安装目录:
这里选择etc文件夹,该文件夹是Presto的配置文件夹
3.2进入etc配置文件夹
#cd etc/
#ll
里面的catalog文件夹,该文件夹就相当于一个数据库实例,所有的数据库连接都放在该文件夹下
3.3进入catalog文件夹,并创建postgresql.properties数据库连接
vim postgresql.properties
connector.name=postgresql
connection-url=jdbc:postgresql://192.168.11.156:5432/botbrain_haike
connection-user=postgres
connection-password=postgres
(1).其中:
connector.name:他是数据库连接池的名字,需要按固定要求填写,greenplum就写postgresql,这样PrestoDB内部会根据这个连接名匹配 相应数据库驱动。
connection-url:写的是数据源的url地址,注意不同的数据源,这个url是不一样的,如果不按照规则写将会导致启动PrestoDB失败,或者查询不到信息。greenplum和postgresql数据库必须是:jdbc:postgresql://example.net:port/database,一定要加上主题名:datacube之类的,不然会爆:Query failed (#20190402_122809_00002_c3a4r): Driver returned null connection之类的错误。
connection-user:数据源的用户名
connection-password:数据源密码
(2). ***.properties就相当于greenplum数据库实例里面的postgres,他是一个数据库
(3).greenplum.properties的具体配置,严格参考官方标准:https://prestodb.github.io/docs/current/connector/postgresql.html
3.4杀死原先的PrestoDB运行进程,并重启PrestoDB引擎
查找进程ID
#ps -ef
根据进程ID杀死进程
#kill -9 ***
重启引擎
完成!
4.在Java中实现跨数据源混合查询
4.1创建Java的Maven项目
4.2在Maven的pom文件中引入驱动包:
<!-- 多数据源驱动实验 -->
<dependency>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-jdbc</artifactId>
<version>0.203</version>
</dependency>
4.3写Main方法实验:
import java.sql.*;
/**
* @Author: 云天
* @Date: 2019/7/1 14:12
* @Explain:
*/
public class Demo {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//使用facebook驱动
Class.forName("com.facebook.presto.jdbc.PrestoDriver");
//url的填写中使用 jdbc:presto://ip地址:端口号/system/runtime 其中system是指默认的catalog内所有的源数据连接,runtime是数据源中默认的schema,这样写后面的SQL语句
//需要指定具体的数据源连接名和schema名,实现跨库混合查询
Connection connection = DriverManager.getConnection("jdbc:presto://10.0.18.12:8001/system/runtime","root",null);
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT b.name FROM mysql.datecube.btable AS a LEFT JOIN postgresql.public.aaaa AS b on a.cc=b.expand_field");
while (rs.next()) {
System.out.println(rs.getString(1));
}
rs.close();
connection.close();
}
}
注意:
(1)其中Connection 的url填写:jdbc:presto://ip地址:端口号/system/runtime 中system是指默认的catalog内所有的源数据连接,runtime是数据源中默认的schema,这样写后面的SQL语句需要指定具体的数据源连接名和schema名,实现跨库混合查询。
(2)其中Connection 的url填写:jdbc:presto://ip地址:端口号/postgresql/public,如果这样写,则默认查询的SQL是连接上postgresql中的数据源进行查询,且该数据源的表不需要写明 : 数据源文件名.主题名.表名 ,只要写上表名就好。如果要混合其他的表查询,需要指定其他表的连接名和schema名:如下写法:
public class Demo {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Class.forName("com.facebook.presto.jdbc.PrestoDriver");
Connection connection = DriverManager.getConnection("jdbc:presto://10.0.18.12:8001/postgresql/public","root",null);
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT b.name FROM mysql.datecube.btable AS a LEFT JOIN aaaa AS b on a.cc=b.expand_field");
while (rs.next()) {
System.out.println(rs.getString(1));
}
rs.close();
connection.close();
}
}
(3)其中Connection的user和password写法:他只要随便写一个就好,账户不能空,密码可以为空。他是不会校验账户密码的,只是为了满足这个接口的规则而已。