根据Beam的文档:
函数对象中的瞬态字段不会传输给工作程序 实例,因为它们不会自动序列化。
我的代码:
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
从堆栈跟踪中,我看到它是由以下原因引起的:
Python/2.7/lib/python/site-packages/apache_beam/internal/pickler.py
我想知道是否有一种方法可以在工作程序实例中初始化我的函数所需的所有非序列化变量?
谢谢。
答案 0 :(得分:0)
这可以通过DoFn.StartBundle方法来实现。 @ Javadoc。
在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)