Worker 与 Coordinator、Worker 通信是通过 REST API。
3)数据源
贯穿下文,你会看到一些术语: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 集群。
- Catelog
一个 Catelog 包含 Schema 和 Connector 。例如,你配置JMX 的 catelog,通过JXM Connector 访问 JXM 信息。当你执行一条 SQL 语句时,可以同时运行在多个 catelog。
Presto 处理 table 时,是通过表的完全限定(fully-qualified)名来找到 catelog。例如, 一个表的权限定名是 hive.test_data.test
,则 test 是表名,test_data 是 schema,hive 是 catelog。
Catelog 的定义文件是在 Presto 的配置目录中。
- Schema
Schema 是用于组织 table。把 catelog 和 schema 结合在一起来包含一组的表。当通过Presto 访问 hive 或 Mysq 时,一个 schema 会同时转为 hive 和 mysql 的同等概念。
- Table
Table 跟关系型的表定义一样,但数据和表的映射是交给 Connector。
1.4 Presto 数据模型
1)Presto 采取三层表结构:
Catalog
:对应某一类数据源,例如 Hive 的数据,或 MySql 的数据
Schema
:对应 MySql 中的数据库
Table
:对应 MySql 中的表
2)Presto 的存储单元包括:
Page
:多行数据的集合,包含多个列的数据,内部仅提供逻辑行,实际以列式存储。
Block
:一列数据,根据不同类型的数据,通常采取不同的编码方式,了解这些编码方式,有助于自己的存储系统对接 presto。
3)不同类型的 Block:
(1)Array 类型 Block,应用于固定宽度的类型,例如 int,long,double。block 由两部分组成:
boolean valueIsNull[]
表示每一行是否有值。T values[]
每一行的具体值
(2)可变宽度的 Block,应用于 String 类数据,由三部分信息组成
Slice
:所有行的数据拼接起来的字符串int offsets[]
:每一行数据的起始偏移位置。每一行的长度等于下一行的起始偏移减去当 前行的起始偏移。boolean valueIsNull[]
: 表示某一行是否有值。如果有某一行无值,那么这一行的偏移量 等于上一行的偏移量。
(3)固定宽度的 String 类型的 block,所有行的数据拼接成一长串 Slice,每一行的长度固定。
(4)字典 block:对于某些列,distinct 值较少,适合使用字典保存。主要有两部分组成:
字典
,可以是任意一种类型的 block(甚至可以嵌套一个字典 block),block 中的每一行按照顺序排序编号。
int ids[]
表示每一行数据对应的 value 在字典中的编号。在查找时,首先找到某一行的 id, 然后到字典中获取真实的值。
1.5 Presto 优缺点
学习一个新的框架,免不了来探讨一下它的优缺点:
通过下面一张图,我们来看看 Presto 中 SQL 运行过程:MapReduce vs Presto
我们可以很明显地感受到,Presto 使用内存计算,减少与硬盘交互
1.5.1 优点
1)Presto 与 Hive 对比,都能够处理 PB 级别的海量