Google Cloud Storage:输出路径不存在或不可写

Posted

技术标签:

【中文标题】Google Cloud Storage:输出路径不存在或不可写【英文标题】:Google Cloud Storage: Output path does not exist or is not writeable 【发布时间】:2016-07-06 03:43:31 【问题描述】:

我正在尝试从google cloud site 遵循这个简单的数据流示例。

我已成功安装数据流管道插件和 gcloud SDK(以及 Python 2.7)。我还在谷歌云上建立了一个项目,并启用了计费和所有必要的 API - 如上面的说明中所述。

但是,当我转到运行配置并将 Pipeline Arguments 选项卡更改为选择 BlockingDataflowPipelineRunner 时,在进入创建存储桶并设置我的项目 ID 后,点击运行会给我:

Caused by: java.lang.IllegalArgumentException: Output path does not exist or is not writeable: gs://my-cloud-dataflow-bucket
    at com.google.cloud.dataflow.sdk.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:146)
    at com.google.cloud.dataflow.sdk.util.DataflowPathValidator.verifyPathIsAccessible(DataflowPathValidator.java:79)
    at com.google.cloud.dataflow.sdk.util.DataflowPathValidator.validateOutputFilePrefixSupported(DataflowPathValidator.java:62)
    at com.google.cloud.dataflow.sdk.runners.DataflowPipelineRunner.fromOptions(DataflowPipelineRunner.java:255)
    at com.google.cloud.dataflow.sdk.runners.BlockingDataflowPipelineRunner.fromOptions(BlockingDataflowPipelineRunner.java:82)
    ... 9 more

我已使用终端执行“gcloud auth login”,并在浏览器中看到我已成功登录。

我真的不确定我在这里做错了什么。谁能确认这是否是使用数据流管道和谷歌存储桶的已知问题?

谢谢!

【问题讨论】:

您可以尝试在命令行上运行gsutil ls gs://my-cloud-dataflow-bucket 吗? (我会先给出一个通用的答案,一旦我们找出根本原因,再给出一个更具体的答案。) 【参考方案1】:

我在 GCS 存储桶权限方面遇到了类似的问题,但我当然拥有写入权限并且可以将文件上传到存储桶中。 为我解决问题的方法是为我提交管道的项目获得 roles/dataflow.admin 权限。

【讨论】:

【参考方案2】:

向 Google Cloud Dataflow 服务提交管道时,本地计算机上的管道运行器会将在云中执行所需的文件上传到 Google Cloud Storage 中的“暂存位置”。

本地计算机上的管道运行器似乎无法将所需文件写入提供的暂存位置 (gs://my-cloud-dataflow-bucket)。可能是该位置不存在,或者它属于不同于您进行身份验证的 GCP 项目,或者该存储桶上设置了更具体的权限,等等。

您也可以通过gsutil 命令行开始调试问题。例如,尝试运行gsutil ls gs://my-cloud-dataflow-bucket 来尝试列出存储桶的内容。然后,尝试通过gsutil cp 命令上传。这可能会产生足够的信息来解决您面临的问题。

【讨论】:

我在终端中运行了以下命令:您当前的项目是 [rosh-test]。您可以通过运行来更改此设置: $ gcloud config set project PROJECT_ID Roshs-MacBook-Air:~ RoshPlaha$ gsutil ls gs://my-cloud-dataflow-bucket AccessDeniedException: 403 Forbidden 我应该在 eclipse 数据流插件中指出,在创建项目时,我指定了存储桶的名称,然后单击“创建”。 Eclipse 告诉我存储桶的创建成功。但是,当我检查 gcp 以查看存储桶是否存在时,它说不存在。 此外,当我尝试手动创建同一个存储桶时 - 它说我不能有两个同名的存储桶!在 gcp 中,我启动了 gsutil 并运行:gsutil acl ch -u myemail@gmail.com:W gs://my-cloud-dataflow-bucket。但是,这也会产生 403 禁止错误。 需要检查的几件事:确保您的帐户至少是项目的编辑,不要忘记运行gcloud auth login。此外,在创建存储桶时,请确保指定项目名称。如果失败,我建议在 Developers Console 中手动创建存储桶,然后在 Eclipse 中使用它。 嘿达沃尔。在 gcp 存储部分 ui 中,我更改了存储桶权限和默认存储桶权限,以便所有者、编辑者和查看者都设置了“所有者”权限。我还为我的特定电子邮件地址添加了一个新条目。通过我执行的终端:gsutil cp somefile.txt gs://my-cloud-dataflow-bucket。我看到文件已上传 - 所以权限似乎没问题。但是,当我运行我的eclipse程序时,我仍然得到错误:存储桶不存在或不可写:( 你是怎么解决这个问题的?我有同样的问题,我可以在 CLI 上gsutil cp,但在 Java 代码端出现错误。谢谢。【参考方案3】:

尝试提供zone 参数,它适用于我的情况,但有类似的错误。当然,在运行您的应用程序之前导出 GOOGLE_APPLICATION_CREDENTIALS 环境变量。

 ...
 -Dexec.args="--runner=DataflowRunner \
 --gcpTempLocation=gs://bucket/tmp \
 --zone=bucket-zone \
 ...

【讨论】:

【参考方案4】:

我意识到我需要通过 gsutil 使用特定的 acl 命令。将我的帐户设置为具有所有者权限并没有完成这项工作。而是使用:

gsutil acl set public-read-write gs://my-bucket-name-here

在这种情况下工作。希望这对某人有帮助!

【讨论】:

我们不应该鼓励用户在他们的存储桶上设置public-read-write。这不是必需的。项目的编辑者需要具有写入权限,以及服务帐户。然后,您需要作为编辑之一进行身份验证,这就足够了。

以上是关于Google Cloud Storage:输出路径不存在或不可写的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 向 Google Cloud Storage 写入流式传输

Spring + google cloud:没有可用的“com.google.cloud.storage.Storage”类型的合格bean

google cloud storage products

ReferenceError:导入@google-cloud/storage 时分配的左侧无效

错误:模块“google.cloud.bigquery_storage”没有属性“BigQueryReadClient”

Google cloud 存储 Storage