浅析大数据OLAP引擎-Presto

政采云技术团队.png

时光.png

一、什么是 Presto

1.1 起源

Presto 是由 Facebook 开源的一个 OLAP (On-Line Analysis Processing) 查询引擎,主要是为了支持当时 Facebook 内部科学家和分析师进行数据分析实验。在使用 Presto 前,Facebook 内部主要依赖 Hive 进行数据分析,而 Hive 是使用 MapReduce 作为底层计算框架,并不能很好地满足交互式查询的需求。基于上述情况以及试用了一些外部项目后,2012 年,Facebook 最终决定自研解决内部的数据分析需求,于是 Presto 应运而生,并在 2013 年正式开源。

当前 Presto 主要存在两大分支,一个是以 Facebook 为主导主要解决企业内部需求功能为主的版本,项目名为 PrestoDB ;另一个是由 Presto 几位创始人和 Presto 基金会为主导,更加通用化的 Presto 版本,项目名为 Trino 。

1.2 适用场景

Presto 诞生之初的定位就是高速、实时的数据分析查询引擎,所以各类数据分析、报表查询和低延时查询需求的场景都是 Presto 发挥能力的地方。

二、Presto 的特点及优缺点

2.1 特点

  1. Presto 是完全基于内存的分布式大数据查询引擎,它本身不存储任何数据信息,因为所有查询和计算都在内存中执行,不需要磁盘 IO ,所以查询和计算都更快。
  2. Presto 支持多种数据源,如 Hive、MySQL、PostgreSQL、Kafka 等,同时支持联邦查询(跨数据源查询)。
  3. Presto 支持 sql 查询,对用户的操作使用十分友好。
  4. Presto 可以对 sql 的查询过程进行优化,包括 sql 本身的执行计划优化,以及用分布式查询提高并发等。
  5. Presto 支持数据处理的流水过程显示化,即用户可以在操作终端看到数据处理的整个流程。

2.2 优点

  1. Presto 支持 PB 级数据查询,是完全基于内存的计算,减少了磁盘 IO,查询计算更快。
  2. Presto 虽然是基于内存计算,但是是边读数据边计算,计算完成后会清内存,而不是将所有数据都放入内存中计算。
  3. 支持多种数据源,支持联邦查询(跨数据源查询)。
  4. 具有高拓展性及灵活性,支持二次开发,有很多丰富的函数和算子。

2.3 缺点

  1. 因为所有的查询计算都是基于内存完成,所以对内存的需求较大。
  2. 当多表 join 查询时,虽然是分批读取数据至内存并计算,但会产生大量的临时数据而影响查询性能。
  3. Presto 的主节点 Coordinator 是单实例部署,若 Coordinator 不可用,会导致 Presto 的整体不可用。
  4. Presto 的 1 个 query 是分发到多个 Worker 上执行的,任意一个 Worker 失败都会导致整个查询失败,容错能力较差。
  5. Presto 的所有 task 是并行执行,如果有任意一个 Worker 的查询很慢,会影响整个查询的速度。

三、Presto 整体架构

3.1 整体架构

presto 架构图 (2).jpg

3.1.1 Sql Client

通常使用的是 Presto 官方提供的 Presto Cli 包,这是一个 jar 包,PrestoDB 版本依赖 JAVA8 及以上,Trino 依赖 JAVA11 及以上。

Presto Cli 的作用是提供基于命令行的交互界面,帮助用户将 sql 提交至 Presto。

3.1.2 Coordinator

Coordinator 是 Presto 的核心,Presto 的架构是 Master-Slave 架构,其中 Master 就是 Coordinator 节点,它负责解析 sql 语句,生成执行计划,分发执行任务给各个 worker 节点。

3.1.3 Worker

Worker 的工作是执行任务和处理数据。Worker 节点通过 SPI 从 Connector 获取数据,同时各个  Worker 之间相互交换中间数据。Coordinator 负责从 Worker 处获取最终结果并将结果返回给 Sql Client 端。

3.1.4 Connector

