#apache-spark #apache-kafka #stream #batch-processing #apache-kafka-streams
#apache-spark #apache-kafka #поток #пакетная обработка #apache-kafka-streams
Вопрос:
Предыстория —
Данные временных рядов поступают в Apache Kafka, которые я храню в Cassandra. Поскольку необработанные данные требуют большого объема памяти, я пытаюсь агрегировать данные и создавать ежечасные, ежедневные, ежемесячные сводки для отчетности. Я могу придумать два подхода:
- Потоковая обработка: Используйте Kafka Streams API для свертывания данных и приема свернутых данных в Cassandra.
- Пакетная обработка: загружает необработанные данные в Cassandra, а также поддерживает индекс вновь введенных ключей. Запустите планировщик для извлечения ключей из индексной таблицы, которые были недавно введены с момента последнего запуска, извлеките временные ряды из Cassandra, сверните и сохраните в почасовых, ежедневных таблицах.
Какой метод, по вашему мнению, лучше и почему?
Я попробовал метод пакетной обработки. Это позволяет мне догонять данные, даже если мой сводный ряд не работает в течение некоторого времени. НО я думаю, что это тратит впустую много ресурсов, чтобы обеспечить мне надежность.
Я ожидаю, что свертка будет выполнена без использования слишком большого количества ресурсов.
Ответ №1:
Оба решения будут осуществимы. Поскольку у меня мало опыта работы с Cassandra, я упомяну только о возможностях решения этой проблемы с потоками Kafka:
- Kafka Streams поддерживает этот вариант использования «из коробки», используя управление окнами и агрегации:
-
Это также позволяет обрабатывать записи с опозданием:
-
С Kafka Streams вам не нужно будет поддерживать отдельную базу данных, кроме Kafka, все ваши агрегации будут выполняться в вашем клиентском приложении. Внутренние потоки Kafka будут использовать RocksDB в качестве опции хранения. Агрегированные результаты могут быть записаны в отдельный раздел вывода или запрошены с помощью функции интерактивного запроса:
На этой странице приведены некоторые расширенные примеры:
Комментарии:
1. Стоит отметить, что выполненные потоковые агрегации могут быть записаны обратно в раздел Kafka, а оттуда транслироваться с помощью Kafka Connect на Cassandra (или в любом другом месте, где они необходимы). Вы также можете использовать KSQL вместо потоков Kafka.