Рубрики
Uncategorized

Полезные инструменты для разработчиков Apache Kafka

Этот пост блога был первоначально опубликован в сливом блоге. Apache Kafka® находится в ядре … Теги с DevOps, Apachekafka, Kafka, Eventstreaming.

Этот пост блога был первоначально опубликован на Слиточный блог Отказ

Apache Kafka ® В ядре большой экосистемы, которая включает в себя мощные компоненты, такие как Kafka Connect и Kafka Streams. Эта экосистема также включает в себя многие инструменты и утилиты, которые делают нас, как разработчики Kafka, более продуктивные, делая нашу работу проще и более приятными. Ниже мы посмотрим на несколько этих инструментов и как они могут помочь нам сделать работу.

кафкакат

Нам нравится сохранять лучшее для последнего, но этот инструмент слишком хорош, чтобы ждать. Итак, мы начнем, покрывая кафкакат.

Кафкакат Это быстрая и гибкая командная строка кафка производитель, потребитель и многое другое. Magnus Edenhill, автор библиотеки Librdkafka C/C ++ для кафки, разработал его. Кафкакат отлично подходит для быстрого производства и потребления данных в тему и с темы. На самом деле, та же команда будет делать оба, в зависимости от контекста. Проверь это:

$  ~ echo "Hello World" | kafkacat -b localhost:29092 -t hello-topic
% Auto-selecting Producer mode (use -P or -C to override)

Мы отправили данные в stdout с эхо и побудил его к кафкакату. Нам нужно только два простых флага: -b для брокера и -t по теме. Кафкакат понимает, что мы отправляем ИТ-данные и переключатели в режим производительности. Теперь мы можем прочитать эти данные с помощью команды kafkacat:

$  ~ kafkacat -b localhost:29092 -t hello-topic
% Auto-selecting Consumer mode (use -P or -C to override)
Hello World
% Reached end of topic hello-topic [0] at offset 1

Если мы хотим отправить запись с ключом, нам просто нужно использовать разделитель и рассказать кафкакатом, что это с -K флаг. В этом случае мы будем использовать толстую кишку:

$  ~ echo "123:Jane Smith" | kafkacat -b localhost:29092 -t customers -K:
% Auto-selecting Producer mode (use -P or -C to override)

Опять же, такая же команда KAFKACAT будет прочитать запись с темы:

$  ~ kafkacat -b localhost:29092 -t customers -K:
% Auto-selecting Consumer mode (use -P or -C to override)
123:Jane Smith
% Reached end of topic customers [0] at offset 1

В качестве альтернативы, мы можем оставить -K Отключитесь при чтении, если мы хотим только значение:

$  ~ kafkacat -b localhost:29092 -t customers
% Auto-selecting Consumer mode (use -P or -C to override)
Jane Smith
% Reached end of topic customers [0] at offset 1

Обратите внимание, что данные трубопроводов от stdout К кафкакату, как мы сделали выше, раскрутит производитель, отправьте данные, а затем выключите производитель вниз. Чтобы начать производитель и оставить его, чтобы продолжить отправку данных, используйте Флаг, как предложено Автоматический выбор сообщение выше.

Потребитель останется запущенным так же, как Кафка-консоль-потребитель было бы. Для того, чтобы потреблять от темы и немедленно выйти, мы можем использовать флаг.

Чтобы потреблять данные, которые есть в AVRO Формат, мы можем использовать -s флаг. Этот флаг можно использовать для всей записи -s avro. , для только что ключей -s или только ценность -s . Вот пример, используя Фильмы Тема из популярных Учебник по рейтингу фильма :

$  ~ kafkacat -C -b localhost:29092 -t movies -s value=avro -r http://localhost:8081
------------------------------------------------------
{"id": 294, "title": "Die Hard", "release_year": 1988}
{"id": 354, "title": "Tree of Life", "release_year": 2011}
{"id": 782, "title": "A Walk in the Clouds", "release_year": 1995}
{"id": 128, "title": "The Big Lebowski", "release_year": 1998}
{"id": 780, "title": "Super Mario Bros.", "release_year": 1993}

В этом маленьком инструменте есть много энергии, и есть много других флагов, которые можно использовать с ним. Бег Кафкакат -х предоставит полный список. Для более высоких примеров кафкаката в действии, Проверить связанные сообщения на блоге Робина Моффатта. Один кусок отсутствует из кафкаката, это Возможность производить данные в AVRO формат Отказ Как мы видели, мы можем потреблять AVRO С кафкакатом, используя реестр слияния схемы, но мы не можем его изготовить. Это приводит нас к нашему следующему инструменту.

Слюдный отдых прокси

