Ювал уже дал правильный ответ в комментариях, но я бы хотел остановиться на нем:
Да, любую функцию, которую вы предоставляете, можно запускать распределенным способом. Прежде всего, как указал Ювал, весь ваш код распределяется по вычислительному кластеру при отправке задания.
Недостатком является то, что и ваша работа сама распределяется. Если вы проверите API, вы увидите его в интерфейсах:
public Pattern<T, F> where(IterativeCondition<F> condition) { ...
Шаблон ожидает некоторого условия. Если вы посмотрите на его определение, то увидите следующее
public abstract class IterativeCondition<T> implements Function, Serializable { ... }
Таким образом, то, что вы передаете where
, должно быть Serializable
. Ваш клиент может сериализовать всю вашу работу, включая все определения функций, и отправить ее в JobManager, который распределяет ее по разным TaskManager. Поскольку у каждого компонента инфраструктуры также есть ваша фляга работы, это может десериализовать работу, включая вашу функцию. Десериализация также означает, что она создает копии функции, которая необходима для распределенного выполнения.