在python beam函数中使用不可序列化的对象
根据beam的文件: 函数对象中的瞬态字段不会传输到worker 实例,因为它们不是自动序列化的 我的代码:在python beam函数中使用不可序列化的对象,python,python-2.7,apache-beam,Python,Python 2.7,Apache Beam,根据beam的文件: 函数对象中的瞬态字段不会传输到worker 实例,因为它们不是自动序列化的 我的代码: class myBeamFunction(beam.DoFn): def __setstate__(self, state): self.__dict__ = state self.my_nonserialisable_object = new Nonserialisable_object() def process(self, ele
class myBeamFunction(beam.DoFn):
def __setstate__(self, state):
self.__dict__ = state
self.my_nonserialisable_object = new Nonserialisable_object()
def process(self, element):
return self.my_nonserialisable_object.do(element)
我的申请失败,因为:
RuntimeError: maximum recursion depth exceeded
从stacktrace中,我看到它是由以下原因引起的:
Python/2.7/lib/python/site-packages/apache_beam/internal/pickler.py
我想知道有没有一种方法可以在worker实例中初始化函数所需的所有非序列化变量
谢谢。这可以通过DoFn.StartBundle方法实现。@ 在DoFn.StartBundle中初始化每个DoFn实例中的状态 方法如果初始化不依赖于任何 仅由主程序知道或由早期程序计算的信息 管道操作,但此DoFn的所有实例都是相同的 对于所有程序执行,例如设置空缓存或 初始化常量数据 python中的情况恰好相同。因此,稍加修改:
class myBeamFunction(beam.DoFn):
def __init__(self):
self.my_nonserialisable_object = None
def start_bundle(self, context=None):
self.my_nonserialisable_object = new Nonserialisable_object()
def process(self, element):
return self.my_nonserialisable_object.do(element)