google-cloud-storage - 在 apache-beam 作业中使用 start_bundle() 不起作用。Unpickleable storage.Client()
问题描述
我收到此错误
pickle.PicklingError:明确不支持酸洗客户端对象。客户端具有本地且不可提取的非平凡状态。
尝试使用 beam.ParDo 调用看起来像这样的函数时
class ExtractBlobs(beam.DoFn):
def start_bundle(self):
self.storageClient = storage.Client()
def process(self, element):
client = self.storageClient
bucket = client.get_bucket(element)
blobs = list(bucket.list_blobs(max_results=100))
return blobs
我认为 start_bundle 的全部意义在于初始化 self.someProperty 然后在“过程”方法中使用 self.someProperty 来摆脱酸洗问题(来自下面的来源)有人能指出我如何正确的方向吗?解决这个?
[+] 我读到的:
https://github.com/GoogleCloudPlatform/google-cloud-python/issues/3191
如何解决类 apache_beam.internal.clients.dataflow.dataflow_v1b3_messages.TypeValueValuesEnum 上的酸洗错误?
解决方案
更新:这个问题实际上是一个图书馆问题。我必须拥有正确的 apache-beam SDK 版本和正确的 google-cloud 版本:
gapic-google-cloud-pubsub-v1==0.15.4
gax-google-logging-v2==0.8.3
gax-google-pubsub-v1==0.8.3
google-api-core==1.1.2 google-api-python-client==1.6.7
谷歌-apitools==0.5.10
谷歌身份验证==1.4.1
google-auth-httplib2==0.0.3
谷歌云大查询==1.1.0
谷歌云核心==0.28.1
谷歌云数据存储==1.6.0
谷歌-云-pubsub==0.26.0
谷歌云存储==1.10.0
谷歌-gax==0.12.5
阿帕奇梁== 2.3.0
能够通过似乎多种事物的组合来解决这个问题,首先我不序列化任何东西(在产量中丑陋的一个衬里),其次是使用 threading.local()
class ExtractBlobs(beam.DoFn):
def start_bundle(self):
self.threadLocal = threading.local()
self.threadLocal.client = storage.Client()
def process(self, element):
yield list(storage.Client().get_bucket(element).list_blobs(max_results=100))
推荐阅读
- javascript - 使用 jQuery 根据字符串内容和重复计数过滤数组
- sql - ORACLE 如何选择薪酬第三和第五的员工?ORACLE 人力资源计划
- c - 在 C 中不使用数组存储十六进制字符串
- html - 获取导航栏列表项之间的空间
- python - 如何为 functool partial() 指定 arg 位置
- javascript - 通过 data-id 获取 innerHtml
- python - Python pandas在一列中切片多个行值
- java - 持久化实体 OneToMany 关系
- node.js - Api 在生产中返回 404
- c - 在 C 中读取带有时间标头的系统时间