我得到这个错误
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酸洗错误?
更新:这个问题实际上是一个图书馆的问题。 我必须有正确的谷歌云版本的正确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()