#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 — это запись, которая повторяется обратно в широковещательный поток и, таким образом, отправляется каждому распараллеленному оператору.