Presto ローカル開発、プラグイン設定

1. 新しい質問

  • 以前Prestoのローカル開発環境を構築した際にconfig.properties使用したplugin.bundles設定項目により、読み込む必要があるプラグインモジュールが定義されています 詳細はブログ「win10はIDEAベースでPresto開発環境を構築」を参照してください。
  • presto サービスの開始時に、ロードするコンポーネントを指定します。次の 2 つの構成方法があります。
    • オンライン サービスの展開では、通常、構成アイテムが使用されplugin.dir、デフォルト値はインストール パッケージ内のディレクトリですpluginプラグイン ディレクトリ内のすべてのプラグインが読み込まれます。これはオンライン サービスに適しています。
    • ローカル開発の場合、plugin.bundles構成アイテムは通常、サービスを迅速に起動するためにロードする必要があるプラグインを指定するために使用されます。
  • plugin.bundlesその後、ラップトップを交換してローカル開発環境を再構築したところ、プラグインが正常にロードできないことが判明しました。
  • 具体的なエラー情報は次のとおりです。
    2022-07-15T22:54:50.333+0800	ERROR	main	com.facebook.presto.server.PrestoServer	Error loading pom: D:\IdeaProjects\facebook-presto-0.223.1\presto-main\..\presto-memory\pom.xml
    java.lang.RuntimeException: Error loading pom: D:\IdeaProjects\facebook-presto-0.223.1\presto-main\..\presto-memory\pom.xml
    	at io.airlift.resolver.ArtifactResolver.resolvePom(ArtifactResolver.java:143)
    	...
    	at com.facebook.presto.server.PrestoServer.main(PrestoServer.java:77)
    Caused by: org.apache.maven.project.ProjectBuildingException: 1 problem was encountered while building the effective model for com.facebook.presto:presto-memory:0.240
    [FATAL] Non-resolvable parent POM for com.facebook.presto:presto-root:0.240: Could not transfer artifact com.facebook.airlift:airbase:pom:99 from/to central (http://repo.maven.apache.org/maven2): Failed to transfer http://repo.maven.apache.org/maven2/com/facebook/airlift/airbase/99/airbase-99.pom. Error code 501, HTTPS Required and 'parent.relativePath' points at wrong local POM @ com.facebook.presto:presto-root:0.240, D:\IdeaProjects\facebook-presto-0.223.1\pom.xml, line 5, column 13
     for project com.facebook.presto:presto-memory:0.240 at D:\IdeaProjects\facebook-presto-0.223.1\presto-main\..\presto-memory\pom.xml
    	at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:149)
    	at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:102)
    	at io.airlift.resolver.ArtifactResolver.resolvePom(ArtifactResolver.java:136)
    	... 6 more
    Caused by: org.apache.maven.model.building.ModelBuildingException: 1 problem was encountered while building the effective model for com.facebook.presto:presto-memory:0.240
    [FATAL] Non-resolvable parent POM for com.facebook.presto:presto-root:0.240: Could not transfer artifact com.facebook.airlift:airbase:pom:99 from/to central (http://repo.maven.apache.org/maven2): Failed to transfer http://repo.maven.apache.org/maven2/com/facebook/airlift/airbase/99/airbase-99.pom. Error code 501, HTTPS Required and 'parent.relativePath' points at wrong local POM @ com.facebook.presto:presto-root:0.240, D:\IdeaProjects\facebook-presto-0.223.1\pom.xml, line 5, column 13
    	at org.apache.maven.model.building.DefaultModelProblemCollector.newModelBuildingException(DefaultModelProblemCollector.java:195)
    	at org.apache.maven.model.building.DefaultModelBuilder.readParentExternally(DefaultModelBuilder.java:841)
    	at org.apache.maven.model.building.DefaultModelBuilder.readParent(DefaultModelBuilder.java:664)
    	at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:310)
    	at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:232)
    	at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:142)
    	... 8 more
    

エラー ログを分析すると、次の情報が得られます。

  • 指定されたプラグインの pom.xml ファイルを正しくロードできません。Error loading pom ...
  • presto-rootpom ファイルをロードできない理由:親モジュールをデフォルトの中央ウェアハウスからロードできない、com.facebook.airlift:airbaseつまり、祖父母モジュールをロードできない
  • 中央ウェアハウスにアクセスできない理由: 中央ウェアハウスは http アドレスを使用しますが、現在は https の使用が必要です。

