尝试使我的问题尽可能广泛:
使用TextIO将无限制的PCollection写入GCS存储桶时,同时使用具有最小特权原则且不具有GCS删除访问权限的服务帐户,在数据流中会出现以下错误:
Error trying to copy gs://[Temporary beam file] to gs://[JSON We expect]: {"code":403,"errors":[{"domain":"global","message":"[Service Account] does not have storage.objects.delete access to [JSONFile]","reason":"forbidden"}],"message":"[Service Account] does not have storage.objects.delete access to [JSON File]"}
考虑到我们不允许服务帐户对正在使用的存储桶具有删除访问权限,并且数据流管道正在尝试清理文件的碎片,因此上述错误是有道理的。
但是,问题是,这时的最佳实践是是否提供对数据流服务帐户的删除访问权限并继续使用TextIO?还是在我们要提取的PCollection上使用DoFn并使用DoFn使用GCS API将每个单独的元素递增地写入GCS存储桶中会更好?从而颠覆了碎片清理的问题。
谢谢
答案 0 :(得分:0)
有一个withTempDirectory
function in TextIO
,应允许您将临时存储桶设置为服务帐户具有更高特权的存储桶。
我相信TextIO
会将文件放入管道的tempLocation
中。您也许可以在安全性不是很关键的存储桶中设置管道的tempLocation
,然后将结果写入安全存储桶。
LMK(如果有任何替代方法有帮助)。