基于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_db
和blog_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.>/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
相关文章