1.1 presto实现多数据源混合查询

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写法:他只要随便写一个就好,账户不能空,密码可以为空。他是不会校验账户密码的,只是为了满足这个接口的规则而已。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值