一文熟悉 Presto
1. Presto 介绍
1.1 Presto 简介
1.1.1 Presto 概述
Presto是一个分布式SQL查询引擎,用于查询分布在一个或多个异构数据源上的大型数据集。
1.1.2 Presto 架构
1.1.3 官网地址
就在 2020 年 12 月 27 日 ,prestosql 与 facebook 正式分裂 , 并改名为 trino.
https://prestosql.io/
https://trino.io
1.1.4 Prestodb VS Prestosql(trino)
根据目前社区活跃度和使用广泛度 , 更加推荐 prestosql. 具体区别参考博文 :
http://armsword.com/2020/05/02/the-difference-between-prestodb-and-prestosql/
1.2 Prestosql 的安装和使用
1.2.1 prestosql 版本的选择
在 presto330 版本里已经提到 ,jdk8 只支持到 2020-03 月发行的版本 . 详情参考 :
https://prestosql.io/docs/current/release/release-330.html
在 2020 年 4 月 8 号 presto 社区发布的 332 版本开始 , 需要 jdk11 的版本 . 由于现在基本都使用的是 jdk8, 所以我们选择 presto315 版本的 , 此版本在 jdk8 的环境下是可用的 . 如果我们生产环境是 jdk8, 但是又想使用新版的 presto, 可以为 presto 单独指定 jdk11 即可使用 . 最后附录部分会给出使用 jdk11 的配置方式 .
1.2.2 集群安装规划
host |
coordinator |
worker |
linux121 |
√ |
× |
linux122 |
× |
√ |
linux123 |
× |
√ |
1.2.3 Presto Server 的安装
1. 安装包下载地址
https://repo1.maven.org/maven2/io/prestosql/presto-server/315/presto-server-315.tar.gz
2. 将 presto-server-315.tar.gz 上传到服务器上 , 这里导入到 linux121 服务器上的 /opt/software 目录下 , 并解压至 /opt/servers 目录下
Shell
[root@linux121 software]# tar -zvxf presto-server-315.tar.gz -C /opt/servers/
3. 创建 presto 的数据目录 (presto 集群的每台机器都要创建 ). 用来存储日志这些
Shell
[root@linux121 presto-server-315]# mkdir -p /file/data/presto
4. 在安装目录 /opt/servers/presto-server-315 下创建 etc 目录 , 用来存放各种配置文件
Shell
[root@linux121 presto-server-315]# mkdir etc
1.2.4 Node Properties 配置
在 /opt/servers/presto-server-315/etc 路径下 , 配置 node 属性 ( 注意 : 集群中每台 presto 的 node.id 必须不一样 , 后面需要修改集群中其它节点的 node.id 值 )
Shell
[root@linux121 etc]# vim node.properties
# 环境名称 , 自己任取 . 集群中的所有 Presto 节点必须具有相同的环境名称 .
node.environment=develop
# 支持字母 , 数字 . 对于每个节点 , 这必须是唯一的 . 这个标识符应该在重新启动或升级 Presto 时保持一致
node.id=1
# 指定 presto 的日志和其它数据的存储目录 , 自己创建前面创建好的数据目录
node.data-dir=/file/data/presto
1.2.5 JVM Config 配置
在 /opt/servers/presto-server-315/etc 目录下添加 jvm.config 配置文件 , 并填入如下内容
Shell
[root@linux121 etc]# vim jvm.config
# 参考官方给的配置 , 根据自身机器实际内存进行配置
-server
# 最大 jvm 内存
-Xmx15G
-XX:-UseBiasedLocking
# 指定 GC 的策略
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+ExplicitGCInvokesConcurrent
-XX:+ExitOnOutOfMemoryError
-XX:+HeapDumpOnOutOfMemoryError
-XX:ReservedCodeCacheSize=512M
-Djdk.attach.allowAttachSelf=true
-Djdk.nio.maxCachedBufferSize=2000000
1.2.6 Config Properties 配置
The config properties file, etc/config.properties, contains the configuration for the Presto server. Every Presto server can function as both a coordinator and a worker, but dedicating a single machine to only perform coordination work provides the best performance on larger clusters.
Presto 是由一个 coordinator 节点和多个 worker 节点组成 . 由于在单独一台服务器上配置 coordinator 有利于提高性能 , 所以在 linux121 上配置成 coordinator, 在 linux122,linux123 上配置为 worker( 如果实际机器数量不多的话可以将在协调器上部署 worker.) 在 /opt/servers/presto-server-315/etc 目录下添加 config.properties 配置文件
Shell
这是针对 coordinator 所在节点的配置信息 ( 针对 worker 所在节点配置信息后面会配置 .):
[root@linux122 etc]# vim config.properties
# 该节点是否作为 coordinator, 如果是 true 就允许该 Presto 实例充当协调器
coordinator=true
# 允许在协调器上调度工作 ( 即配置 worker 节点 ). 为 false 就是不允许 . 对于较大的集群 , 协调器上的处理工作可能会影响查询性能 , 因为机器的资源无法用于调度 , 管理和监视查询执行的关键任务
# 如果需要在协调器所在节点配置 worker 节点改为 true 即可
node-scheduler.include-coordinator=false
# 指定 HTTP 服务器的端口 .Presto 使用 HTTP 进行所有内部和外部通信
http-server.http.port=7788
# 每个查询可以使用的最大分布式内存量。
query.max-memory=12GB
# 查询可在任何一台计算机上使用的最大用户内存量
query.max-memory-per-node=5GB
# 查询可在任何一台计算机上使用的最大用户和系统内存量,其中系统内存是读取器,写入器和网络缓冲区等在执行期间使用的内存。
query.max-total-memory-per-node=6GB
# 该参数默认值时 -Xmx 的 30%. 且这个值加上 query.max-total-memory-per-node 的值不能大于 -Xmx 的值 . 否则无法启动
memory.heap-heaproom-per-node=2GB
#discover-server 是 coordinator 内置的服务 , 负责监听 worker
discovery-server.enabled=true
# 发现服务器的 URI. 因为已经在 Presto 协调器中启用了 discovery, 所以这应该是 Presto 协调器的 URI
discovery.uri=http://linux121:7788
1.2.7 Catalog Properties 配置
Presto 可以支持多个数据源 , 在 Presto 里面叫 catalog, 这里以配置支持 Hive 和 MySQL 的数据源为例 , 配置一个 Hive 的 catalog 和多个 MySQL 的 catalog:
Shell
# 在 etc 目录下创建 catalog 目录
[root@linux121 etc]# mkdir catalog
Hive 的 catalog:
Shell
# 在 catalog 目录下创建 hive.properties 文件
[root@linux121 catalog]# vim hive.properties
# 代表 hadoop2 代版本 , 并不是单单指 hadoop2.x 的版本 , 而是 hadoop 第二代 . 固定写法
connector.name=hive-hadoop2
# 指定 hive 的 metastore 的地址 (hive 必须启用 metastore)
hive.metastore.uri=thrift://linux123:9083
# 如果 hdfs 是高可用必须增加这个配置 . 如果不是高可用 , 可省略 . 如果 Presto 所在的节点没有安装 Hadoop, 需要从其它 hadoop 节点复制这些文件到 Presto 的节点
hive.config.resources=/opt/servers/hadoop-2.9.2/etc/hadoop/core-site.xml,/opt/servers/hadoop-2.9.2/etc/hadoop/hdfs-site.xml
MySQL 的 catalog( 第一个对接的是 a 业务线的 Mysql):
Shell
# 通过文件名称区分不同的 mysql 数据来源
[root@linux121 catalog]# vim mysql_a.properties
# 配置 Mysql 源 . 这里必须是 mysql
connector.name=mysql
# 指定连接 Mysql 的 url
connection-url=jdbc:mysql://linux123:3306
# 连接 mysql 的主机名
connection-user=root
# 连接 mysql 的密码
connection-password=12345678
MySQL 的 catalog( 第二个对接的是 b 业务线的 Mysql):
Shell
# 通过文件名称区分不同的 mysql 数据来源
[root@linux121 catalog]# vim mysql_b.properties
# 配置 Mysql 源 . 这里必须是 mysql
connector.name=mysql
# 指定连接 Mysql 的 url
connection-url=jdbc:mysql://linux121:3306
# 连接 mysql 的主机名
connection-user=root
# 连接 mysql 的密码
connection-password=123456
1.2.8 分发安装目录到集群中其它节点上
将 linux121 上配置好的 presto 安装包分发到集群中的其它节点 ( 这里使用的是自己写的分发脚本 )
Shell
[root@linux121 servers]# rsync-script /opt/servers/presto-server-315/
1.2.9 修改 node.id
修改 linux122 和 linux123 机器上 node.properties 配置文件中的 node.id( 因为每台机器 node.id 必须要不一样 )
Shell
[root@linux122 etc]# vim node.properties
node.id=2
[root@linux123 etc]# vim node.properties
node.id=3
1.2.10 修改 work 节点的配置信息
修改 worker 节点 ( 即 linux122 和 linux123 机器 ) 上的 config.properties 配置文件 . 里面的配置内容与 coordinator 所在的节点是不一样的 .
Shell
[root@linux122 etc]# vim config.properties
# 该节点是否作为 coordinator, 因为是 worker 节点 , 这里是 false
coordinator=false
# 访问端口 , 可以自己指定
http-server.http.port=7788
# 每个查询可以使用的最大分布式内存量。
query.max-memory=12GB
# 查询可在任何一台计算机上使用的最大用户内存量
query.max-memory-per-node=5GB
# 查询可在任何一台计算机上使用的最大用户和系统内存量,其中系统内存是读取器,写入器和网络缓冲区等在执行期间使用的内存。
query.max-total-memory-per-node=6GB
# 该参数默认值时 -Xmx 的 30%. 且这个值加上 query.max-total-memory-per-node 的值不能大于 -Xmx 的值 . 否则无法启动
memory.heap-heaproom-per-node=2GB
# 指定 discovery-server 的地址 , 这样 worker 才能找到它 . 与上面的端口须一致
discovery.uri=http://linux121:7788
Shell
[root@linux123 etc]# vim config.properties
# 该节点是否作为 coordinator, 如果是 true 就是作为协调器
coordinator=false
# 访问端口 , 可以自己指定
http-server.http.port=7788
# 每个查询可以使用的最大分布式内存量。
query.max-memory=12GB
# 查询可在任何一台计算机上使用的最大用户内存量
query.max-memory-per-node=5GB
# 查询可在任何一台计算机上使用的最大用户和系统内存量,其中系统内存是读取器,写入器和网络缓冲区等在执行期间使用的内存。
query.max-total-memory-per-node=6GB
# 该参数默认值时 -Xmx 的 30%. 且这个值加上 query.max-total-memory-per-node 的值不能大于 -Xmx 的值 . 否则无法启动
memory.heap-heaproom-per-node=2GB
# 指定 discovery-server 的地址 , 这样 worker 才能找到它 . 与上面的端口须一致
discovery.uri=http://linux121:7788
1.2.11 以 presto 用户启动服务
如果是以 root 用户就可以直接启动了 , 我们这里使用 presto 用户启动 , 还需要进行下面的操作 ( 须保证每台已存在 presto 用户 )
1. 将 presto 的数据目录 /file/data/presto 所有者修改为 presto:presto( 使用自己写的脚本一次性修改集群中每个节点 )
Shell
[root@linux121 ~]# myssh chown -R presto:presto /file/data/presto/
2. 将 presto 的安装目录 /opt/servers/presto-server-315 所有者修改为 presto:presto
Shell
[root@linux121 ~]# myssh chown -R presto:presto /opt/servers/presto-server-315/
1.2.12 启动 presto 服务
分别在 linux121,linux122,linux123 上启动 Presto Server( 为了连接 hive, 需要先要保证 Hive 的 metastore 是启动的 ), 这里使用后台进程启动的命令 .
Shell
[presto@linux121 presto-server-315]$ bin/launcher start
[presto@linux122 presto-server-315]$ bin/launcher start
[presto@linux123 presto-server-315]$ bin/launcher start
说明 : 若启动有问题去查看日志 . 日志目录在前面指定的数据目录的 var/log 下 , 即 /file/data/presto/var/log 目录下
1.2.13 启动成功后会看到多了一个 PrestoServer 进程
Shell
[presto@linux121 presto-server-315]$ jps
14881 PrestoServer
1.2.14 访问 presto 的 webui 界面
http://linux121:7788
1.3 Presto 命令行 Client 的安装
1. 下载 Presto 的客户端 ( 下载 presto 对应的版本 )
https://repo1.maven.org/maven2/io/prestosql/presto-cli/315/presto-cli-315-executable.jar
2. 将 presto-cli-315-executable.jar 上传至服务器 , 放在 linux121 的 /opt/servers/presto-server-315/bin 目录下 .
3. 为方便使用 , 修改 jar 包名称为 presto
Shell
[presto@linux121 bin]$ mv presto-cli-315-executable.jar presto
4. 给文件增加执行权限
Shell
[root@linux121 presto-server-315]# chmod +x presto
1.4 Presto 的基本使用
1. 启动 presto 客户端并选择连接的数据源 ( 这里以 hive 为例 )
Shell
[presto@linux121 presto-server-315]$ ./presto \
–server linux121:7788 \
–catalog hive \( 可选 )
–schema test \( 可选 )
–user xiaobai ( 可选 )
说明 :
–server 指定的是 coordinator 的地址
–catalog 指定的是连接的数据源 .( 跟配置文件里面的名称一致 )
–schema 指定的是连接哪个数据库 , 这里是 test 数据库
2. Presto 命令行操作
Shell
# 查看所有的数据库
presto:test> show schemas;
# 查看某个库下的所有表
presto:test> show tables;
# 查看一条 sql 查询 (6 亿多条数据比 hive 快很多 )
presto:test> select count(1) from test.test_hive;
_col0
———–
620756992
1.5 Presto 可视化客户端的安装 ( 了解 )
Presto 可视化客户端有多种 . 这里我们选择使用 yanagishima-20.0 版本
1. 将 yanagishima-20.0.zip 安装包上传至 linux121 服务器上
2. 解压 yanagishima-20.0.zip 安装包
Shell
[root@linux121 software]# unzip yanagishima-20.0.zip -d /opt/servers
3. 进入到 /opt/servers/yanagishima-20.0/conf/ 目录下 , 修改 yanagishima.properties 配置文件
Shell
[root@linux121 conf]# vim yanagishima.properties
# 可以删除原文件的内容 , 然后重新填入下面的内容
# 指定 jetty 的端口 , 类似 tomcat 的 web 容器的一个组件
jetty.port=8080
# 指定数据源
presto.datasources=presto_test
presto.coordinator.server.presto_test=http://linux121:7788
catalog.presto_test=hive
schema.presto_test=ods
sql.query.engines=presto
4. 启动 yanagishima
Shell
[root@linux121 yanagishima-20.0]# nohup bin/yanagishima-start.sh 1>/dev/null 2>&1 &
5. webUI 访问界面
http://linux121:8080/
1.6 附录 ( 补充知识 )
1.6.1 使用新版的 Presto 为其单独配置 jdk11
在 presto 的各集群节点上安装 jdk11.0.9( 注意不要配置 jdk11 的 JAVA_HOME. 这里是在 /opt/servers/jdk-11.0.9 目录下 . 然后在 $PRESTO_HOME/bin/launcher 文件中增加下面 1 行参数 :
Shell
PATH=/opt/servers/jdk-11.0.9/bin/:$PATH
注意 : 一定要加在 exec “$(dirname “$0″)/launcher.py” “$@” 之前 !!!
然后按照上面的配置好之后 , 就可启动 presto 了 .
1.6.2 修改 Presto 访问 HDFS 的用户名
当 Kerberos 没有与 HDFS 一起使用时 ,Presto 默认将使用启动 Presto 进程的 OS 用户访问 HDFS( 即操作系统用户 ). 例如 , 如果 Presto 是以 root 用户运行的 , 它访问 HDFS 的权限即为 root 用户的权限 . 如果需要修改该用户 , 可以在 $PRESTO_HOME/etc/jvm.config 中设置系统属性来覆盖默认使用的用户 . 比如以 xiaobai 用户来访问 , 增加如下 :
Shell
-DHADOOP_USER_NAME=xiaobai
1.6.3 Presto-338 版本之前查询 MySQL 时可能遇到的 Bug
在实际场景中 , 我们对于 smallint,int 等整数类型的值都是使用的无符号类型的 , 所以它存的值比标准的会大一倍 . 这时如果使用 Presto 查询时可能会遇到 “outside valid range… 的错误 “. 这个问题在 338 版本中被修复 , 具体可参考 github 的代码 :
https://github.com/trinodb/trino/commit/ed1c554acf31db6bab9d2f971419e798ab15289a
1.6.4 Presto WebUI 监控页面的含义
1.6.5 使用 Presto sql 实现几个常见的 SQL 场景
场景 1: 分组求 topN
SQL
–1. 在 hive 的 test 库下车间 presto1 表
create table hive.test.presto1(
“sid” int comment ‘ 学生 id’,
“sname” varchar(50) comment ‘ 学生姓名 ‘,
“cname” varchar(50) comment ‘ 班级名称 ‘,
“total_score” int comment ‘ 考试总分 ‘
)
;
–2. 往表中插入数据
insert into hive.test.presto1 values(1101,’ 孙悟空 ‘,’1 班 ‘,500),(1102,’ 猪八戒 ‘,’1 班 ‘,600),(1103,’ 如来佛祖 ‘,’1 班 ‘,600)
,(1104,’ 观音菩萨 ‘,’2 班 ‘,480),(1105,’ 姜子牙 ‘,’2 班 ‘,500),(1106,’ 李达康 ‘,’2 班 ‘,550)
,(1107,’ 王瞎子 ‘,’3 班 ‘,500),(1108,’ 姜子牙 ‘,’3 班 ‘,500),(1109,’ 凤姐 ‘,’3 班 ‘,550),(1110,’ 张无忌 ‘,’3 班 ‘,480)
;
–3. 查看数据
select * from hive.test.presto1;
–4. 计算出每个班级总分排在前 2 名的学生信息 ( 分数相同就名次并列 . 如果第一名有 2 个并列 , 那么分数第 2 的就排名第 3 了 ). 语法与 hive 一模一样
select
sid
,sname
,cname
,total_score
from
(
select
sid
,sname
,cname
,total_score
,rank() over(partition by cname order by total_score desc) as dn
from hive.test.presto1
)t1
where dn<=2
;
场景 2: 求连续
SQL
–1. 创建 hive.test.presto2 表
create table hive.test.presto2(
“user_id” int comment ‘ 用户 id’,
“login_time” varchar(50) comment ‘ 登陆时间 . 精确到秒 ‘
)
;
–2. 往表中插入数据
insert into hive.test.presto2 values(1001,’2020-12-30 12:10:15′),(1001,’2020-12-30 13:10:15′),(1001,’2020-12-31 10:00:00′),(1001,’2021-01-01 15:00:00′)
,(1002,’2020-12-25 12:10:15′),(1002,’2020-12-26 13:10:15′),(1002,’2020-12-27 10:00:00′)
,(1003,’2020-12-25 12:08:50′),(1003,’2020-12-25 13:10:15′),(1003,’2020-12-26 10:00:00′),(1003,’2020-12-26 11:00:00′),(1003,’2020-12-28 18:00:00′)
;
–3. 查询表的数据
select * from hive.test.presto2 order by user_id,login_time;
–4. 求出连续 3 天都有登陆的用户 id( 语法与 hive 有一些区别 )
select
distinct user_id
from
(
select
user_id
,date_add(‘day’,-rn,date(login_date)) as date_diff
from
(
select
user_id
,login_date
,row_number() over(partition by user_id order by login_date) as rn
from
(
select
user_id
,format_datetime(cast(login_time as timestamp),’yyyy-MM-dd’) as login_date
from hive.test.presto2
group by user_id,format_datetime(cast(login_time as timestamp),’yyyy-MM-dd’)
)t1
)t2
)t3
group by user_id,date_diff
having count(user_id)>=3
;
说明 : 写 sql 使用的工具是 dbeaver 连接 presto.
投稿来自群友!!!
你要悄悄学会HBase,然后惊艳所有人(1.7万字建议收藏)
一文带你深入了解kafka并提供52道企业常见面试题(1.8W字建议收藏)
非常全面的DolphinScheduler(海豚调度)安装使用文档