Presto的多源查询能力是通过 Connector 机制来实现的。其中MySQL、Hana等Connector是主要是通过presto-base-jdbc中的代码来实现对SQL等数据源的读写。

1、Presto-main、spi、base jdbc关系

Java可以作为一种面向接口编程语言。其中presto-spi中主要定义了一些公共接口,供Presto-main中的代码进行调用。

presto-base-jdbc是数据库连接器的公共模块,对Presto-main进行了实现和补充。其代码经过编译后,会对应加载到mysql-plugin等插件中,实现mysql对数据源的访问功能。base-jdbc本身自己不会编译单独的插件。

Presto-core,Pesto SPI,Presto Base JDBC的关系如下图所示:

presto 字符串replace_元数据

2、 spi接口

SPI接口的API可以分为三种类型:

  • 获取表、列和字段类型信息,它们用于验证查询在语义上是否有效,并执行原始查询中表达式的类型检查和安全检查。(Metadata SPI,语法和语义分析阶段)
  • 获取关于行数计数和表大小信息,从而在执行计划时实施基于成本的查询优化。(Data Statistics SPI 在查询计划生成器阶段执行)
  • 简化了分布式查询计划的创建。它被用来生成表内容的逻辑拆分,split 块是工作分配和并行工作的最小单位(Data Location SPI)

presto 字符串replace_元数据_02

这样设计可以方便用户通过插件开发的方式,基于接口进行开发,实现不同的Connector插件,来对接自己的存储系统。presto提供了一套connector接口,从自定义存储中读取元数据,以及列存储数据。connector的基本概念:

  • ConnectorMetadata: 管理表的元数据,表的元数据,partition等信息。在处理请求时,需要获取元信息,以便确认读取的数据的位置。Presto会传入filter条件,以便减少读取的数据的范围。元信息可以从磁盘上读取,也可以缓存在内存中。
  • ConnectorSplit: 一个IO Task处理的数据的集合,是调度的单元。一个split可以对应一个partition,或多个partition。
  • SplitManager : 根据表的meta,构造split。
  • PageSource : 根据split的信息以及要读取的列信息,从磁盘上读取0个或多个page,供计算引擎计算。

插件中主要可以添加的功能:

  • 对接自己的存储系统。
  • 添加自定义数据类型。
  • 添加自定义处理函数。
  • 自定义权限控制。
  • 自定义资源控制。
  • 添加query事件处理逻辑。