От open-source до Confluent: 3 клиента Python для Apache Kafka

курсы по Apache Kafka, Kafka обучение, обучение большим данным, Кафка для разработчиков, Apache Kafka for developers, Apache Kafka Python, обработка данных, большие данные, Big Data, Kafka, Python, librdkafka, PyKafka, Kafka-Python

Развивая наш новый курс по Apache Kafka для разработчиков, сегодня мы рассмотрим 3 способа о взаимодействии с этой популярной Big Data платформой потоковой обработки событий с помощью языка Python, который считается самым распространенным инструментом в Data Science. Читайте далее, что такое librdkafka, чем PyKafka отличается от Kafka-Python и почему решение от Confluent предпочтительнее других вариантов.

Как работать с Apache Kafka средствами Python

Обычно разработчики Big Data решений применяют Java или Scala для создания приложений Apache Kafka. Однако, с учетом популярности Python в Data Science в частности и широкой распространенности этого языка программирования вообще, многие решения также создаются с использованием этого инструментария.

Для использования Python в Kafka существует несколько готовых средств [1]:

  • Kafka-Python – библиотека с открытым исходным кодом от сообщества разработчиков;
  • PyKafka — API-интерфейс Python от Parse.ly, компании-разработчика систем веб-аналитики и оптимизации контента для онлайн-издателей;
  • Confluent Python Kafka – клиент Python для Kafka от корпорации Confluent, которая занимается разработкой и коммерциализацией этой стриминговой платформы.

Что общего у этих решений и чем они отличаются друг от друга, мы подробно рассмотрим далее.

Как устроена open-source библиотека Kafka-Python

Этот клиент Python для Кафка спроектирован так, чтобы работать так же, как официальный клиент java, с добавлением соответствующих интерфейсов, например, итераторы потребителей (consumer iterators). Kafka-python рекомендуется использовать с новыми брокерами (0.9+), т.к. некоторые функции могут быть недоступны у старых версий (до 0.8.0), несмотря на обратную совместимость. Например, для полностью скоординированных групп потребителей, т.е. динамического назначения разделов нескольким потребителям в одной группе, нужны брокеры Кафка 0.9. Поддержка этой функции для более ранних выпусков потребует разработки и поддержки пользовательского кода выбора лидера и проверки работоспособности узлов кластера, возможно, с использованием Apache Zookeeper или Consul. Для более старых брокеров можно вручную организовать что-то подобное, назначив разные разделы каждому экземпляру-потребителю с помощью средств управления конфигурацией, таких как Chef, Ansible и пр. DevOps-инструменты. Такой подход будет работать, но не обеспечивает автоматическую перебалансировку в случае сбоя.

Kafka-Python предоставляет 6 различных API в виде классов KafkaConsumer, KafkaProducer, KafkaAdminClient, KafkaClient, BrokerConnection, ClusterMetadata. Например, KafkaConsumer – это высокоуровневый потребитель сообщений, очень похожий на официальный Java-клиент. Итератор-потребитель возвращает ConsumerRecords – простые именованные кортежи, которые предоставляют основные атрибуты сообщения: топик, раздел, смещение, ключ и значение. KafkaProducer — это высокоуровневый производитель асинхронных сообщений, который также весьма близок официальному клиенту Java. В отличие от KafkaConsumer, KafkaProducer можно использовать в потоках. Kafka-Python изначально поддерживает сжатие и распаковку gzip, а для работы с кодеками lz4 и snappy, потребуется установить дополнительные пакеты: python-lz4 и python-snappy соответственно. Также Kafka-Python предоставляет простой в использовании уровень протокола для взаимодействия с брокерами Кафка через Python repl, что пригодится для тестирования и других экспериментов [2].

Что такое PyKafka

PyKafka — это удобный для программистов клиент Kafka для Python, который включает Python-реализации производителей и потребителей Кафка с опциональной поддержкой расширения языка C на librdkafka. Librdkafka – это реализация С-библиотеки протокола Apache Kafka, поддерживающая как производителя, так и потребителя. Librdkafka была разработана для надежной и высокопроизводительной доставки сообщений порядка 800 тысяч сообщений в секунду для производителя и 3 миллиона сообщений в секунду для потребителя. Для PyKafka расширение C, которое использует librdkafka, ускоряет работу производителя и потребителя сообщений.

