Apache flink 弗林克(1.11.2)-罐头和#x27;尽管设置了正确的插件,但仍然找不到S3的实现。使用JDK11和Scala 2.12.11

Apache flink 弗林克(1.11.2)-罐头和#x27;尽管设置了正确的插件,但仍然找不到S3的实现。使用JDK11和Scala 2.12.11,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我在Linux中使用Docker运行一个具有单个节点的Flink独立集群。我已经在Flink 1.10.0和JDK8的生产环境中运行了一段时间以前的版本,我能够在那里正常运行S3。现在我正在尝试更新到一个新版本,在我的开发机器上使用本地S3实现运行Docker。不管我怎么做,这个错误总是出现: org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Could not find a file system implementa

我在Linux中使用Docker运行一个具有单个节点的Flink独立集群。我已经在Flink 1.10.0和JDK8的生产环境中运行了一段时间以前的版本,我能够在那里正常运行S3。现在我正在尝试更新到一个新版本,在我的开发机器上使用本地S3实现运行Docker。不管我怎么做,这个错误总是出现:

org.apache.flink.core.fs.UnsupportedFileSystemSchemeException: Could not find a file system implementation for scheme 's3'.
似乎S3方案没有映射到适当的类。我确信Flink正在使用正确的插件。我有以下依赖项:

val testDependencies = Seq(
  "org.scalatest" %% "scalatest" % "3.2.0" % "test"
)

val miscDependencies = Seq(
  "com.github.tototoshi" %% "scala-csv" % "1.3.6",
  "org.lz4" % "lz4-java" % "1.5.1",
  "org.json4s" %% "json4s-jackson" % "3.6.1",
  "org.apache.hadoop" % "hadoop-common" % "3.2.1",
  "redis.clients" % "jedis" % "2.9.0",
  "com.googlecode.plist" % "dd-plist" % "1.21",
  "com.couchbase.client" % "java-client" % "2.7.14",
  "org.apache.parquet" % "parquet-avro" % "1.11.1",
)

val flinkDependencies = Seq(
  "org.apache.flink" %% "flink-scala" % flinkVersion % "provided",
  "org.apache.flink" %% "flink-streaming-scala" % flinkVersion % "provided",
  "org.apache.flink" % "flink-s3-fs-hadoop" % flinkVersion % "provided",
  "org.apache.flink" % "flink-metrics-dropwizard" % flinkVersion,
  "org.apache.flink" % "flink-formats" % flinkVersion pomOnly(),
  "org.apache.flink" % "flink-compress" % flinkVersion,
  "org.apache.flink" %% "flink-statebackend-rocksdb" % flinkVersion,
  "org.apache.flink" %% "flink-clients" % flinkVersion,
  "org.apache.flink" %% "flink-parquet" % flinkVersion
)

我确认我正在不折不扣地遵循这一点。

经过一段时间的努力,我终于解决了这个问题。我把我的解决方案留在这里,以防有人有同样的问题

一旦jobmanager和taskmanager启动,就会检测到插件类,例如S3文件系统工厂,但是它们不会被加载。在我的设置中,作业启动后必须动态加载类。您可以找到有关Flink如何加载其类的更多信息

如前所述,加载类的提示是由作业jar中的
META-INF/services
中存在的文件给出的。要使S3插件正常工作,您需要具有以下文件:

META-INF/services/org.apache.flink.core.fs.FileSystemFactory
其中包含Flink应作为作业的依赖项动态加载的每个类的一行。例如:

org.apache.flink.fs.s3hadoop.S3FileSystemFactory
org.apache.flink.fs.s3hadoop.S3AFileSystemFactory
我正在使用sbt assembly为我的作业创建一个远JAR。在我的项目依赖项中,我将
flink-s3-fs-hadoop
作为一个提供的依赖项,这阻止了包含正确的服务文件。一旦我删除了那个限定符,就创建了正确的服务,一切都正常了