首页 > 解决方案 > 在 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 上的酸洗错误?

标签: google-cloud-storagegoogle-cloud-dataflowapache-beam

解决方案


更新:这个问题实际上是一个图书馆问题。我必须拥有正确的 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))

推荐阅读