"No filesystem found for scheme gs" 当 运行 数据流在 google 云平台

"No filesystem found for scheme gs" when running dataflow in google cloud platform

我正在 运行在 Google 云平台 (GCP) 中执行我的 google 数据流作业。 当我 运行 这个工作在本地运行良好,但是当 运行 在 GCP 上运行它时,我得到了这个错误 "java.lang.IllegalArgumentException: No filesystem found for scheme gs"。 我可以访问那个 google 云 URI,我可以将我的 jar 文件上传到那个 URI,我可以看到我的本地作业的一些临时文件。

我在 GCP 中的作业 ID:

2019-08-08_21_47_27-162804342585245230 (梁version:2.12.0)

2019-08-09_16_41_15-11728697820819900062 (梁version:2.14.0)

我试过2.12.0和2.14.0的beam版本,都是同样的错误。


java.lang.IllegalArgumentException: No filesystem found for scheme gs
    at org.apache.beam.sdk.io.FileSystems.getFileSystemInternal(FileSystems.java:456)
    at org.apache.beam.sdk.io.FileSystems.matchNewResource(FileSystems.java:526)
    at org.apache.beam.sdk.io.gcp.bigquery.BigQueryHelpers.resolveTempLocation(BigQueryHelpers.java:689)
    at org.apache.beam.sdk.io.gcp.bigquery.BigQuerySourceBase.extractFiles(BigQuerySourceBase.java:125)
    at org.apache.beam.sdk.io.gcp.bigquery.BigQuerySourceBase.split(BigQuerySourceBase.java:148)
    at org.apache.beam.runners.dataflow.worker.WorkerCustomSources.splitAndValidate(WorkerCustomSources.java:284)
    at org.apache.beam.runners.dataflow.worker.WorkerCustomSources.performSplitTyped(WorkerCustomSources.java:206)
    at org.apache.beam.runners.dataflow.worker.WorkerCustomSources.performSplitWithApiLimit(WorkerCustomSources.java:190)
    at org.apache.beam.runners.dataflow.worker.WorkerCustomSources.performSplit(WorkerCustomSources.java:169)
    at org.apache.beam.runners.dataflow.worker.WorkerCustomSourceOperationExecutor.execute(WorkerCustomSourceOperationExecutor.java:78)
    at org.apache.beam.runners.dataflow.worker.BatchDataflowWorker.executeWork(BatchDataflowWorker.java:412)
    at org.apache.beam.runners.dataflow.worker.BatchDataflowWorker.doWork(BatchDataflowWorker.java:381)
    at org.apache.beam.runners.dataflow.worker.BatchDataflowWorker.getAndPerformWork(BatchDataflowWorker.java:306)
    at org.apache.beam.runners.dataflow.worker.DataflowBatchWorkerHarness$WorkerThread.doWork(DataflowBatchWorkerHarness.java:135)
    at org.apache.beam.runners.dataflow.worker.DataflowBatchWorkerHarness$WorkerThread.call(DataflowBatchWorkerHarness.java:115)
    at org.apache.beam.runners.dataflow.worker.DataflowBatchWorkerHarness$WorkerThread.call(DataflowBatchWorkerHarness.java:102)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

这很正常。在您的计算机上,您在测试中使用内部文件(/.... 在 Linux 中,c:... 在 Windows 中)。但是,Google 云存储不是内部文件系统(顺便说一句,它不是文件系统),因此无法解释 "gs://"。

尝试TextIO.read.from(...)

您可以将其用于 internal and external files like GCS

但是,几个月前我在 Windows 环境中开发 Windows 时遇到了一个问题。 C: 不是已知方案(与您的错误相同)。 现在可能有效(我不再使用 Windows,我无法测试)。否则,您有这种解决方法模式:在您的配置对象中设置一个变量并对其执行测试,例如:

If (environment config variable is local)
    p.apply(FileSystems.getFileSystemInternal...);
Else 
    p.apply(TextIO.read.from(...));

如果您构建一个捆绑所有依赖项的 "fat jar",这可能是由几个问题引起的。

  1. 您必须包含依赖项 org.apache.beam:google-cloud-platform-core 才能拥有 Beam GCS 文件系统。
  2. 在您的 far jar 中,您必须使用行 org.apache.beam.sdk.extensions.gcp.storage.GcsFileSystemRegistrar 保存 META-INF/services/org.apache.beam.sdk.io.FileSystemRegistrar 文件。您可以在步骤 1 的 jar 中找到此文件。您的依赖项中可能有许多同名文件,注册不同的 Beam 文件系统。您需要配置 maven 或 gradle 将它们组合为构建的一部分,否则它们将相互覆盖而无法正常工作。

这个异常还有一个原因。 确保在尝试访问文件之前创建管道(例如 Pipeline.create(options))。

[GOLANG] 在我的例子中,它是通过应用下面的导入来解决副作用的

import (
_ "github.com/apache/beam/sdks/go/pkg/beam/io/filesystem/gcs"
_ "github.com/apache/beam/sdks/go/pkg/beam/io/filesystem/local"
_ "github.com/apache/beam/sdks/go/pkg/beam/io/filesystem/memfs"
)