Google Dataflow 上的 Apache Beam 示例的权限错误

Posted

技术标签:

【中文标题】Google Dataflow 上的 Apache Beam 示例的权限错误【英文标题】:Permissions error with Apache Beam example on Google Dataflow 【发布时间】:2017-10-26 06:15:14 【问题描述】:

我在将 Apache Beam 示例从本地计算机提交到我们的云平台时遇到问题。

使用gcloud auth list 我可以看到正确的帐户当前处于活动状态。我可以使用gsutil 和Web 客户端与文件系统进行交互。我可以使用 cloud shell 通过 python REPL 运行管道。

但是当我尝试运行 python wordcount 示例时,我收到以下错误:

IOError: Could not upload to GCS path gs://my_bucket/tmp: access denied.
Please verify that credentials are valid and that you have write access 
to the specified path.

我在凭据方面有什么遗漏吗?

【问题讨论】:

您是否有一个名为my_bucket 的存储桶 包含文件夹或文件tmp my_bucket 存在,目录tmp 也存在 这可能与授予 VM 的访问范围有关。请看***.com/questions/27275063/… 【参考方案1】:

这是我在这个问题上花了整个上午后的两分钱。

您应该确保在本地计算机上使用 gcloud 登录,但是,请注意从 gcloud auth login 返回的警告消息:

WARNING: `gcloud auth login` no longer writes application default credentials.

python 代码需要这些凭据才能正确识别您的凭据。

解决方案相当简单,只需使用: gcloud auth application-default login

这将在 ~/.config/gcloud/application_default_credentials.json 下写入一个凭证文件,用于在本地开发环境中进行身份验证。

【讨论】:

我怎么会错过你的回答。 我确认这是解决方案。它对我有用。 啊,我花了一个下午自己寻找它。 在我的 CLI 版本中,gcloud auth login 不再输出警告信息,因此很难找到这个解决方案。另见:***.com/questions/53306131/…. 在这个问题上花了一些时间,很高兴找到这个答案【参考方案2】:

您需要为您的项目创建一个 GCS 存储桶和文件夹,然后将其指定为管道参数,而不是使用默认值。

https://cloud.google.com/storage/docs/creating-buckets

【讨论】:

bucket和目录存在。然后将此存储桶用于--output--temp-location 管道参数。运行 wordcount 示例时是否缺少另一个参数? 您使用的是对存储桶有权限的项目吗?拥有存储桶的项目是同一个项目吗? 您可以在 Storage 部分浏览到 GCS 文件夹。选择您正在使用的项目,您应该能够看到项目中可见的所有存储桶console.cloud.google.com 可以看到bucket,可以创建和删除目录,可以上传文件到bucket。这是在登录到与gcloud auth list 看到的同一用户时。 凭证究竟是如何工作的? $GOOGLE_APPLICATION_CREDENTIALS 环境变量与它有什么关系还是全部通过gcloud 命令处理? 【参考方案3】:

创建存储桶后解决了同样的错误。 gsutil mb gs://<bucket-name-from-the-error>/

【讨论】:

【参考方案4】:

我遇到了同样的问题,它引发了 IO 错误。在这里帮助我的事情是(不按顺序):

    检查存储桶的名称。这一步对我帮助很大。 存储桶名称是全局的。如果您在访问您的存储桶时在存储桶名称中出错,那么您可能正在访问您尚未创建且您无权访问的存储桶。

    查看您填写的服务账号:

    export GOOGLE_CLOUD_PROJECT= yourkeyfile.json

为您插入的密钥文件激活服务帐户 -

gcloud auth activate-service-account --key-file=your-key-file.json 

此外,列出可用的身份验证帐户也可能对您有所帮助。

gcloud auth list

【讨论】:

【参考方案5】:

一种解决方案可能适合您。它对我有用。

在云外壳窗口中,单击“启动代码编辑器”(铅笔图标)。编辑器可以在 Chrome 中工作(不确定 Firefox),但在 Brave 浏览器中不工作。

现在,浏览到您的代码文件 [在 GCP 上启动的代码编辑器中](.py 或 .java)并找到预定义的 PROJECT 和 BUCKET 名称,并将名称替换为您自己的项目和存储桶名称并保存.

现在执行文件,它现在应该可以工作了。

【讨论】:

以上是关于Google Dataflow 上的 Apache Beam 示例的权限错误的主要内容,如果未能解决你的问题,请参考以下文章

Google Dataflow (Apache beam) JdbcIO 批量插入 mysql 数据库

尝试在 Dataflow 中使用 Apache Beam 将数据从 Google PubSub 写入 GCS 时出错

Apache Beam/Google Dataflow - 将数据从 Google Datastore 导出到 Cloud Storage 中的文件

Python 上的 Apache Beam 将 beam.Map 调用相乘

Scio:Apache Beam和Google Cloud Dataflow的Scala API

请求的身份验证范围不足 - GCP 上的 Dataflow/Apache Beam