Presto 0.100 Documentation

9.1. SPI概述

9.1. SPI概述

如果你想要开发一个新的Presto的插件,那么你必须实现SPI定义的接口和方法。

插件能够提供connector(Presto中所有查询的数据都是通过connector提供的)。 即使你的数据源中没有任何基础数据表,但是只要你的数据源实现了Presto中要求的API,你照样可以从你自己定义的数据源中进行查询。

这一章我们将会了解Presto SPI中常用的一些服务接口,以及如果调整这些API来适应你自己的数据源

代码

Presto的SPI源码在Presto source文件夹的presto-spi目录下:

元数据插件

每个插件都代表一个入口点:Plugin接口的实现。 插件的类名通过标准ServiceLoader接口提供给给Presto:在classpath中必须包含一个位于META-INF/services目录下的名为com.facebook.presto.spi.Plugin的源文件。这个文件的内容其实只有一行,这一行就是plugin插件的类名,如下:

com.facebook.presto.example.ExamplePlugin

插件

Plugin接口是新手学习使用Presto SPI的一个很好的入手点。当Presto想要创建某个catalog对应的connector的时候,首先会调用getServices() 方法获得一个ConnectorFactory对象。

ConnectorFactory

ConnectorFactory的实例是Presto通过调用Plugin中的getServices()方法获得的。ConnectorFactory实例就代表一个类型为ConnectorFactory的服务。connector实例就是通过ConnectorFactory创建的。 ConnectorFactory使用单例模式创建Connector的实例,可以返回以下几种类型:

  • ConnectorMetadata
  • ConnectorSplitManager
  • ConnectorHandleResolver
  • ConnectorRecordSetProvider

ConnectorMetdata

ConnectorMetadata中有大量的方法,Presto就是使用ConnectorMetadata中的这些方法对一个特定的data source进行如下操作:遍历所有的schema;遍历所有的table;遍历所有的列;遍历其他的元数据信息

这个接口中的方法太多了,以至于文档中没有全部罗列出来。如果你对这个接口的实现类感兴趣,你可以去看下Example HTTP Connector和Cassandra connector的实现。如果你的基础数据源支持schema,table和column,那么这个接口是很容易实现的。如果你打算使用非传统的数据库[英文原话:If you are attempting to adapt something that is not a relational database (as the Example HTTP connector does),不知道翻译的对不对,^-^],(就像Example HTTP Connector那样),那么你的实现中需要考虑怎样将的你的数据源映射到Presto的schema,table和列。

ConnectorSplitManger

ConnectorSplitManger的作用就是将一个表中的数据分成独立的数据分片,这些数据分片会被分发到各个worker去处理。例如,Hive connector列出每个Hive分区中的文件,并且针对于每个文件创建一个或者多个分片。对于那些没有分区数据的数据源,一个比较好的处理策略就是将一个table中的数据作为一个split处理。这也是Example HTTP connector使用的处理策略。

ConnectorRecordSetProvider

获得了Split数据和表的Column信息之后,ConnectorRecordSetProvider就会针对Split和Columnin信息创建一个RecordCursor对象,Presto就是使用RecordCoursor来读取每一行中对应的Column中的值的。