Потоковая обработка в 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
Ближайшая дата курса
20 января, 2025
Продолжительность
24 ак.часов
Стоимость обучения
72 000 руб.
Освоить Apache Kafka на профессиональном уровне в качестве администратора Big Data кластеров, разработчика распределенных приложений и прочих прикладных областях Data Science вы сможете на практических курсах по Kafka в нашем лицензированном учебном центре обучения и повышения квалификации ИТ-специалистов в Москве: