一文熟悉 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.

投稿来自群友!!!

2020大数据面试题真题总结(附答案)

一文探究数据仓库体系(2.7万字建议收藏)

一文探究Hadoop(3万字长文,建议收藏)

一文带你走进HIVE的世界(1.8W字建议收藏)

一文带你全方位了解Flink(3.2W字建议收藏)

你要悄悄学会HBase,然后惊艳所有人(1.7万字建议收藏)

一文带你深入了解kafka并提供52道企业常见面试题(1.8W字建议收藏)

非常全面的DolphinScheduler(海豚调度)安装使用文档

Hive调优,数据工程师成神之路

数据质量那点事

简述元数据管理

简单聊一聊大数据学习之路