Использование несериализуемых объектов в функциях луча Python - PullRequest
0 голосов
/ 03 сентября 2018

Согласно документации луча:

Переходные поля в вашем функциональном объекте не передаются работнику экземпляры, потому что они не сериализуются автоматически.

Мой код:

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 голосов
/ 04 сентября 2018

Это может быть достигнуто с помощью метода DoFn.StartBundle. @ Javadoc .

Инициализируйте состояние в каждом экземпляре DoFn в DoFn.StartBundle. метод. Это хорошо, если инициализация не зависит от каких-либо информация, известная только основной программе или вычисленная ранее конвейерные операции, но одинаковые для всех экземпляров этого 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)
...