Use Kafka corrientes de datos de ventanas y el procesamiento de cada ventana a la vez

simo:

El objetivo que quiero lograr es agrupar por el usuario algunos mensajes que reciben de un tema y la ventana de ellos Kafka con el fin de agrupar los mensajes que recibo en el (5 minutos) de la ventana. A continuación, me gustaría recoger todos los agregados en cada ventana con el fin de procesar a la vez de agregarlos a un informe de todos los mensajes que he recibido en los 5 minutos de intervalo.

El último punto parece ser la parte más difícil ya que no parece Kafka corrientes para proporcionar (al menos yo no lo encuentro!) Cualquier cosa que pueda recoger todas las cosas relacionadas con la ventana en una corriente "finito" para ser procesados ​​en un solo lugar .

Este es el código que implementado

StreamsBuilder builder = new StreamsBuilder();
KStream<UserId, Message> messages = builder.stream("KAFKA_TOPIC");

TimeWindowedKStream<UserId, Message> windowedMessages =
        messages.
                groupByKey().windowedBy(TimeWindows.of(SIZE_MS));

KTable<Windowed<UserId>, List<Message>> messagesAggregatedByWindow =
        windowedMessages.
                aggregate(
                        () -> new LinkedList<>(), new MyAggregator<>(),
                        Materialized.with(new MessageKeySerde(), new MessageListSerde())
                );

messagesAggregatedByWindow.toStream().foreach((key, value) -> log.info("({}), KEY {} MESSAGE {}",  value.size(), key, value.toString()));

KafkaStreams streams = new KafkaStreams(builder.build(), config);
streams.start();

El resultado es algo así como

KEY [UserId(82770583)@1531502760000/1531502770000] Message [Message(userId=UserId(82770583),message="a"),Message(userId=UserId(82770583),message="b"),Message(userId=UserId(82770583),message="d")]
KEY [UserId(77082590)@1531502760000/1531502770000] Message [Message(userId=UserId(77082590),message="g")]
KEY [UserId(85077691)@1531502750000/1531502760000] Message [Message(userId=UserId(85077691),message="h")]
KEY [UserId(79117307)@1531502780000/1531502790000] Message [Message(userId=UserId(79117307),message="e")]
KEY [UserId(73176289)@1531502760000/1531502770000] Message [Message(userId=UserId(73176289),message="r"),Message(userId=UserId(73176289),message="q")]
KEY [UserId(92077080)@1531502760000/1531502770000] Message [Message(userId=UserId(92077080),message="w")]
KEY [UserId(78530050)@1531502760000/1531502770000] Message [Message(userId=UserId(78530050),message="t")]
KEY [UserId(64640536)@1531502760000/1531502770000] Message [Message(userId=UserId(64640536),message="y")]

Para cada ventana hay muchas líneas de registro y se mezclan con las otras ventanas.

Lo que me gustaría tener es algo así como:

// Hypothetical implementation
windowedMessages.streamWindows((interval, window) -> process(interval, window));

donde el proceso método sería algo así como:

// Hypothetical implementation

void process(Interval interval, WindowStream<UserId, List<Message>> windowStream) {
// Create report for the whole window   
Report report = new Report(nameFromInterval());
    // Loop on the finite iterable that represents the window content
    for (WindowStreamEntry<UserId, List<Message>> entry: windowStream) {
        report.addLine(entry.getKey(), entry.getValue());
    }
    report.close();
}

El resultado se agrupan como esto (cada informe es una llamada a mi devolución de llamada: proceso de vacío (...)) y el cometer de cada ventana se cometió cuando se procesa toda la ventana:

Report 1:
    KEY [UserId(85077691)@1531502750000/1531502760000] Message [Message(userId=UserId(85077691),message="h")]

Report 2:
    KEY [UserId(82770583)@1531502760000/1531502770000] Message [Message(userId=UserId(82770583),message="a"),Message(userId=UserId(82770583),message="b"),Message(userId=UserId(82770583),message="d")]
    KEY [UserId(77082590)@1531502760000/1531502770000] Message [Message(userId=UserId(77082590),message="g")]
    KEY [UserId(73176289)@1531502760000/1531502770000] Message [Message(userId=UserId(73176289),message="r"),Message(userId=UserId(73176289),message="q")]
    KEY [UserId(92077080)@1531502760000/1531502770000] Message [Message(userId=UserId(92077080),message="w")]
    KEY [UserId(78530050)@1531502760000/1531502770000] Message [Message(userId=UserId(78530050),message="t")]
    KEY [UserId(64640536)@1531502760000/1531502770000] Message [Message(userId=UserId(64640536),message="y")]

Report 3
    KEY [UserId(79117307)@1531502780000/1531502790000] Message [Message(userId=UserId(79117307),message="e")]
Bruno:

Yo tenía la misma duda. He hablado con los desarrolladores de la biblioteca y me dijeron que esta es una petición muy común todavía no implementado. Sera lanzado pronto.

Puede encontrar más información aquí: https://cwiki.apache.org/confluence/display/KAFKA/KIP-328%3A+Ability+to+suppress+updates+for+KTables

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=176639&siteId=1
Recomendado
Clasificación