PyKafka включает в себя небольшой набор инструментов CLI, полезных для общих задачам, связанными с администрированием кластера Kafka, включая мониторинг смещений и задержек и проверку топиков. Библиотека работает под Python 2.7+, 3.4+ и PyPy, поддерживая версии Кафка 0.8.2 и выше. Основная цель PyKafka – обеспечить аналогичный JVM-клиенту Кафка уровень абстракции с Python API. PyKafka требует librdkafka v0.9.1 +. Для использования расширения librdkafka необходимо убедиться, что файлы заголовков и общая библиотека находятся там, где Python сможет их найти, как при создании расширения, так и во время выполнения. Это означает, что нужно установить librdkafka в обычном для вашей системы месте или объявить C_INCLUDE_PATH, LIBRARY_PATH и LD_LIBRARY_PATH в среде оболочки, указав на место установки общих объектов librdkafka [3].

Основные отличия PyKafka от вышерассмотренной open-source библиотеки Kafka-Python заключаются в особенностях Python API и реализации BalancedConsumer. BalancedConsumer реализует концепцию Кафка о высокоуровневом потребителе, который использует ZooKeeper для балансировки потребления разделов между несколькими узлами в группе потребителей.

Кроме того, PyKafka стремится сохранить API как можно более Python’ическим, что означает использование полезных функций языка там, где это необходимо для простоты кода, например, диспетчеры контекста для очистки объекта и фьючерсы для асинхронной обработки ошибок. PyKafka поддерживает 2.7, 3.4, 3.5 и pypy, в то время как kafka-python добавляет 2.6 и удаляет поддержку 3.5. Kafka-Python также требует подключения ZooKeeper для управления смещением, чего нет в PyKafka. Kafka-Python поддерживает версии Кафка от 0.8.0 до 0.8.2, тогда как PyKafka – только 0.8.2.

Наконец, благодаря librdkafka, потребитель PyKafka работает быстрее Kafka-Python. И управлять сбалансированными потребителями в PyKafka немного проще. Также в этих библиотеках отличаются интерфейсы producer’а. Kafka-Python не требует задания топика при создании экземпляра производителя. Это удобно для динамического создания топиков. В PyKafka нельзя создавать динамические топики. Но производитель PyKafka не отказывает при перезапуске брокера Кафка, в отличие от Kafka-Python [4].

Немного о продукте от Confluent

Последний вариант, пакет Python confluent-kafka представляет собой обертку поверх C-клиента уже помянутой библиотеки librdkafka. Поэтому максимальная пропускная способность находится на уровне Java-клиента для сообщений большего размера, когда накладные расходы интерпретатора Python оказывают меньшее влияние. В целом задержка сравнима с клиентом Java. Решение от Confluent представляет собой высокоуровневый Producer, Consumer и AdminClient, совместимый со всеми брокерами Кафка выше версии 0.8, Confluent Platform и Confluent Cloud, о котором мы говорили вчера. Для обеспечения информационной безопасности решение поддерживает SASL Kerberos/GSSAPI, однако это не входит в версию по умолчанию и требует дополнительной настройки [5]. В следующей статье мы продолжим разговор про Python для Big Data и рассмотрим, как перейти от Python-скриптов к приложениям PySpark, конвертировав локальные данные и функции их обработки в распределенную среду кластерных вычислений  Apache Spark. А тонкостях применения RESTful API в приложениях Kafka читайте здесь.

Освоить все особенности администрирования и разработки Apache Kafka для потоковой аналитики больших данных вы сможете на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

 

 

Источники

  1. https://towardsdatascience.com/getting-started-with-apache-kafka-in-python-604b3250aa05
  2. https://kafka-python.readthedocs.io/en/master/index.html
  3. https://github.com/Parsely/pykafka
  4. https://github.com/Parsely/pykafka/issues/334
  5. https://github.com/confluentinc/confluent-kafka-python