Presto 以插件形式对数据存储层进行了抽象,也就是 Connector。Connector 的作用是使 Presto 适配 Hive 或其他类型数据库等不同的数据源。

Presto 包含多个内置的 Connector,例如 Hive Connector、MySQL Connector、Kafka Connector 等,同时 Presto 支持用户自定义开发 Connector 用于支持个性化数据源。

3.1.5 Discovery Service

Discovery Service 是用于协调 Coordinator 和 Worker 的服务,通常部署在 Coordinator 节点上。

Worker 节点启动后向 Discovery Service 服务注册,Coordinator 从 Discovery Service 获取可用的 Worker 节点信息。

3.2 一次查询的查询过程

  1. 用户通过 Sql Client 提交 sql,Client 负责将 Sql Query 提交给 Presto 集群。一般使用 Presto 自带的 Sql Client,它可以处理分批返回的结果,并在终端展示给用户。
  2. 由于 Presto 本身不存储任何数据信息,所有查询所需要的元数据信息和实际信息均来自于外部存储系统,如 HDFS、MySQL 等。以 Hive 为例,查询所需的元数据信息来自于 HiveMetastore,数据来自于 HDFS,通过 Presto 执行计算的方式来加快查询 Hive 的速度。
  3. Presto Coordinator 负责接收 Sql Query,生成执行计划,拆分 Stage 和 Task,调度执行的任务到 Presto Worker 上。
  4. Presto Worker 负责执行接收到的 HttpRemoteTask,根据执行计划确定哪些 Operator 以及它们的执行顺序,每个 Task 通过 SPI 从 Connector 获取数据,同时上游的 Task 查询计算完成后会将数据传递给下游 Task,整个 Sql Query 的所有 Stage 中的所有 Task 执行完成后,会汇总至 Stage Worker 上的 Task,并将最终结果返回给 Sql Client。

presto 查询流程图 .jpg

四、Presto 在政采云数据平台的应用

4.1 数据网关

数据平台支撑其他团队的数据需求时,统一通过自研的数据网关应用透出,其中 40%以上接口使用 Presto 作为查询引擎进行查询。

4.2 数据可视化平台

数据平台的数据可视化平台包括报表、大屏、报告和看板等多种可视化展现形式,其中报表基于 Presto 实现灵活的自定义配置报表需求,大屏、报告和看板依赖数据网关接口实现可视化界面。

4.3 BI 分析、取数和看板

当前公司内 BI 进行数据分析以及支持其他业务团队的取数需求时,主要通过 Metabase 平台实现,Metabase 本身支持多种数据源的数据查询获取,其中 Presto 支撑了绝大多数 Metabase 上的查询、看板和取数需求。

五、Presto 的快速入门

Presto 的本地搭建部署十分简单。以下以 PrestoDB 版本为例。

5.1 下载及解压

从 PrestoDB 官网下载 presto-server 包。解压至本地 bigdata 文件夹。下载 presto-cli 包(presto 客户端),移动至 presto-server 文件夹,重命名为 presto 并赋予执行权限。

# presto-server
mkdir bigdata
mv presto-server-xxx.tar.gz bigdata
cd bigdata
tar -zxf presto-server-xxx.tar.gz
​
# presto-cli
mv presto-cli-xxx-executable.jar presto-server-xxx
cd presto-server-xxx
mv presto-cli-xxx-executable.jar presto
sudo chmod +x presto

5.2 配置

进入 presto-server 文件夹内,新建 /etc 文件夹,并在其中配置 node.properties config.properties 文件、jvm.config 文件和 log.properties,新建 catalog 文件夹,其中为 catalog 配置信息。

5.2.1 node.properties

# 环境名称,所有 Presto 集群的节点必须有相同的环境名称
node.environment=production
# 唯一标识符,每个节点必须唯一
node.id=ffffffff-ffff-ffff-ffff-ffffffffffff
# 存储日志和其他数据的路径
node.data-dir=/{localhost}/bigdata/data/presto

5.2.2 config.properties

