Google Cloud DataFlow 无法将文件写入临时位置

GoogleCloud DataFlow Failed to write a file to temp location

我正在 Google 云数据流上构建光束管道。

我收到一条错误消息,指出云数据流没有写入临时目录的权限。

这很令人困惑,因为显然数据流具有写入存储桶的能力,它创建了一个暂存文件夹。

为什么我可以写暂存文件夹,但不能写临时文件夹?

我 运行 在计算引擎上的 docker 容器中。我已通过我的服务帐户进行完全身份验证。

PROJECT=$(gcloud config list project --format "value(core.project)")
BUCKET=gs://$PROJECT-testing

python tests/prediction/run.py \
    --runner DataflowRunner \
    --project $PROJECT \
    --staging_location $BUCKET/staging \
    --temp_location $BUCKET/temp \
    --job_name $PROJECT-deepmeerkat \
    --setup_file tests/prediction/setup.py

编辑

回应@alex amato

  1. bucket是属于项目还是属于其他项目? 是的,当我进入项目的主屏幕时,这是列出的四个桶之一。我通常从这个存储桶上传数据并与其他 google 云服务(云视觉 API)交互。

  2. 能否提供完整的错误信息。

    "(8d8bc4d7fc4a50bd):无法将文件写入临时位置 'gs://api-project-773889352370-testing/temp/api-project-773889352370-deepmeerkat.1498771638.913123'。请确保此目录的存储桶存在,并且工作流所在的项目 运行ning具有写入它的必要权限。"

    "8d8bc4d7fc4a5f8f): Workflow failed. Causes: (8d8bc4d7fc4a526c): 临时位置或暂存文件的一个或多个访问检查失败。请参阅其他错误消息了解详细信息。有关安全和权限的更多信息,请参阅https://cloud.google.com/dataflow/security-and-permissions."

  3. 您能否确认不存在与您尝试使用的 GCS 文件夹路径名称匹配的现有 GCS 对象?

是的,存储桶中没有名为 temp 的文件夹。

  1. 能否请您验证您拥有的权限是否与您运行作为
  2. 的成员相匹配

存储桶权限有全局管理员

与我的 gcloud 身份验证匹配

@chamikara 是正确的。尽管从我的服务帐户继承凭据,但云数据流需要自己的凭据。

Can you also give access to cloudservices account (<project-number>@developer.gserviceaccount.com) as mentioned in cloud.google.com/dataflow/security-and-permissions.

我在从 DirectRunner 移动到 DataflowRunner 时遇到了类似的错误:

Staged package XXX.jar at location 'gs://YYY/staging/XXX.jar' is inaccessible.

在使用权限后,我做了以下操作: 在 Storage Browser,单击 Edit Bucket Permissions(针对特定存储桶),为成员 ZZZ-compute@developer.gserviceaccount.com

添加了正确的存储权限

我希望这也能为其他用户节省未来的时间。

运行 由于不同的原因进入同一问题:我设置了对象保留策略,以防止手动删除。由于重命名会触发删除,因此发生了此错误。

因此,如果有人遇到类似问题,请调查您的临时存储桶的属性并可能取消任何保留政策。