Если мы передаем функцию, возвращающую логическое значение, в раздел where Flink CEP, будет ли она работать распределенно?

Я использовал модуль Flink CEP и задавался вопросом, передаю ли я функцию в предложение where, которое будет возвращать логическое значение, будет ли оно работать распределенным образом или нет.

Пример-: val pattern= Pattern.start("begin").where(v=>booleanReturningFunction(v))

Будет ли приведенный выше код работать в распределенном режиме при отправке в качестве задания flink для CEP с простым условием.


person Anish Sarangi    schedule 19.04.2020    source источник
comment
Да, он будет работать распределенно, так как события могут поступать в разные диспетчеры задач.   -  person Yuval Itzchakov    schedule 19.04.2020
comment
@YuvalItzchakov Спасибо. Но реплицируется ли функция, которую я передаю в предложение where, в диспетчерах задач?   -  person Anish Sarangi    schedule 20.04.2020
comment
Ваш JAR распространяется на каждый узел диспетчера задач, он содержит вашу функцию внутри этого JAR.   -  person Yuval Itzchakov    schedule 20.04.2020


Ответы (1)


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

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

Недостающая часть заключается в том, что распределяется и сама ваша работа. Если вы проверите API, вы увидите его в интерфейсах:

public Pattern<T, F> where(IterativeCondition<F> condition) { ...

Паттерн ожидает некоторого условия. Если вы посмотрите на его определение, то увидите следующее.

public abstract class IterativeCondition<T> implements Function, Serializable { ... }

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

person Arvid Heise    schedule 21.04.2020
comment
Спасибо за ответ. На самом деле меня беспокоил график заданий, где обычные функции обычно выполняются на стороне драйвера, который в случае Flink является диспетчером заданий. Как и в spark, мы явно объявляем UDF конкретной функции для распределенной обработки, здесь кажется, что если функция сериализуема, это не требуется. Пожалуйста, поправьте меня, если я ошибаюсь. - person Anish Sarangi; 21.04.2020
comment
Да вы правы. В JobManager почти ничего не выполняется (пока). Фактически, для всех пользовательских функций сериализуемость проверяется при отправке, что может привести к ошибке на раннем этапе. - person Arvid Heise; 22.04.2020