# 允许 Presto 实例作为 Coordinator
coordinator=true
# 允许在 Coordinator 上工作,同时作为 Worker。在大集群中,在 Coordinator 上工作会影响查询性能,这里仅做测试
node-scheduler.include-coordinator=true
# HTTP 服务器端口
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
# Coordinator 的 URI
discovery.uri=http://localhost:8080

5.2.3 jvm.config

-server
-Xmx16G
-XX:+UseG1GC
-XX:G1HeapRegionSize=32M
-XX:+UseGCOverheadLimit
-XX:+ExplicitGCInvokesConcurrent
-XX:+HeapDumpOnOutOfMemoryError
-XX:+ExitOnOutOfMemoryError

5.2.4 log.properties

# 日志级别分别为 INFO、DEBUG、ERROR 三种级别
com.facebook.presto=INFO

5.2.5 catalog 文件夹

catalog 文件夹下配置的是 Presto 使用的 catalog 信息,每一个 catalog 配置文件均对应一个 catalog。Presto 支持 hive、MySQL、PostgreSQL 等众多数据源类型,下面以 hive 和 MySQL 为例。

hive.properties

connector.name=hive-hadoop2
hive.metastore.uri=thrift://{hive metastore}:9083
hive.config.resources=/etc/hive/conf/hive-site.xml,/etc/hadoop/conf/core-site.xml,/etc/hadoop/conf/hdfs-site.xml

mysql.properties

connector.name=mysql
connection-url=jdbc:mysql://{localhost}:3306
connection-user={userName}
connection-password={password}

5.3 启动

通过 /presto-server/bin 目录下的 launcher 启动和停止 Presto 服务。

cd presto-server-xxx
sudo ./bin/launcher start

启动后,可在 http://localhost:8080/ui/ 查看 ui 界面

presto 的 UI 界面.jpg

Presto 启动后,在 /presto-server 目录下,启动 Presto 客户端。

sudo ./presto

presto 启动.jpg

# 停止 presto 服务
sudo ./bin/launcher stop
# 输出 presto 日志,日志位于/var/run 目录下
sudo ./bin/launcher run
# 重启 presto 服务
sudo ./bin/launcher restart

基于上述操作,Presto 的简单搭建部署就完成了,就能使用 Presto 进行愉快的查询了。

presto 查询.jpg

参考文献:Presto: The Definitive Guide(Matt Fuller, Manfred Moser&Martin Traverso)

推荐阅读

自制Http接口调用插件

指标体系的设计和思考

redis 性能分享

基于gitlab ci_cd实现代码质量管理

sharding-jdbc 分享

招贤纳士

政采云技术团队(Zero),一个富有激情、创造力和执行力的团队,Base 在风景如画的杭州。团队现有 500 多名研发小伙伴,既有来自阿里、华为、网易的“老”兵,也有来自浙大、中科大、杭电等校的新人。团队在日常业务开发之外,还分别在云原生、区块链、人工智能、低代码平台、中间件、大数据、物料体系、工程平台、性能体验、可视化等领域进行技术探索和实践,推动并落地了一系列的内部技术产品,持续探索技术的新边界。此外,团队还纷纷投身社区建设,目前已经是 google flutter、scikit-learn、Apache Dubbo、Apache Rocketmq、Apache Pulsar、CNCF Dapr、Apache DolphinScheduler、alibaba Seata 等众多优秀开源社区的贡献者。如果你想改变一直被事折腾,希望开始折腾事;如果你想改变一直被告诫需要多些想法,却无从破局;如果你想改变你有能力去做成那个结果,却不需要你;如果你想改变你想做成的事需要一个团队去支撑,但没你带人的位置;如果你想改变本来悟性不错,但总是有那一层窗户纸的模糊……如果你相信相信的力量,相信平凡人能成就非凡事,相信能遇到更好的自己。如果你希望参与到随着业务腾飞的过程,亲手推动一个有着深入的业务理解、完善的技术体系、技术创造价值、影响力外溢的技术团队的成长过程,我觉得我们该聊聊。任何时间,等着你写点什么,发给 zcy-tc@cai-inc.com

微信公众号

文章同步发布,政采云技术团队公众号,欢迎关注

政采云技术团队.png