SPI 概述¶
当您实现一个新的 Presto 插件时,您需要实现 SPI 定义的接口并覆盖方法。
插件可以提供额外的 连接器、类型、函数 和 系统访问控制。特别是,连接器是 Presto 中所有查询数据来源:它们支持 Presto 可用的每个目录。
代码¶
SPI 源代码可以在 Presto 源代码树根目录下的 presto-spi
目录中找到。
插件元数据¶
每个插件都标识一个入口点:Plugin
接口的实现。此类名通过标准 Java ServiceLoader
接口提供给 Presto:类路径包含在 META-INF/services
目录中名为 com.facebook.presto.spi.Plugin
的资源文件。此文件的内容是单行,列出了插件类的名称。
com.facebook.presto.example.ExamplePlugin
对于包含在 Presto 源代码中的内置插件,此资源文件会在插件的 pom.xml
文件包含以下行时创建
<packaging>presto-plugin</packaging>
插件¶
Plugin
接口是希望了解 Presto SPI 的开发人员的良好起点。它包含用于检索插件可以提供的各种类的访问方法。例如,getConnectorFactories()
方法是 Presto 在准备创建连接器实例以支持目录时调用的顶级函数,以检索 ConnectorFactory
。对于 Type
、ParametricType
、Function
、SystemAccessControl
和 EventListenerFactory
对象,有类似的方法。
通过 Maven 构建插件¶
插件依赖于 Presto 的 SPI
<dependency>
<groupId>com.facebook.presto</groupId>
<artifactId>presto-spi</artifactId>
<scope>provided</scope>
</dependency>
插件使用 Maven provided
范围,因为 Presto 在运行时提供 SPI 的类,因此插件不应将它们包含在插件程序集中。
还有一些其他依赖项由 Presto 提供,包括 Slice 和 Jackson 注释。特别是,Jackson 用于序列化连接器句柄,因此插件必须使用 Presto 提供的注释版本。
所有其他依赖项都基于插件自身实现所需的依赖项。插件在单独的类加载器中加载,以提供隔离,并允许插件使用与 Presto 内部使用的不同的库版本。
有关示例 pom.xml
文件,请参阅 Presto 源代码树根目录下的 presto-example-http
目录中的示例 HTTP 连接器。
部署自定义插件¶
要将自定义插件添加到 Presto 安装中,请在 Presto 插件目录中为该插件创建一个目录,并将插件所需的所有必要 jar 文件添加到该目录。例如,对于名为 my-functions
的插件,您将在 Presto 插件目录中创建一个名为 my-functions
的目录,并将相关 jar 文件添加到该目录中。
默认情况下,插件目录是相对于 Presto 安装目录的 plugin
目录,但它可以通过配置变量 catalog.config-dir
进行配置。为了让 Presto 识别新插件,您必须重新启动 Presto。
必须在 Presto 集群(协调器和工作节点)中的所有节点上安装插件。