2. 正しい解決策

  • config.properties で、maven.repo.local指定されたローカル Maven ウェアハウスを使用します。

    // 笔者自定义了本地maven仓库,而非使用默认的~/.m2/repository
    maven.repo.local=/Users/xxx/repo
    
  • ローカル ウェアハウスには、事前にmvn clean installインストールされたプラグイン jar がすでに含まれており、サービスがプラグインのロードを開始すると、jar をローカル ウェアハウスから直接取得できます。

    2023-03-07T17:21:44.074+0800	INFO	main	com.facebook.airlift.bootstrap.LifeCycleManager	Life cycle startup complete. System ready.
    2023-03-07T17:21:44.074+0800	INFO	main	com.facebook.presto.server.PluginManager	-- Loading plugin ../presto-memory/pom.xml --
    2023-03-07T17:21:55.707+0800	DEBUG	main	com.facebook.presto.server.PluginManager	Classpath for ../presto-memory/pom.xml:
    2023-03-07T17:21:55.728+0800	DEBUG	main	com.facebook.presto.server.PluginManager	    /Users/xxx/IdeaProjects/facebook-presto-0.223.1/presto-memory/target/classes
    2023-03-07T17:21:55.730+0800	DEBUG	main	com.facebook.presto.server.PluginManager	    /Users/xxx/repo/aopalliance/aopalliance/1.0/aopalliance-1.0.jar
    ...
    2023-03-07T17:21:55.760+0800	INFO	main	com.facebook.presto.server.PluginManager	Installing com.facebook.presto.plugin.memory.MemoryPlugin
    2023-03-07T17:21:55.771+0800	INFO	main	com.facebook.presto.server.PluginManager	Registering connector memory
    2023-03-07T17:21:55.773+0800	INFO	main	com.facebook.presto.server.PluginManager	-- Finished loading plugin ../presto-memory/pom.xml --
    

3. 不完全な解決策

  • 回り道を避けるために、最初の不完全な解決策を記録しておきます。

  • インターネット上の情報を確認したところ、確かに2020年にウェアハウスが開始されており、代わりにhttpsを使用してアクセスしていることがわかりました。

  • maven-model-builderグローバル検索。使用されている依存関係のみを検索しますpom-4.0.0.xml。構成された Maven ウェアハウス アドレスは要件を満たしています。

    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-model-builder</artifactId>
        <version>3.0.4</version>
    </dependency>
    

    ここに画像の説明を挿入

  • 依存関係の分析により、モジュールが使用されているためにインポートされているmaven-model-builderことがわかります。presto-mainio.airlift.resolver:resolver:1.4
    ここに画像の説明を挿入

  • したがって、 presto-mainのmaven-model-builder依存関係を除けば、

  • 結果はまだ動作せず、最終的にはplugin.dir設定プラグイン情報のみが使用できるようになります

    plugin.dir=../presto-server/target/presto-server-0.240/presto-server-0.240/plugin
    
  • 使用時の問題plugin.dir:開発プロセス中、モジュールを再コンパイルした後、モジュールの jar をプラグインに配置する必要があります。そうしないと、最新のコードが有効になりません。

4. 追記:Prestoプラグインについて

  • Prestoはプラグイン機構を採用しており、SPI仕様に準拠したConnector、Type、Function、System Access ControlなどをPrestoに追加できます。
  • プラグインメカニズムにより、コンポーネントの機能をプラグイン可能およびカスタマイズ可能にし、ユーザーのさまざまなニーズを満たすことができます。
  • プラグインが異なれば定義も異なりますが、次のことが共通しています。
    1. pom.xml では、packagingメソッドは presto-plugin である必要があります
      <packaging>presto-plugin</packaging>
      
    2. pom.xml では、presto-spi モジュールを導入する必要があります。同時に、SPI で定義されたインターフェイスを実装するか、SPI で定義されたメソッドを書き直す必要があります。
      <dependency>
          <groupId>com.facebook.presto</groupId>
          <artifactId>presto-spi</artifactId>
          <scope>provided</scope>
      </dependency>
      
    3. presto-rootのpom.xmlを設定し、プラグインに対応するモジュールを追加する
      <module>presto-xxx-module</module>
      
    4. ファイル内でpresto-server/src/main/assembly/presto.xml文、プラグインの出力ディレクトリを設定します。
      <fileSet>
          <directory>${project.build.directory}/dependency/presto-xxx-module-${project.version}</directory>
          <outputDirectory>plugin/xxx-module</outputDirectory>
      </fileSet>
      
    5. presto-serverpom.xml ファイルを構成し、次の内容を追加して、インストール パッケージに対応するプラグイン ディレクトリにその jar パッケージがあることを確認します。
      <dependency>
          <groupId>com.facebook.presto</groupId>
          <artifactId>presto-xxx-module</artifactId>
          <version>${project.version}</version>
          <type>zip</type>
          <scope>provided</scope>
      </dependency>
      

おすすめ

転載: blog.csdn.net/u014454538/article/details/129384049