Presto 分布式SQL查询引擎及原理分析
前言:
为何是SQL查询引擎?而不是数据库
和Oracle、MySQL、Hive等数据库相比,他们都具有存储数据和计算分析的能力。如MySQL具有 InnoDB存储引擎和有SQL的执行能力;如Hive 有多种数据类型、内外表(且这么叫)的管理能力,且能利用MR、TEZ执行HQL。而Presto并不直接管理数据,他只有计算的能力。
Presto 支持的数据源
常见的RDBMS都支持,如:Oracle、MySQL、PG等;
NoSQL:MongoDB、Redis、ElasticSearch 等;
大数据:Hive、HBase(第三方)、Kudu、Kafka 等;
Presto 支持从多种数据源获取数据来进行运算分析,一条SQL查询可以将多个数据源的数据进行合并分析。如如下SQL:a可以来源于MySQL,b可以来源于Hive。
select a.*,b.* from a join b on(a.id = b.id)
Presto 优势&特点
Presto 应用场景
数据模型
Presto 使用 Catalog、Schema和Table 这3层结构来管理数据。如图:
1.Catalog:就是数据源。每个数据源连接都有一个名字,一个Catalog可以包含多个Schema,大家可以通过show catalogs 命令看到Presto已连接的所有数据源。
show schemas from 'catalog_name'
show tables from 'catalog_name.schema_name
(左右滑动查看全部代码)
在Presto中定位一张表,一般是catalog为根,例如:一张表的全称为 hive.test_data.test,标识hive(catalog)下的 test_data(schema)库中 test 表。
可以简理解为:数据源的类别.数据库.数据表。
可使用:show catalogs查看数据源;show schemas from hive查看数据库实例;show tables from default查看表。
切换当前使用的实例(在同一个数据源内切换无需指定catalog 前缀):use hive.default
Presto接入方式
Presto的接入方式有多种:presto-cli,pyhive,jdbc,SQLAlchemy 等,其中presto-cli 是Presto官方提供的,下面以presto-cli为例展开说明(自行到https://prestosql.io/download.html下载,presto-cli 应和 presto-server 版本相匹配),下载后把 presto-cli-${ver}-executable.jar 移动到 presto_home/bin 下:
mv presto-cli-${ver}-executable.jar presto
chmod +x presto
(左右滑动查看全部代码)
以连接hive数据源为例,在终端输入:
./presto --server host:8088 --catalog hive --schema default
(左右滑动查看全部代码)
先解释下各参数的含义:
-
--server 是presto服务地址; -
--catalog 是默认使用哪个数据源,后面也可以切换; -
--schema hive 数据源内的 default 库,可切换;
Presto 整体架构
coordinator=true
node-scheduler.include-coordinator=true
http-server.http.port=8088
discovery-server.enabled=true
discovery.uri=http://server:8088
coordinator=true
node-scheduler.include-coordinator=false
http-server.http.port=8088
discovery-server.enabled=true
discovery.uri=http://server:8088(左右滑动查看全部代码)
(左右滑动查看全部代码)
coordinator=false
# 如果在同一节点启动两个服务,该端口号要换
http-server.http.port=8088
discovery.uri=http://server:8088
(左右滑动查看全部代码)
Presto SQL执行步骤
1.客户端通过 HTTP 发送一个查询语句给Presto集群的Coordinator;
2.Coordinator 接收到客户端传来的查询语句,对该语句进行解析、生成查询执行计划,并根据查询执行计划依次生成 SqlQueryExecution -> SqlStageExecution -> HttpRemoteTask;
3.Coordinator 将每个Task分发到所需要处理的数据所在的Worker上进行分析;
4.执行Source Stage 的 Task,这些Task通过Connector从数据源中读取所需要的数据;
5.处于下游的Stage中用的Task会读取上游的Stage产生的输出结果,并在该Stage的每个Task所在的Worker内存中进行后续的计算和处理;
6.Coordinator 从分发的Task之后,一直持续不断的从Single Stage 中的Task获得计算结果,并将结果写入到缓存中,直到所所有的计算结束;
7.Client 从提交查询后,就一直监听 Coordinator 中的本次查询结果集,立即输出。直到轮训到所有的结果都返回,本次查询结束;
为何 Presto 能有较高的查询性能?
Presto 发行版
OLAP 众多,如何选型
精选提问:
问1:presto在大数据平台中扮演什么角色,他对标的主流产品有哪些?
答:这个问题应该先回答对标产品,有了定位才能确定角色。Presto 首先是一个 OLAP 引擎,从OLAP范围他可对标 Hive,SparkSQL、Impala、Apache Kylin、Apache Kudu 这类。
实际上Presto 可以代理多种数据源,因此可以作为多种数据库的代理层,尤其是需要夸多种数据源执行SQL的场景。
问2:业界应用Presto的成熟架构方案可以介绍下嘛?
推荐阅读
关于EAWorld:微服务,DevOps,数据治理,移动架构原创技术分享。长按二维码关注!