Сливень отдыха прокси это богатый особенностьми HTTP Kafka Client. Его можно использовать для обеспечения поддержки кафки приложениям, написанным на языке без собственного клиента KAFKA. Это, вероятно, его наиболее распространенное использование, но это также может быть удобным инструментом разработчика. Это может легко произвести AVRO Данные в кафка-тему, как показано здесь:

$ ~ curl -X POST \
-H "Content-Type: application/vnd.kafka.avro.v2+json" \
-H "Accept: application/vnd.kafka.v2+json" \
--data @newMovieData.json "http://localhost:8082/topics/movies"
------------------------------------------------------------------------------
{"offsets":[{"partition":0,"offset":5,"error_code":null,"error":null}],"key_schema_id":null,"value_schema_id":3}

Отдых Proxy является частью сливной платформы в рамках слияющей общественной лицензии, но ее можно использовать самостоятельно с любым кафкойским кластером. Это может сделать намного больше, чем то, что мы будем покрывать здесь, как вы можете Смотрите из документов Отказ Как показано выше, прокси-сервер для отдыха можно использовать из командной строки с Curl или что-то подобное. Он также может быть использован с такими инструментами, как Postman, чтобы построить удобную для пользователя KAFKA UI. Вот пример производства к теме с Postman (The Content-Type и Принять Заголовки были установлены под вкладкой «Заголовки»): Как мы можем видеть с обоих Curl и версии Postman, ROTE PROXY требует, чтобы схема для AVRO Сообщения передаются с каждым запросом на продукцию. Инструмент, похожий на почтальон, который позволяет создать библиотеку сохраненных запросов, может сделать это проще для управления. Чтобы потреблять от темы с прокси-сервером отдыха, мы сначала создаем потребителя в группе потребителей, а затем подпишитесь на тему или темы, и, наконец, привлечь рекорды к содержанию нашего сердца. Мы вернемся к скручивание Так что мы можем увидеть все необходимые биты одновременно. Во-первых, мы Пост К конечной точке потребителя с нашим именем потребительской группы. В этом Пост Запрос, мы передадим имя для нашего нового экземпляра потребителей, внутренний формат данных (в этом случае AVRO ), а auto.offset.reset ценность.

$ ~ curl -X POST  -H "Content-Type: application/vnd.kafka.v2+json" \
      --data '{"name": "movie_consumer_instance", "format": "avro", "auto.offset.reset": "earliest"}' \
      http://localhost:8082/consumers/movie_consumers
-----------------------------------------------------------------------------------
{"instance_id":"movie_consumer_instance","base_uri":"http://localhost:8082/consumers/movie_consumers/instances/movie_consumer_instance"}

Это вернет Идентификатор экземпляра и база URI вновь созданного экземпляра потребителей. Далее мы будем использовать это URI Подписаться на тему с Пост к подписка конечная точка.

$  ~ curl -X POST -H "Content-Type: application/vnd.kafka.v2+json" --data '{"topics":["movies"]}' \      http://localhost:8082/consumers/movie_consumers/instances/movie_consumer_instance/subscription

Это ничего не возвращает, но должно получить 204 отклик. Теперь мы можем использовать Получить Запрос на Записи Конечная точка того же URI чтобы получить записи.

$  ~ curl -X GET -H "Accept: application/vnd.kafka.avro.v2+json" \      http://localhost:8082/consumers/movie_consumers/instances/movie_consumer_instance/records
---------------------------------------------------------------------------
[{"topic":"movies","key":null,"value":{"id": 294, "title": "Die Hard", "release_year": 1988},"partition":0,"offset":0},
{"topic":"movies","key":null,"value":{"id": 354, "title": "Tree of Life", "release_year": 2011},"partition":0,"offset":1},{"topic":"movies","key":null,"value":{"id": 782, "title": "A Walk in the Clouds", "release_year": 1995},"partition":0,"offset":2},{"topic":"movies","key":null,"value":{"id": 128, "title": "The Big Lebowski", "release_year": 1998},"partition":0,"offset":3},{"topic":"movies","key":null,"value":{"id": 780, "title": "Super Mario Bros.", "release_year": 1993},"partition":0,"offset":4},{"topic":"movies","key":null,"value":{"id":101,"title":"Chariots of Fire","release_year":1981},"partition":0,"offset":5}]

Потребитель, который мы создали, останется, и мы можем сделать то же самое Получить Запрос в любое время, чтобы проверить новые данные. Если нам больше не нужен этот потребитель, мы можем УДАЛИТЬ это использует базу Уваживание .

$  ~ curl -X DELETE -H "Content-Type: application/vnd.kafka.v2+json" \    http://localhost:8082/consumers/movie_consumers/instances/movie_consumer_instance

