Невозможно запустить несколько конвейеров в желаемом порядке, создав шаблон в Apache Beam

У меня есть два отдельных конвейера: «P1» и «P2». В соответствии с моим требованием мне нужно запускать P2 только после того, как P1 полностью завершит свое выполнение. Мне нужно выполнить всю эту операцию с помощью одного шаблона.

Обычно шаблон создается в тот момент, когда он находит run () на своем пути, скажем, p1.run ().

Итак, я вижу, что мне нужно обрабатывать два разных конвейера с использованием двух разных шаблонов, но это не удовлетворяет моему требованию к выполнению конвейера на основе строгого порядка.

Другой способ, который я мог бы придумать, - вызвать p1.run () внутри ParDo p2.run () и оставить run () p2 ждать до завершения run () из p1. Я пробовал этот способ, но застрял на IllegalArgumentException, указанном ниже.

java.io.NotSerializableException: объекты PipelineOptions не сериализуемы и не должны встраиваться в преобразования (вы захватили объект PipelineOptions в поле или в анонимном классе?). Вместо этого, если вы используете DoFn, обращайтесь к PipelineOptions во время выполнения через ProcessContext / StartBundleContext / FinishBundleContext.getPipelineOptions () или предварительно извлеките необходимые поля из PipelineOptions во время создания конвейера.

Возможно ли вообще вызвать run () конвейера внутри любого преобразования, скажем «Pardo» другого конвейера?

Если это так, то как удовлетворить мое требование о последовательном вызове двух разных конвейеров путем создания одного шаблона?


person Balajee Venkatesh    schedule 06.10.2017    source источник
comment
Я не думаю, что поток данных - это то, что вы просили. Вам стоит взглянуть на менеджеры рабочего процесса, такие как luigi или airflow.   -  person Anuj    schedule 06.10.2017
comment
Или, может быть, создать 2 разных конвейера, вызвать их из разных модулей, чтобы они выполнялись один за другим. Но опять же нужно убедиться, что первое задание не провалилось.   -  person Anuj    schedule 06.10.2017
comment
@anuj Пробовал и второй подход !!! создал два разных модуля и вызвал их из другого класса в желаемой последовательности, создав шаблон класса вызывающего. Опять же, задания не удались из-за некоторых исключений IllegalArumentExceptions, из которых можно сделать вывод, что таким образом мы также не можем достичь требуемой функциональности.   -  person Balajee Venkatesh    schedule 06.10.2017
comment
Да, я уже упоминал об этом. Дело в том, что поток данных не создан для того, чтобы делать что-то так, как это делала бы программа диспетчера рабочих процессов! Вы можете изучить Luigi, который на самом деле представляет собой систему управления рабочим процессом на основе Python.   -  person Anuj    schedule 06.10.2017


Ответы (1)


Шаблон может содержать только один конвейер. Чтобы упорядочить выполнение двух отдельных конвейеров, каждый из которых является шаблоном, вам необходимо запланировать их внешнее планирование, например через какую-то систему управления рабочим процессом (например, то, что упомянул Анудж, или Airflow, или что-то еще - вы можете почерпнуть вдохновение из этот пост).

Мы осознаем необходимость улучшения последовательности примитивов в Beam в рамках одного конвейера, но пока не имеем конкретной конструкции.

person jkff    schedule 06.10.2017
comment
Спасибо. Это было очень убедительно. Я с нетерпением жду возможности изучить некоторые системы управления рабочим процессом для того же. - person Balajee Venkatesh; 07.10.2017
comment
Есть ли у нас еще лучшие примитивы секвенирования в 2020 году? - person abergmeier; 22.08.2020