基于Presto实现Mysql跨库数据查询

业务场景:数据从产生到使用需要不同系统之间进行数据的集成或者传递。为保证数据集成过程中数据的可靠性,需要检查集成前后数据质量,常见的检查数据量是否一致、对应行的数值是否一致。

由于集成前后的数据通常是在不同的物理库,甚至是用不同数据库存储的,这时就需要工具支撑跨数据源查询。Facebook的Presto就是当前主流的SQL查询引擎。

环境说明

Win10:物理机系统,安装了VMWare 12 Pro。

Ubuntu 16.04 LTS:在Win10的VMWare 12 Pro下安装的虚拟机系统。MySQL Server、Presto的Coordinator和Worker都安装在这个虚拟机系统上。

依赖项安装

由于服务器一般都是Linux系统,而且presto的启动运行都是基于命令行的,所以我只在Linux下安装试用。

依赖项包括:

  • Linux系统,我使用的是Ubuntu 16.04 LTS
  • Java jdk,我使用的是openjdk 1.8
  • Mysql,我的目的是完成Mysql的跨库查询,所以安装了mysql,版本是5.7.31

ubuntu安装

基于VMware 12 Pro虚拟机软件安装的Ubuntu 16.04 LTS。

具体的安装步骤网上很多,这里不再赘述。

jdk安装

采用的是最简单的命令行方式安装,参考资料:Ubuntu16.04使用命令行安装jdk1.8(超简单)

# 安装jre
sudo apt install openjdk-8-jre-headless
# 安装jdk
sudo apt install openjdk-8-jdk-headless
# 验证安装是否成功
java --version
javac --version
复制代码

mysql安装

采用的是最简单的命令行方式安装,参考资料:Ubuntu16.04环境下MySQL的安装与使用

# 1.更新软件源
sudo apt-get update

# 2.安装mysql
sudo apt-get instll mysql-server mysql-client

# 3.初始化mysql安全脚本
# 会涉及是否修改root账号的密码、是否移除匿名用户、是否允许远程登录、是否删除test数据库等
sudo mysql_secure_installation

# 4.验证安装是否成功
mysql -V

# 5.使用root账号登录, 输入安装时设置的root账号密码
mysql -u root -p
复制代码

mysql数据准备

建两个数据库:blog_master_dbblog_worker_db。在两个数据库中都建表article

-- 数据库 blog_master_db
create database blog_master_db;
use blog_master_db;
CREATE TABLE article (id INT, name VARCHAR(300), created_time DATETIME, view_num INT, com_num INT, channel VARCHAR(20), get_time DATETIME);
INSERT INTO article (id,name,created_time,view_num,com_num,channel,get_time) VALUES(1,"test","2019-11-20 10:00:00",2,1,"bky","2019-11-22 14:00:00");

-- 数据库 blog_worker_db
create database blog_worker_db;
use blog_worker_db;
CREATE TABLE article (id INT, name VARCHAR(300), created_time DATETIME, view_num INT, com_num INT, channel VARCHAR(20), get_time DATETIME);
INSERT INTO article (id,name,created_time,view_num,com_num,channel,get_time) VALUES(100,"jason","2020-10-11 20:00:00",200,100,"btw","2020-10-20 20:00:00");
复制代码

presto安装配置

这部分安装官方教程走就可以了,我目前只使用了最简单的安装配置:presto集群只有1个节点,该节点即作Coordinator用也作Worker用。

如果要安装多个presto节点,则每个节点都要完成presto安装配置的这几个步骤。

**presto节点可以和要访问的数据源安装在不同的机器上。**最开始接触presto时,以为要想通过presto访问某个数据源,该数据源的机器上必须安装presto节点,其实并不需要。

参考资料:2.1. Deploying Presto

安装包下载

我下载的版本是presto-server-0.242.tar.gz,下载后解压即可,解压后的文件夹也就是presto的安装路径。

官方推荐在安装路径外的新建data文件夹用于存储日志,也便于日后presto升级日志文件不用改动。

presto的安装路径:/town/presto-server-0.242/

data文件路径:/var/presto/data/

presto配置