Мы также можем получить информацию о брокеры , Темы и разделы С простым Получить Запросы.

$  ~ curl "http://localhost:8082/brokers"
$  ~ curl "http://localhost:8082/topics"
$  ~ curl "http://localhost:8082/topics/movies"
$  ~ curl "http://localhost:8082/topics/movies/partitions"

Эти запросы могут вернуть довольно немного JSON Данные, которые мы уйдем ради места. Однако это приведет нас к нашему следующему инструменту.

JQ: Процессор командной строки для JSON

Хотя не специфично для кафки, JQ Это невероятно полезный инструмент при работе с другими утилитами командной строки, которые возвращают JSON данные. JQ это утилита командной строки, которая позволяет нам отформатировать, манипулировать и извлекать данные из JSON вывод других программ. Инструкции для загрузки и установки JQ можно найти на Github вместе со ссылками на учебники и другие ресурсы.

Давайте вернемся и посмотрите на остаток прокси-сервера из Получить Призыв к нашему потребителю выше. Это не самый большой BLOB JSON там, но это все еще немного трудно читать. Давайте попробуем еще раз, на этот раз трубопроводный выход на JQ :

$  ~ curl -X GET -H "Accept: application/vnd.kafka.avro.v2+json" \
      http://localhost:8082/consumers/movie_consumers/instances/movie_consumer_instance/records | jq

[
  {
    "topic": "movies",
    "key": null,
    "value": {
      "id": 294,
      "title": "Die Hard",
      "release_year": 1988
    },
    "partition": 0,
    "offset": 0
  },
  {
    "topic": "movies",
    "key": null,
    "value": {
      "id": 354,
      "title": "Tree of Life",
      "release_year": 2011
    },
    "partition": 0,
    "offset": 1
  },
  {
    "topic": "movies",
    "key": null,
    "value": {
      "id": 782,
      "title": "A Walk in the Clouds",
      "release_year": 1995
    },
    "partition": 0,
    "offset": 2
  },
  {
    "topic": "movies",
    "key": null,
    "value": {
      "id": 128,
      "title": "The Big Lebowski",
      "release_year": 1998
    },
    "partition": 0,
    "offset": 3
  },
  {
    "topic": "movies",
    "key": null,
    "value": {
      "id": 780,
      "title": "Super Mario Bros.",
      "release_year": 1993
    },
    "partition": 0,
    "offset": 4
  },
  {
    "topic": "movies",
    "key": null,
    "value": {
      "id": 101,
      "title": "Chariots of Fire",
      "release_year": 1981
    },
    "partition": 0,
    "offset": 5
  }
]

Гораздо легче читать сейчас, но все еще немного шумно. Допустим, мы только хотим только названия фильмов и их высвобождения. Мы можем сделать это легко с JQ :

$  ~ curl -X GET -H "Accept: application/vnd.kafka.avro.v2+json" \
      http://localhost:8082/consumers/movie_consumers/instances/movie_consumer_instance/records | jq \
      | jq '.[] | {title: .value.title, year: .value.release_year}'

{
  "title": "Die Hard",
  "year": 1988
}
{
  "title": "Tree of Life",
  "year": 2011
}
{
  "title": "A Walk in the Clouds",
  "year": 1995
}
{
  "title": "The Big Lebowski",
  "year": 1998
}
{
  "title": "Super Mario Bros.",
  "year": 1993
}
{
  "title": "Chariots of Fire",
  "year": 1981
}

Давайте посмотрим на то, что мы только что сделали (и вы можете Следуйте вместе с живым примером в jqplay ):

  1. Мы побудили вывод от остальных прокси до jq. . Бит между одиночными цитатами — это JQ Программа с двумя шагами. JQ Использует тот же символ трубы для передачи выхода одного шага к входу другого.
  2. В нашем примере первый шаг в JQ это итератор, который будет прочитать каждую запись фильма из массива и передавать его на следующий шаг.
  3. Второй шаг в JQ Создает новый JSON объект из каждой записи. Клавиши являются произвольными, но значения получаются от входа с использованием jq. ‘s Личность Оператор, '.' .

Довольно круто, да? Есть гораздо больше, что можно сделать с JQ , а ты можешь Прочитайте все об этом в документации Отказ То, как JQ работает на потоке JSON Данные, позволяющие объединить различные операции, чтобы добиться наших желаемых результатов, напоминает мне о KAFKA Reams — привлекая нас к нашему окончательному инструменту.

Кафка потоки топологии визуализатор

Кафка потоки топологии визуализатора Принимает текст описания топологии потоков кафки и производит графическое представление, показывающее входные темы, узлы обработки, промежуточных тем, штатных магазинов и т. Д. Это отличный способ получить вид на большой вид на сложные потоки кафки топологию. Топология для учебника рейтингов фильмов — это не весь этот сложный, но он будет хорошо продемонстрировать этот инструмент.

