在python Beam函数中使用不可序列化的对象

时间:2018-09-03 08:44:17

标签: python python-2.7 apache-beam

根据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

我想知道是否有一种方法可以在工作程序实例中初始化我的函数所需的所有非序列化变量?

谢谢。

1 个答案:

答案 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)