在谷歌云平台中运行数据流时“找不到方案gs的文件系统”

Min*_*ing 5 go google-cloud-platform google-cloud-dataflow apache-beam

我正在 Google Cloud Platform(GCP)中运行我的 google dataflow 作业。当我在本地运行此作业时,它运行良好,但是当在 GCP 上运行它时,我收到此错误“java.lang.IllegalArgumentException:找不到方案 gs 的文件系统”。我可以访问该 google cloud URI,我可以将我的 jar 文件上传到该 URI,并且可以看到本地作业的一些临时文件。

我在 GCP 中的职位 ID:

2019-08-08_21_47_27-162804342585245230(光束版本:2.12.0)

2019-08-09_16_41_15-11728697820819900062(光束版本:2.14.0)

我尝试过beam版本2.12.0和2.14.0,它们都有相同的错误。


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)
Run Code Online (Sandbox Code Playgroud)

Ken*_*les 6

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

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

  • 我通过添加此处描述的变压器 `<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>` 来实现这一点:https://maven.apache.org/plugins/maven-shade -plugin/examples/resource-transformers.html#ServicesResourceTransformer (2认同)

小智 5

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