У меня проблемы с пониманием того, как состояние оператора распределяется между экземплярами параллельного оператора, чтобы получить желаемый результат.
Вот простой пример:
class MultiplyNumber implements FlatMapFunction<Integer, Integer> {
// This is the operator state (this is statically defined for simplicity here in this example, but assume this can dynamic based on control stream)
List<Integer> multipliers = Arrays.asList(2,3,4,5);
void flatMap(Integer value, Collector<Integer> out){
for(Integer multiplier: multipliers){
out.collect(mutiplier*value);
}
}
}
Предположим, что мы работаем с параллелизмом =2, что означает, что у нас есть 2 экземпляра параллельных операторов (MultiplyNumber) (Operator1 и Operator2)
Если состояние оператора (т. Е. Список множителей) распределено между этими экземплярами, то скажите: Operator1 имеет 2,3 как множителии Operator2 имеет множители 4,5.
Теперь предположим, что у нас есть целочисленные потоки с ключами, поступающие в качестве входных данных.Ключом для всех четных чисел является «Четное», а для всех нечетных чисел - «Нечетное».
Flink отправит все четные числа в Operator1 и все нечетные числа в Operator2 (или наоборот).
Это означает, что все четные числа должны быть умножены на 2 и 3, а все нечетные числа должны быть умножены на 4 и 5.
Но это не то, чего я ожидаю в качестве результата.Я ожидаю, что все числа будут умножены на 2,3,4,5, что является результатом, если параллелизм равен 1.