Как мне разделить закрытую переменную между задачами в Flink (Scala)?

#multithreading #scala #parallel-processing #apache-flink #flink-streaming

#многопоточность #scala #параллельная обработка #apache-flink #flink-streaming

Вопрос:

Я хочу разделить личную переменную в моем задании Flink (Scala) между параллельными задачами Flink. Мой код выглядит примерно так :

 object myJob extends flinkJob {
 private val myVariable = someValue

 def run(params) : Unit = {
  //Stream processing
  //myVariable is used here in the ProcessFunction
 }
}
  

Когда я выполню это задание с некоторым распараллеливанием, будет ли одна копия «myVariable» общей для всех задач Flink? Если нет, то как я могу гарантировать, что только одна копия переменной используется и поддерживается во всех параллельных задачах?

Ответ №1:

Поскольку распараллеленные копии вашего оператора выполняются как задачи в отдельных JVM, «совместного использования» переменной быть не может. Что вы можете сделать, так это использовать BroadcastStream для совместного использования одних и тех же данных с несколькими задачами. Если вам нужно иметь возможность обновлять переменную, тогда вам нужно посмотреть на использование итераций или сохранить переменную во внешней системе, к которой вы можете регулярно запрашивать.

Комментарии:

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

2. Думайте о своих словарных записях как о парах ключ / значение. Каждое обновление KV — это запись, которая повторяется обратно в широковещательный поток и, таким образом, отправляется каждому распараллеленному оператору.