Как объединить несколько потоков с ключами, а затем выполнить Пользовательскую функцию агрегирования в Объединенном потоке

#apache-flink #flink-streaming #ensemble-learning

Вопрос:

Контекст моего вопроса заключается в следующем:

У меня есть некоторый входной поток: DataStream <String> input_stream= . . .

Во-первых, я выполняю операцию flatMap, чтобы заполнить/скопировать входной поток в 3 идентичных экземпляра с 3 разными идентификаторами.

structured_stream = input_stream.flatMap(new FlatMapFunction<String, Tuple2<String, Integer>>

с результатом Tuple2<String, Integer>

Строка Целое число
входной поток 1
входной поток 2
входной поток 3

Таким образом, промежуточные результаты-это входной поток с другим идентификатором

Затем выполните операцию keyBy со вторым атрибутом…

Важно уточнить, что из среды потока данных мы перешли в среду потока ключей

KeyedStream<Tuple2<Integer, Integer>> partial_result = structured_stream.keyBy(1).flatMap(new StatefulMap());

Я реализовал функцию StatefulMap, которая по сути является состоянием для каждого ключа.

static class StatefulMap extends RichFlatMapFunction<Tuple2<String, Integer>,...> {}

Каждое состояние выдает мне вывод (через коллектор), который содержит ответ о данном входном потоке.

Итак, у меня есть три частичных результата.

Целое число Строка Целое число (Идентификатор состояния)
Ответ 1 входной поток Состояние 1
Ответ 2 входной поток Состояние 2
Ответ 3 входной поток Состояние 3

МОЙ ВОПРОС ТАКОВ:

Есть ли какой-либо способ, которым я могу собрать все эти частичные результаты из 3 различных потоков с ключами и создать общую пользовательскую агрегацию/накопитель, такую как взвешенное голосование (извлечение одного конечного результата)? (не на основе ключа, а на основе input_stream)

Другими словами, существуют ли какие-либо способы объединения нескольких потоков с ключами и выполнения отдельных функций агрегирования в Apache Flink?

P.S. Мое текущее решение-записать каждый поток ключей в один и тот же приемник Apache Kafka, а затем запустить второе задание, выполняющее мою пользовательскую функцию агрегирования на основе входного потока данных. По сути, я преобразую потоки с ключами в один единый поток данных, но добавляю второе задание, называемое накладными расходами.

Для тех, кому интересно, я внедряю обучение ансамблю в Apache Flink.

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

1. Вы можете использовать объединение для объединения отдельных потоков вместе.