Presto 是由 Facebook 开发的一个分布式 SQL 查询引擎,是专门设计为用来专门进行大数据实时查询计算而设计和开发的产品。它是为了解决 Hive 的 MapReduce 模型太慢以及不能通过 BI 或 Dashboards 直接展现 HDFS 数据等问题。
注意: 虽然 Presto 可以解析 SQL,但它不是一个标准的数据库。不是 MySQL、Oracle 的代替品,也不能用来处理在线事务(OLTP)
Presto 支持在线数据查询,包括 Hive,关系数据库(MySQL、Oracle)以及专有数据存储。一条 Presto 查询可以将多个数据源的数据进行合并,可以跨越整个组织进行分析。
Presto 主要用来处理 响应时间小于 1 秒到几分钟的场景 。
Architect
Coordinator
Coordinator 服务器是用来解析语句,执行计划分析和管理 Presto 的 Worker 节点。Presto 安装必须有一个 Coordinator 和多个 Worker。如果用于开发环境和测试,则一个 Presto 实例 可以同时担任这两个角色。
Coordinator 跟踪每个 Worker 的活动情况并协调查询语句的执行。Coordinator 为每个查询建立模型,模型包含多个Stage,每个Stage再转为Task 分发到不同的 Worker 上执行。
Coordinator 与 Worker、Client 通信是通过 REST API。
Worker
Worker 是负责执行任务和处理数据。Worker 从 Connector 获取数据。Worker 之间会交换中间数据。Coordinator 是负责从 Worker 获取结果并返回最终结果给 Client。
当 Worker 启动时,会广播自己去发现 Coordinator,并告知 Coordinator 它是可用,随 时可以接受 Task。
Worker 与 Coordinator、Worker 通信是通过 REST API。
Data Source
贯穿下文,你会看到一些术语:Connector、Catelog、Schema 和 Table。这些是 Presto 特定的数据源
Connector
Connector 是适配器,用于 Presto 和数据源(如 Hive、RDBMS)的连接。你可以认为 类似 JDBC 那样,但却是 Presto 的 SPI 的实现,使用标准的 API 来与不同的数据源交互。
Presto 有几个内建 Connector:JMX 的 Connector、System Connector(用于访问内建的 System table)、Hive 的 Connector、TPCH(用于 TPC-H 基准数据)。还有很多第三方的 Connector,所以 Presto 可以访问不同数据源的数据。
每个 Catalog 都有一个特定的 Connector。如果你使用 catelog 配置文件,你会发现每个 文件都必须包含 connector.name 属性,用于指定 catelog 管理器(创建特定的 Connector 使用)。 一个或多个 catelog 用同样的 connector 是访问同样的数据库。例如,你有两个 Hive 集群。 你可以在一个 Presto 集群上配置两个 catelog,两个 catelog 都是用 Hive Connector,从而达 到可以查询两个 Hive 集群。
Catalog
一个 Catalog 包含 Schema 和 Connector 。例如,你配置JMX 的 catelog,通过JXM Connector 访问 JXM 信息。当你执行一条 SQL 语句时,可以同时运行在多个 catelog。
Presto 处理 table 时,是通过表的完全限定(fully-qualified)名来找到 catalog。例如, 一个表的权限定名是 hive.test_data.test,则 test 是表名,test_data 是 schema,hive 是 catelog。
Catalog 的定义文件是在 Presto 的配置目录中。
Schema
Schema 是用于组织 table。把 catalog 和 schema 结合在一起来包含一组的表。当通过Presto 访问 hive 或 Mysq 时,一个 schema 会同时转为 hive 和 mysql 的同等概念。
Table
Table 跟关系型的表定义一样,但数据和表的映射是交给 Connector。
数据模型
Presto 采取三层表结构:
- Catalog:对应某一类数据源,例如 Hive 的数据,或 MySql 的数据
- Schema:对应 MySql 中的数据库
- Table:对应 MySql 中的表
Presto 的存储单元包括:
- Page:多行数据的集合,包含多个列的数据,内部仅提供逻辑行,实际以列式存储。
- Block:一列数据,根据不同类型的数据,通常采取不同的编码方式,了解这些编码方式,有助于自己的存储系统对接 presto。