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 调用相乘