Как создать тему в apache kafka?

Что лучше всего создавать темы в kafka?

  • Сколько реплик/разделов будет определено при создании тем?

В новом API-интерфейсе производителя, когда я пытаюсь опубликовать сообщение для не существующего раздела, он сначала сбой и успешное опубликование.

  • Я хотел бы знать, какие отношения между репликой, разделами и количеством узлов кластера.
  • Нужно ли создавать тему перед публикацией сообщений?

Ответ 1

При запуске брокера Kafka вы можете определить набор свойств в файле conf/server.properties. Этот файл является просто файлом свойств значения ключа. Одним из свойств является auto.create.topics.enable, если для него установлено значение true (по умолчанию), Kafka будет создавать темы автоматически при отправке сообщений на несуществующие темы.

Все параметры конфигурации, которые вы можете найти, определены здесь. ИМХО, простое правило для создания тем следующее: количество реплик должно быть не меньше, чем количество узлов, которые у вас есть. Количество тем должно быть множителем количества узлов в вашем кластере, например:

  • У вас есть 9 узлов кластера
  • Ваша тема должна иметь 9 разделов и 9 реплик или 18 разделов и 9 реплик или 36 разделов и 9 реплик и так далее...

Ответ 2

Номер раздела определяет parallelism темы, поскольку один раздел может потребляться только одним потребителем в группе потребителей. Например, если у вас есть только 10 разделов для темы и 20 потребителей в группе потребителей, 10 пользователей простаивают, не получая никаких сообщений. Число действительно зависит от вашего приложения, но 1-1000s все разумно.

Номер реплики определяется вашей долговечностью. Для темы с коэффициентом репликации N Kafka может терпеть до отказа сервера N-1, не теряя при этом сообщений, переданных в журнал. 3 реплики являются общей конфигурацией. Конечно, номер реплики должен быть меньше или равен вашему номеру брокера.

auto.create.topics.enable свойство, когда Kafka позволяет автоматически создавать тему на сервере. Если для этого параметра установлено значение true, когда приложения пытаются производить, потреблять или извлекать метаданные для несуществующей темы, Kafka автоматически создаст тему с коэффициентом репликации по умолчанию и количеством разделов. Я бы рекомендовал отключить его на производстве и создать темы заранее.

Ответ 3

задайте свойство  auto.create.topics.enable=true  в файле server.properties, если у вас есть несколько брокеров, сделайте то же самое для всего файла сервера *.properties и перезапустите свой kafka-сервер. Но убедитесь, что вы установили разделы для соответствующего номера на сервере *.properties num.partitions=int, иначе будет проблема с производительностью, если позже увеличить разделы.

Ответ 4

Базовый уровень parallelism в Кафке - это раздел. Как на стороне производителя, так и на стороне брокера, записи в разные разделы могут выполняться полностью параллельно.

Что нужно иметь в виду

  • Больше разделов Требуется больше открытых файлов с файлами
  • Больше разделов может увеличить недоступность
  • Больше разделов может увеличить конечную задержку

Как правило, это, вероятно, хорошая идея ограничить количество разделов на брокера до 100 x b x r, где b - количество брокеров, а r - коэффициент репликации.

Например: Если у вас 9 брокеров/узлов в вашем кластере, ваша тема может иметь

  • 1800 разделов с 3 репликами или
  • 900 разделов и 2 реплики

EDIT: См. статью Как выбрать количество тем/разделов в кластере Kafka? для дальнейшие подробности (ответ был сделан оттуда)

Ответ 5

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

1) Как лучше всего создавать темы в кафке? Нужно ли создавать темы до публикации сообщений?

Я думаю, что если мы знаем, что собираемся использовать тему с фиксированным именем Kafka заранее, нам было бы лучше создать тему, прежде чем писать или читать сообщения из нее. Обычно это можно сделать в сценарии после запуска с помощью bin/kafka-topics.sh, см., Например, официальную документацию. Или мы можем использовать KafkaAdminClient, который был представлен в Kafka 0.11.0.0.

С другой стороны, я вижу некоторые случаи, когда нам нужно было бы генерировать название темы на лету. В этих случаях мы не сможем узнать фиксированное имя темы, и мы можем полагаться на свойство "auto.create.topics.enable". Когда он включен, тема будет создана автоматически. И это поднимает второй вопрос:

2) Какие действия будут вызывать создание, когда auto.create.topics.enable имеет значение true

На самом деле, как @Lan уже указал

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

Я хотел бы выразиться еще проще:

Если автоматическое создание темы включено для брокеров Kafka, то всякий раз, когда брокер Kafka видит определенное имя темы, эта тема будет создана, если она еще не существует.

А также тот факт, что выборка метаданных автоматически создаст тему, часто игнорируется людьми, в том числе и мной. Конкретным примером этого является использование API customer.partitionFor(topic), этот метод создает данную тему, если она не существует.

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