Можно ли добавить разделы в существующую тему в Kafka 0.8.2
У меня есть кластер Kafka, работающий с двумя разделами. Я искал способ увеличить количество разделов до 3. Однако я не хочу потерять существующие сообщения в теме. Я попытался остановить Kafka, изменив файл server.properties
, чтобы увеличить количество разделов до 3 и перезапустить Kafka. Однако это ничего не меняет. Используя Kafka ConsumerOffsetChecker
, я все еще вижу, что он использует только 2 раздела. Версия Kafka, которую я использую, равна 0.8.2.2. В версии 0.8.1 раньше существовал script, называемый kafka-add-partitions.sh
, который, я думаю, мог бы сделать трюк. Тем не менее, я не вижу такого script в 0.8.2. Есть ли способ сделать это? Я экспериментировал с созданием совершенно новой темы, и для нее она, похоже, использует 3 раздела в соответствии с изменением в файле server.properties
. Однако для существующих тем это, похоже, не заботит.
Ответы
Ответ 1
Похоже, вы можете использовать this script вместо:
bin/kafka-topics.sh --zookeeper zk_host:port/chroot --alter --topic my_topic_name
--partitions 40
В коде похоже, что они делают то же самое:
AdminUtils.createOrUpdateTopicPartitionAssignmentPathInZK(topic, partitionReplicaList, zkClient, true)
kafka-topics.sh
выполняет этот фрагмент кода, а также AddPartitionsCommand, используемый kafka-add-partition script.
Однако при использовании ключа вы должны знать о повторном разделении:
Имейте в виду, что один из вариантов использования для разделов состоит в семантическом разбиении данные и добавление разделов не изменяет разделение существующих данных, поэтому это может помешать потребителям, если они полагаются на это раздел. То есть, если данные разделены на hash(key) % number_of_partitions
, то это разбиение будет потенциально перетасовывается путем добавления разделов, но Кафка не будет пытаться автоматически перераспределять данные любым способом.
Ответ 2
В моем случае значение zk_host:port/chroot
для параметра --zookeeper
бросило следующее исключение:
ERROR java.lang.IllegalArgumentException: Тема my_topic_name не существует на пути ZK zk_host: port/chroot.
Итак, я попробовал следующее, и это сработало:
bin/kafka-topics.sh --alter --zookeeper zk_host:port --topic my_topic_name --partitions 10
Ответ 3
Если вы используете Kafka в окне, попробуйте этот код для изменения или добавления раздела в теме
.\bin\windows\kafka-topics.bat --alter --zookeeper localhost:2181 --topic TopicName --partitions 20
или же
.\bin\windows\kafka-topics.bat --alter --zookeeper localhost:2181 --topic TopicName --replica-assignment 0:1:2,0:1:2,0:1:2,2:1:0 --partitions 10
Ответ 4
Для тех, кто хочет найти решение для более новых версий Kafka. Пожалуйста, следуйте этому методу.
Вся политика хранения и передачи данных Kafka зависит от разделов, поэтому будьте осторожны с эффектами увеличения разделов. (Более новые версии Kafka отображают предупреждение об этом) Старайтесь избегать конфигурации, в которой у одного брокера слишком много лидерских разделов.
Существует простой трехэтапный подход к этому.
Шаг 1. Увеличьте разделы в темах
./bin/kafka-topics.sh --zookeeper localhost:9092 --alter --topic testKafka_5 --partitions 6
Шаг 2. Создайте разделительный JSON файл для данной темы
{ "версия": 1, "разделы": [ { "Тема": "testKafka_5", "раздел": 0, "Реплика": [0,1,2]}, {"topic": "testKafka_5", "partition": 1, "replicas": [2,1,0]}, {"topic": "testKafka_5", "partition": 2, "replicas": [1, 2,0]}, { "Тема": "testKafka_5", "раздела": 3, "реплики": [0,1,2]}, {"topic": "testKafka_5", "partition": 4, "replicas": [2,1,0]}, {"topic": "testKafka_5", "partition": 5, "replicas": [1, 2,0]} ]}
Создайте файл с более новым разделом и репликами. Лучше расширить реплики для разных брокеров, но они должны присутствовать в одном кластере. Учитывайте время ожидания для дальних реплик.
Перенесите данный файл в свою Кафку.
Шаг 3. Переназначение разделов и проверка
./bin/kafka-reassign-partitions.sh --zookeeper localhost:9092 --reassignment-json-file bin/increase-replication-factor.json --execute
./bin/kafka-reassign-partitions.sh --zookeeper localhost:9092 --reassignment-json-file bin/increase-replication-factor.json --verify
Вы можете проверить влияние своих изменений с помощью команды --describe.