Можно ли использовать оператор ввода в середине DAG в Apache Apex

Во всех примерах Apex указано, что первым оператором DAG должен быть оператор ввода. Может ли этот оператор появиться где-нибудь в середине DAG.

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

Согласно определению оператора ввода, это оператор, у которого нет входного потока. Но он также выполняет работу по извлечению данных, если используется соединитель. Так будет ли это работать, если я получу данные где-то между DAG?


person frewper    schedule 28.02.2017    source источник


Ответы (3)


Это интересный вариант использования. Вы должны иметь возможность расширить оператор ввода (скажем, JdbcInputOperator, поскольку вы хотите читать из базы данных) и добавить к нему порт ввода. Этот входной порт получает данные (кортежи) от другого оператора из вашей DAG и обновляет предложение «где» JdbcInputOperator, чтобы он считывал данные на основе этого. Надеюсь, это то, что вы искали.

person Sanjay    schedule 28.02.2017
comment
Привет, Санджай, это действительно возможно, учитывая, что обработка InputOperator и универсального оператора отличается. apex.apache.org/docs/apex/operator_development/ - person Ajay Gupta; 01.03.2017
comment
Я только что увидел ответ Влада. Мой запрос в предыдущем комментарии разъяснен. - person Ajay Gupta; 01.03.2017

Да, это возможно. Вы можете расширить существующий InputOperator и добавить к нему InputPort. В этом случае платформа Apex будет обрабатывать ваш оператор как универсальный оператор, а не вызывать InputOperator.emitTuples(). В вашу расширенную ответственность оператора входит вызов super.emitTuples() или непосредственная передача на выходной порт(ы).

person Vlad Rozov    schedule 28.02.2017

Нет, между DAG нельзя использовать оператор ввода. Как вы уже указали, поскольку входного потока нет, вы не сможете получить данные от предыдущего оператора для использования с этим оператором.

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

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

person Ajay Gupta    schedule 28.02.2017