Apache Beam:无法找到gs的注册商
Beam正在使用Google的自动/价值和自动/服务工具。
我想运行带有Dataflow流水线的管道,数据存储在Google云端存储上。
我添加了一个依赖项:
org.apache.beam beam-runners-google-cloud-dataflow-java 2.0.0 org.apache.beam beam-sdks-java-extensions-google-cloud-platform-core 2.0.0
我能够从IntelliJ启动管道。 但是当jar通过mvn package
编译并使用java -jar
运行时会抛出一个错误:
java.lang.IllegalStateException: Unable to find registrar for gs
fatjar是包含maven-assembly-plugin
。 GcsFileSystemRegistrar
类在jar中。
问题在于你正在构建你的fatjar。 maven-assembly-plugin
没有正确处理与ServiceLoader
关联的文件。 ServiceLoader
依赖于META-INF/services/org.apache.beam.sdk.io.FileSystemRegistrar
中列出的每个实现的条目,以便Java知道如何找到它们。
你的fatjar中的META-INF/services/org.apache.beam.sdk.io.FileSystemRegistrar
的内容可能只是:
org.apache.beam.sdk.io.LocalFileSystemRegistrar
您需要拥有它(以及您想要的任何其他实现):
org.apache.beam.sdk.io.LocalFileSystemRegistrar org.apache.beam.sdk.extensions.gcp.storage.GcsFileSystemRegistrar
最好的办法是在配置为使用ServicesResourceTransformer来构建你的fatjar时,使用一个了解这些ServiceLoader
要求的工具,如maven-shade-plugin
。
这看起来像汇编策略的问题,您应该为org.apache.beam.sdk.io.FileSystemRegistrar
积累/合并服务。 更多类似的问题在这里 。