"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",这可能是由几个问题引起的。
- 您必须包含依赖项
org.apache.beam:google-cloud-platform-core
才能拥有 Beam GCS 文件系统。
- 在您的 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"
)
我正在 运行在 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",这可能是由几个问题引起的。
- 您必须包含依赖项
org.apache.beam:google-cloud-platform-core
才能拥有 Beam GCS 文件系统。 - 在您的 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"
)