Потоковая обработка в Kafka — это процесс работы с большим объемом информации путем распределения ее в потоки управления ими. Поток — это фиксированный объем информации для ее разовой обработки. Таким образом, вся информация в брокере Kafka, как правило, разбивается на потоки и обрабатывается. Этот механизм значительно экономит ресурсы и способствует снижению временных затрат на обработку. В брокере Kafka используются следующие основные элементы для потоковой обработки:
- библиотека Kafka Streams;
- топология потоковой передачи;
- потоки событий.
Каждый из этих элементов мы подробно рассмотрим далее.
Библиотека Kafka Streams
Kafka Streams — это клиентская библиотека Apache Kafka, позволяющая создавать приложения и микросервисы, которые хранятся в Kafka-кластере. Kafka Streams позволяет развертывать стандартные приложения на стороне клиента, используя для этого сервер приложений. Эта библиотека также позволяет распараллеливать (выполнять их в параллельных потоках) задачи для выполнения. За распараллеливание задач отвечает JAVA-класс KafkaStreams, который запускает потоки c с помощью метода start(). Далее рассмотрен пример кода, который распараллеливает потоки в созданной топологии и запускает их работу:
Map<String, Object> props = new HashMap<>(); props.put(StreamsConfig.APPLICATION_ID_CONFIG, "my-stream-processing-application"); props.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass()); props.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass()); StreamsBuilder builder = new StreamsBuilder(); KafkaStreams streams = new KafkaStreams(builder, props); streams.start(); Thread.sleep(30000); streams.close();
При выполнении задач потоки необходимо закрывать при помощи метода close()
, так как они резервируют ресурсы и могут препятствовать выполнению других потоков в приложении.
Топология потоковой передачи
Топология потоковой передачи (ТПП) представляет собой направленный ациклический граф (Directed acyclic graph, DAG), который не содержит циклов, то есть состоит только из вершин и ребер. Причем каждое ребро направлено от одной вершины к другой, так что следование этим направлениям никогда не образует замкнутого цикла. В качестве вершин этого графа в ТПП выступают рабочие узлы, которые соединены между собой потоками, представляющими собой ребра графа. Для создания топологии потоковой передачи необходимо создать ветви (ребра), задав необходимые условия с помощью класса Predicate. Следующий код на языке Java отвечает за создание потоковой топологии с несколькими ветвями:
public class KafkaTopology{ public static final double SOME_CONSTANT = 100; // задание необходимых услови для каждой из ветвей топологии Predicate<String, JsonObject> greaterThan = (String key, JsonObject value) -> { double dValue = value.get("my_double_value").getAsDouble(); return dValue > SOME_CONSTANT; }; Predicate<String, JsonObject> lessThan = (String key, JsonObject value) -> { double dValue = value.get("my_double_value").getAsDouble(); return dValue < SOME_CONSTANT; }; Predicate<String, JsonObject> equalTo = (String key, JsonObject value) -> { double dValue = value.get("my_double_value").getAsDouble(); return Math.abs(dValue - SOME_CONSTANT) < epsilon; }; Predicate<String, JsonObject>[] conditions = new Predicate<>[] { greaterThan, lessThan, equalTo }; KStream<String, JsonElement>[] branches = inputStream.branch(conditions); branches[0].to("greater-than-topic"); branches[1].to("less-than-topic"); branches[2].to("equal-to-topic"); KafkaStreams streams = new KafkaStreams(builder.build(), config); streams.start(); }
Как видно из кода, созданная топология разбивает входящий топик на 3 топика в зависимости от значений поля «my_double_value
» в каждом из сообщений следующим образом:
- топик со значением поля больше заданного значения;
- топик со значением поля меньше заданного значения;
- топик со значением поля равным заданному значению.
При этом разбиение топика происходит с помощью утилиты Kafka Streams, которая создает три параллельно выполняющихся потока для одновременного создания трех топиков на Kafka-сервере.
Потоки событий
Поток событий (event stream) представляет собой коллекцию (множество) событий, которые происходят одновременно в данный момент времени. Событие в Kafka — это факт, описывающий изменение состояния объекта (например, заполнение топика сообщениями или разбиение топика на разделы). Kafka узнает о новом событии благодаря механизму регистрации событий. Регистрация событий — это считывание текущего состояния объекта и сравнение этого состояния с более ранним. В случае, если текущее состояние объекта отличается от предыдущего, брокер Kafka автоматически регистрирует новое событие, а также создает поток событий, в который помещаются все события зарегистрированные в данный момент времени. Следующий код на языке Java отвечает за создание потока событий и помещение в него события (event) путем его сериализации (превращение объекта в последовательность битов):
KStreamBuilder builder = new KStreamBuilder() //создание нового потока Kafka ; //сериализация текущего события builder.stream(keySerde, valueSerde, "my_entity_events") .groupByKey(keySerde, valueSerde) // помещение сериализованного события в поток .reduce((currentState, event) keySerde, valueSerde,"my_entity_store").toStream(); return builder; //возвращение заполненного события
Таким образом, благодаря надежному механизму потоковой обработки, брокер Kafka может обеспечить высокий уровень экономии ресурсов и затрат времени на обработку Big Data. Это делает Apache Kafka универсальным и надежным средством для хранения и обмена большими потоками данных, что позволяет активно использовать этот брокер сообщений в задачах Data Science и разработке распределенных приложений.
Apache Kafka для инженеров данных
Код курса
DEVKI
Ближайшая дата курса
3 марта, 2025
Продолжительность
24 ак.часов
Стоимость обучения
72 000 руб.
Освоить Apache Kafka на профессиональном уровне в качестве администратора Big Data кластеров, разработчика распределенных приложений и прочих прикладных областях Data Science вы сможете на практических курсах по Kafka в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве: