在Apache的梁作业中使用start_bundle()不工作。 Unpickleable st

2019-10-29 07:40发布

我得到这个错误

pickle.PicklingError:酸洗客户对象明确不支持。 客户有不平凡的状态是本地和unpickleable。

当试图使用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酸洗错误?

Answer 1:

更新:这个问题实际上是一个图书馆的问题。 我必须有正确的谷歌云版本的正确Apache的光束SDK版本:

gapic - 谷歌云 - 发布 - 订阅-V1 = = 0.15.4

GAX-谷歌测井-V2 == 0.8.3

GAX - 谷歌 - 发布 - 订阅-V1 == 0.8.3

谷歌的API核心== 1.1.2谷歌的API的Python客户端1.6.7 ==

谷歌-apitools == 0.5.10

谷歌-auth的== 1.4.1

谷歌认证 - httplib2的== 0.0.3

谷歌云-的BigQuery == 1.1.0

谷歌云核== 0.28.1

谷歌云的数据存储== 1.6.0

谷歌云 - 发布 - 订阅== 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))


文章来源: Using start_bundle() in apache-beam job not working. Unpickleable storage.Client()