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が呼び出すトップレベル関数です。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クラスタのすべてのノード(コーディネーターとワーカー)にインストールする必要があります。