SPI概要

新しいPrestoプラグインを実装する場合、SPIで定義されたインターフェースを実装し、メソッドをオーバーライドします。

プラグインは、追加のコネクタ関数、およびシステムアクセス制御を提供できます。特に、コネクタはPrestoでのクエリのすべてのデータソースであり、Prestoで使用可能な各カタログを支えています。

コード

SPIのソースコードは、Prestoのソースツリーのルートにあるpresto-spiディレクトリにあります。

プラグインメタデータ

各プラグインは、エントリポイント、つまりPluginインターフェースの実装を識別します。このクラス名は、標準のJava ServiceLoaderインターフェースを介してPrestoに提供されます。META-INF/servicesディレクトリには、com.facebook.presto.spi.Pluginという名前のリソースファイルが含まれています。このファイルの内容は、プラグインクラスの名前をリストした1行です。

com.facebook.presto.example.ExamplePlugin

Prestoのソースコードに含まれている組み込みプラグインの場合、プラグインのpom.xmlファイルに次の行が含まれている場合は常に、このリソースファイルが作成されます。

<packaging>presto-plugin</packaging>

プラグイン

Pluginインターフェースは、Presto SPIを理解しようとする開発者にとって、良い出発点となります。プラグインが提供できるさまざまなクラスを取得するためのアクセス methods が含まれています。たとえば、getConnectorFactories()メソッドは、Prestoがカタログをサポートするコネクタのインスタンスを作成する準備ができたときに、ConnectorFactoryを取得するためにPrestoが呼び出すトップレベル関数です。TypeParametricTypeFunctionSystemAccessControl、および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クラスタのすべてのノード(コーディネーターとワーカー)にインストールする必要があります。