在presto的安装文件夹下新建etc文件夹,该文件夹用于存储以下配置信息

  • Node Properties: environmental configuration specific to each node
  • JVM Config: command line options for the Java Virtual Machine
  • Config Properties: configuration for the Presto server
  • Catalog Properties: configuration for Connectors (data sources)

节点配置

配置文件名固定etc/node.properties,用于存储presto集群下每个节点的信息。我只使用了1个节点,节点最简单的配置如下:

node.environment=production
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
node.data-dir=/var/presto/data
复制代码
  • node.environment: presto集群下每个节点的环境名称必须一致。
  • node.id: 节点id,集群下每个节点的id必须唯一,形式不固定。
  • node.data-dir: 用于存在日志等信息的文件绝对路径,使用安装包下载一节新建的文件夹。

JVM 配置

配置文件名固定etc/jvm.config,存储加载Java虚拟机的配置信息。典型配置如下:

-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError
复制代码

配置属性

配置文件名固定etc/config.properties,存储presto节点(服务器)的配置信息。每个presto节点(服务器)都可以用作Coordinator或者Worker,也可以即作Coordinator也作Worker(我就是这样用的),配置如下:

coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8080
query.max-memory=5GB
query.max-memory-per-node=1GB
query.max-total-memory-per-node=2GB
discovery-server.enabled=true
discovery.uri=http://<当前机器的IP地址>:8080
复制代码

至于节点单独作Coordinator或者Worker的配置信息,参考官方文档即可。

部分配置信息的解释:

  • coordinator: 设置当前presto节点是否用作coordinator.
  • node-scheduler.include-coordinator: Allow scheduling work on the coordinator. 我理解是否允许当前节点兼任worker.
  • http-server.http.port: 设置presto的通信端口.
  • discovery-server.enabled: 是否启用Presto coordinator内嵌的Discovery service,两者共享通信端口.
  • discovery.uri: Discovery server的URI,形式为IP:端口号。

日志配置

可选的日志级别配置文件,文件名固定为etc/log.properties,典型配置信息如下:

com.facebook.presto=INFO
复制代码

Catalog配置

Presto通过连接器connectors连接数据源以获取数据, 而连接器是挂载在目录下。也就是说在presto中1个目录就代表1个数据源。

要使用presto访问某个mysql数据源,在etc/catalog文件夹下创建catalog属性文件,属性文件名称不固定,可以自由命名。比如创建/etc/catalog/demo.properties文件,其配置信息如下:

# 连接器名称. 由数据源类型决定, 如oracle, mysql, hive等.
connector.name=mysql
# 连接信息. 不同数据源类型要配置的连接信息不同.
connection-url=jdbc:mysql://localhost:3306
connection-user=root
connection-password=123456
复制代码

如果查询该数据源blog_worker_db数据库下article表,需要以demo.blog_worker_db.article形式访问。

启动presto

有两种方式启动presto。

# 后台启动
sudo ./bin/launcher start
# 前台启动. 命令行窗口可以看到启动的过程日志
sudo ./bin/launcher run
复制代码

看到如下信息说明前台启动成功:

启动成功后可以在node.data-dir=/var/presto/data对应的文件夹下找到启动日志文件。

presto CLI 提交查询

presto CLI用于向coordinator提交1个查询。

下载presto-cli-0.242-executable.jar, 重命名为 presto并通过 chmod +x将其设置为可执行文件。

启动命令:

# 参数server: coordinator的URI
# 参数catalog: 启用哪个数据源配置文件
# 参数schema: ?
sudo ./presto --server localhost:8080 --catalog demo --schema default
复制代码

执行跨库查询

select * from demo.blog_master_db.article union all select * from demo.blog_worker_db.article;
复制代码

执行结果:

CLI提供了UI界面查看执行记录,访问地址:http://<coordinator的IP>:coordinator端口号

踩坑记录

启动时报错

报错信息:ERROR: [Errno 2] No such file or directory

原因&措施:新的ubuntu系统忘记安装jdk导致的,安装jdk后启动成功。

连接数据源报错

报错信息:could not create connection to database server

原因&措施:catalog配置demo.properties中使用的是mysql连接器,但是在connector.name设置成配置文件的名称,而不是数据源类型导致的。修改为mysql后连接成功。

# 错误配置
connector.name=demo
# 正确配置
connector.name=mysql
复制代码