(二)presto实现多数据源混合查询

1.说明

1.1PrestoDB是facebook开源的支持多数据源混合查询的一个计算引擎,他的最大特点:1.查询速度快 2.支持多数据源在一条SQL语句中混合查询 3.基于内存的查询。本文主要说明将不同数据源配置进PrestoDB中,使他实现多数据源查询。现在以:Greenpluml和Mysql这2种数据源为例。

2.Mysql数据源

2.1进入Presto的安装目录:

#cd /home/yangqiangguang/bigdata/installed/presto/presto-server-0.217在这里插入图片描述
2.2展示安装目录文件结构:
#ll
(二)presto实现多数据源混合查询_第1张图片
这里选择etc文件夹,该文件夹是Presto的配置文件夹

2.3进入etc配置文件夹
#cd etc/
#ll
(二)presto实现多数据源混合查询_第2张图片
里面的catalog文件夹,该文件夹就相当于一个数据库实例,所有的数据库连接都放在该文件夹下

2.4进入catalog文件夹,并创建mysql.properties数据库连接
#touch mysql.properties
在这里插入图片描述
这里的mysql.properties文件名可以取其他名字,比如:Mymysql.properties,但是properties尾缀一定要是这个。以后进行多数据源查询时,字段全名是:文件名.主题名.表名,比如:查表aa:Mymysql.datacube.aa
2.5编写mysql.properties的连接内容
#vim mysql.properties

(二)presto实现多数据源混合查询_第3张图片
(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.6杀死原先的PrestoDB运行进程,并重启PrestoDB引擎
查找进程ID
#ps -ef
根据进程ID杀死进程
#kill -9 ***
重启引擎
进入PrestoDB目录:
(二)presto实现多数据源混合查询_第4张图片
启动命令在bin文件夹中

#cd bin/
控制台启动:该启动可实时查看日志,发现错误,但是一旦关闭控制台将会导致引擎关闭)
launcher run
后台永久启动
launcher start

2.7用同样的方法,分别在其他集群的机子上:
(1).创建mysql.properties
(2).编辑相同的数据源内容
(3).重启PrestoDB

2.8完成!

3.Greenplum数据源

3.1进入Presto的安装目录:

#cd /home/yangqiangguang/bigdata/installed/presto/presto-server-0.217在这里插入图片描述
3.2展示安装目录文件结构:
#ll
(二)presto实现多数据源混合查询_第5张图片
这里选择etc文件夹,该文件夹是Presto的配置文件夹

3.3进入etc配置文件夹
#cd etc/
#ll
(二)presto实现多数据源混合查询_第6张图片
里面的catalog文件夹,该文件夹就相当于一个数据库实例,所有的数据库连接都放在该文件夹下

3.4进入catalog文件夹,并创建greenplum.properties数据库连接
#touch greenplum.properties
在这里插入图片描述
这里的greenplum.properties文件名可以取其他名字,比如:MyGreenplum.properties,但是properties尾缀一定要是这个。以后进行多数据源查询时,字段全名是:文件名.主题名.表名,比如:查表aa:MyGreenplum.properties.postgres.aa

3.5编写greenplum.properties的连接内容
#vim greenplum.properties

(二)presto实现多数据源混合查询_第7张图片
(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.6杀死原先的PrestoDB运行进程,并重启PrestoDB引擎
查找进程ID
#ps -ef
根据进程ID杀死进程
#kill -9 ***
重启引擎
进入PrestoDB目录:
(二)presto实现多数据源混合查询_第8张图片
启动命令在bin文件夹中

#cd bin/
控制台启动:该启动可实时查看日志,发现错误,但是一旦关闭控制台将会导致引擎关闭)
launcher run
后台永久启动
launcher start

3.7用同样的方法,分别在其他集群的机子上:
(1).创建greenplum.properties
(2).编辑相同的数据源内容
(3).重启PrestoDB

3.8完成!

4.在Java中实现跨数据源混合查询

4.1创建Java的Maven项目
4.2在Maven的pom文件中引入驱动包:

  
    
      com.facebook.presto
      presto-jdbc
      0.203
    

4.3写Main方法实验:

import java.sql.*;

/**
 * @Author: 杨强光
 * @Date: 2019/4/1   21: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://192.168.1.200:8089/system/runtime","root",null);
    Statement stmt = connection.createStatement();
    ResultSet rs = stmt.executeQuery("SELECT b.name FROM mysql.datecube.btable AS a LEFT JOIN greenplum.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地址:端口号/greenplum/public,如果这样写,则默认查询的SQL是连接上greenplum中的数据源进行查询,且该数据源的表不需要写明 : 数据源文件名.主题名.表名 ,只要写上表名就好。如果要混合其他的表查询,需要指定其他表的连接名和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://192.168.1.200:8089/greenplum/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写法:他只要随便写一个就好,账户不能空,密码可以为空。他是不会校验账户密码的,只是为了满足这个接口的规则而已。

你可能感兴趣的:(数据库)