Вот текст нашей топологии, который мы захватили с Топология:: Опишите Метод:

Topologies:
   Sub-topology: 0
    Source: KSTREAM-SOURCE-0000000000 (topics: [movies])
      --> KSTREAM-MAP-0000000001
    Processor: KSTREAM-MAP-0000000001 (stores: [])
      --> KSTREAM-SINK-0000000002
      <-- KSTREAM-SOURCE-0000000000
    Sink: KSTREAM-SINK-0000000002 (topic: rekeyed-movies)
      <-- KSTREAM-MAP-0000000001 Sub-topology: 1 Source: KSTREAM-SOURCE-0000000010 (topics: [KSTREAM-MAP-0000000007-repartition]) --> KSTREAM-JOIN-0000000011
    Processor: KSTREAM-JOIN-0000000011 (stores: [rekeyed-movies-STATE-STORE-0000000003])
      --> KSTREAM-SINK-0000000012
      <-- KSTREAM-SOURCE-0000000010 Source: KSTREAM-SOURCE-0000000004 (topics: [rekeyed-movies]) --> KTABLE-SOURCE-0000000005
    Sink: KSTREAM-SINK-0000000012 (topic: rated-movies)
      <-- KSTREAM-JOIN-0000000011 Processor: KTABLE-SOURCE-0000000005 (stores: [rekeyed-movies-STATE-STORE-0000000003]) --> none
      <-- KSTREAM-SOURCE-0000000004 Sub-topology: 2 Source: KSTREAM-SOURCE-0000000006 (topics: [ratings]) --> KSTREAM-MAP-0000000007
    Processor: KSTREAM-MAP-0000000007 (stores: [])
      --> KSTREAM-FILTER-0000000009
      <-- KSTREAM-SOURCE-0000000006 Processor: KSTREAM-FILTER-0000000009 (stores: []) --> KSTREAM-SINK-0000000008
      <-- KSTREAM-MAP-0000000007
    Sink: KSTREAM-SINK-0000000008 (topic: KSTREAM-MAP-0000000007-repartition)
      <-- KSTREAM-FILTER-0000000009

Вы можете быть адепт на чтении такого рода вывода, но большинство людей найдут графическое представление очень полезно: Visualizer Visualizer Kafka Streams — это веб-приложение, которое вы можете вместить сам (источник доступен на Github ). Для случайного использования Общественная размещенная версия вероятно, достаточно.

Комплексная топология может быть трудно просмотреть все сразу, поэтому вы также можете визуализировать подпротологии, а затем объединить изображения таким образом, чтобы проще просмотреть. Это может быть огромная помощь в доведении новых разработчиков до скорости на существующем приложении Kafka Streams.

Топология KSQLDB

ksqldb Это база данных потоковой передачи событий, которая позволяет нам создавать сложные топологии, используя синтаксис, знакомый для любого разработчика SQL. Поскольку ksqldb построен на вершине kafka потоков, топологии топологии кафки также работают на этих типах топологий.

Мы можем получить описание топологии из KSQLDB с Объясните команда. Во-первых, найдите выполняемую запрос:

ksql> SHOW QUERIES;

 Query ID              | Query Type | Status    | Sink Name      | Sink Kafka Topic | Query String
-------------------------------------------------------------------------------------------------------------------------------
 CSAS_SHIPPED_ORDERS_0 | PERSISTENT | RUNNING:1 | SHIPPED_ORDERS | SHIPPED_ORDERS   | CREATE STREAM SHIPPED_ORDERS WITH 
 ...

Теперь мы можем использовать это сгенерированное имя запроса, Csas_shaps_orders_0 , чтобы получить топологию:

ksql> EXPLAIN CSAS_SHIPPED_ORDERS_0;

Это дает нам честное количество выходов, поэтому мы не покажем все это здесь, но к концу мы видим описание топологии. Копирование и вставка его в результаты визуализатора на этой диаграмме:

Верхушка айсберга

Мы посмотрели на четыре полезных инструмента для разработчиков Apache Kafka, но там много других, что является одним из преимуществ работы в таком ярком сообществе. Если есть инструмент командной строки или графическое приложение, которое вы считаете полезными в том, чтобы получить максимальную отдачу от Кафки, расскажите об этом другим. Слюдный общественный форум это отличное место, чтобы поделиться этой информацией. Мы с нетерпением ждем продолжения этой дискуссии с вами там!

Оригинал: «https://dev.to/daveklein/helpful-tools-for-apache-kafka-developers-1l89»