一文熟悉Presto(万字长文,建议收藏)

风格不统一 提交于 2021-01-19 04:32:19

1. Presto介绍

1.1 Presto简介

1.1.1 Presto概述

Presto是一个分布式SQL查询引擎,用于查询分布在一个或多个异构数据源上的大型数据集。

1.1.2 Presto架构

 

1.1.3 官网地址

就在20201227,prestosqlfacebook正式分裂,并改名为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

202048presto社区发布的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属性(注意:集群中每台prestonode.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

#该参数默认值时-Xmx30%.且这个值加上query.max-total-memory-per-node的值不能大于-Xmx的值.否则无法启动

memory.heap-heaproom-per-node=2GB

#discover-servercoordinator内置的服务,负责监听worker

discovery-server.enabled=true

#发现服务器的URI.因为已经在Presto协调器中启用了discovery,所以这应该是Presto协调器的URI

discovery.uri=http://linux121:7788


1.2.7 Catalog Properties配置

Presto可以支持多个数据源,Presto里面叫catalog,这里以配置支持HiveMySQL的数据源为例,配置一个Hivecatalog和多个MySQLcatalog:


Shell

#etc目录下创建catalog目录

[root@linux121 etc]# mkdir catalog

Hivecatalog:


Shell

#catalog目录下创建hive.properties文件

[root@linux121 catalog]# vim hive.properties

#代表hadoop2代版本,并不是单单指hadoop2.x的版本,而是hadoop第二代.固定写法

connector.name=hive-hadoop2

#指定hivemetastore的地址(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

MySQLcatalog(第一个对接的是a业务线的Mysql):


Shell

#通过文件名称区分不同的mysql数据来源

[root@linux121 catalog]# vim mysql_a.properties

#配置Mysql.这里必须是mysql

connector.name=mysql

#指定连接Mysqlurl

connection-url=jdbc:mysql://linux123:3306

#连接mysql的主机名

connection-user=root

#连接mysql的密码

connection-password=12345678

MySQLcatalog(第二个对接的是b业务线的Mysql):


Shell

#通过文件名称区分不同的mysql数据来源

[root@linux121 catalog]# vim mysql_b.properties

#配置Mysql.这里必须是mysql

connector.name=mysql

#指定连接Mysqlurl

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

修改linux122linux123机器上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节点(linux122linux123机器)上的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

#该参数默认值时-Xmx30%.且这个值加上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

#该参数默认值时-Xmx30%.且这个值加上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,需要先要保证Hivemetastore是启动的),这里使用后台进程启动的命令.


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 访问prestowebui界面

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的端口,类似tomcatweb容器的一个组件

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(注意不要配置jdk11JAVA_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.hivetest库下车间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调优,数据工程师成神之路

数据质量那点事

简述元数据管理

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



本文分享自微信公众号 - 大数据私房菜(datagogogo)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!