Today, I will talk about how to install Apache ZooKeeper and run the instance of it.
Prerequisites: JRE 1.6 or higher required (for development purposes, I would install JDK instead 1.6 or higher) At the time of writing this blog, the current stable version of Java is 1.8 and that should work perfectly fine (I have 1.7.0_51)
NOTE: I noticed that some of my peers tend to forget to set the environment variables, so please remember to set them before proceeding.
1. Installing Apache ZooKeeper
1. Download Apache ZooKeeper. You can choose from any given mirror – http://www.apache.org/dyn/closer.cgi/zookeeper/
2. Extract it to where you want to install ZooKeeper. I prefer to save it in the C:\dev\tools
directory. Unless you prefer this way as well, you will have to create that directory yourself.
3. Set up the environment variable.
- To do this, first go to Computer, then click on the
System Properties
button. - Click on the
Advanced System Settings
link to the left. - On a new window pop-up, click on the
Environment Variables...
button. - Under the
System Variables
section, clickNew...
- For the
Variable Name
, type inZOOKEEPER_HOME. Variable Value
will be the directory of where you installed the ZooKeeper. Taking mine for example, it would beC:\dev\tools\zookeeper-3.x.x
. - Now we have to edit the
PATH
variable. SelectPath
from the list and clickEdit...
- It is VERY important that you DO NOT erase the pre-existing value of the
Path
variable. At the very end of the variable value, add the following:%ZOOKEEPER_HOME%\bin;
Also, each value needs to be separated by semicolon. - Once that’s done, click OK and exit out of them all.
That takes care of the ZooKeeper installation part. Now we have to configure it so the instance of ZooKeeper will run properly.
2. Configuring ZooKeeper Server
If you look at the <zookeeper-install-directory>
there should be a conf
folder. Open that up, and then you’ll see a zoo-sample.cfg
file. Copy and paste it in the same directory, it should produce a zoo-sample - Copy.cfg
file. Open that with your favorite text editor (Microsoft Notepad should work as well).
Edit the file as follows:
tickTime=2000 initLimit=5 syncLimit=5 dataDir=/usr/zookeeper/data clientPort=2181 server.1=localhost:2888:3888
NOTE: you really don’t need lines 2 (initLimit=5
), 3 (syncLimit=5
), and 6 (server.1=localhost:2888:3888
). They’re just there for a good practice purposes, and especially for setting up a multi-server cluster, which we are not going to do here.
Save it as zoo.cfg
. Also the original zoo-sample.cfg
file, go ahead and delete it, as it is not needed.
Next step is to create a myid
file. If you noticed earlier in the zoo.cfg
file, we wrote dataDir=/usr/zookeeper/data
. This is actually a directory you’re going to have to create in the C drive. Simply put, this is the directory that ZooKeeper is going to look at to identify that instance of ZooKeeper. We’re going to write 1 in that file.
So go ahead and create that usr/zookeeper/data
directory, and then open up your favorite text editor.
Just type in 1, and save it as myid
, set the file type as All files
. This may not be insignificant, but we are going to not provide it any file extension, this is just for the convention.
Don’t worry about the version-2
directory from the picture. That is automatically generated once you start the instance of ZooKeeper server.
At this point, you should be done configuring ZooKeeper. Now close out of everything, click the Start button, and open up a command prompt.
3. Test an Instance of Running ZooKeeper Server
Type in the following command: zkServer.cmd
and hit enter. You should get some junk like this that don’t mean much to us.
Now open up another command prompt in a new window. Type in the following command: zkCli.cmd
and hit enter. Assuming you did everything correctly, you should get [zk: localhost:2181<CONNECTED> 0]
at the very last line. See picture below:
If you are getting the same result, then you setup ZooKeeper server correctly. Thanks for reading, and happy zookeeping!
Время на прочтение11 мин
Количество просмотров279K
Данная статья будет полезной тем, кто только начал знакомиться с микросервисной архитектурой и с сервисом Apache Kafka. Материал не претендует на подробный туториал, но поможет быстро начать работу с данной технологией. Я расскажу о том, как установить и настроить Kafka на Windows 10. Также мы создадим проект, используя Intellij IDEA и Spring Boot.
Зачем?
Трудности в понимании тех или иных инструментов часто связаны с тем, что разработчик никогда не сталкивался с ситуациями, в которых эти инструменты могут понадобиться. С Kafka всё обстоит точно также. Опишем ситуацию, в которой данная технология будет полезной. Если у вас монолитная архитектура приложения, то разумеется, никакая Kafka вам не нужна. Всё меняется с переходом на микросервисы. По сути, каждый микросервис – это отдельная программа, выполняющая ту или иную функцию, и которая может быть запущена независимо от других микросервисов. Микросервисы можно сравнить с сотрудниками в офисе, которые сидят за отдельными столами и независимо от коллег решают свою задачу. Работа такого распределённого коллектива немыслима без централизованной координации. Сотрудники должны иметь возможность обмениваться сообщениями и результатами своей работы между собой. Именно эту проблему и призвана решить Apache Kafka для микросервисов.
Apache Kafka является брокером сообщений. С его помощью микросервисы могут взаимодействовать друг с другом, посылая и получая важную информацию. Возникает вопрос, почему не использовать для этих целей обычный POST – reqest, в теле которого можно передать нужные данные и таким же образом получить ответ? У такого подхода есть ряд очевидных минусов. Например, продюсер (сервис, отправляющий сообщение) может отправить данные только в виде response’а в ответ на запрос консьюмера (сервиса, получающего данные). Допустим, консьюмер отправляет POST – запрос, и продюсер отвечает на него. В это время консьюмер по каким-то причинам не может принять полученный ответ. Что будет с данными? Они будут потеряны. Консьюмеру снова придётся отправлять запрос и надеяться, что данные, которые он хотел получить, за это время не изменились, и продюсер всё ещё готов принять request.
Apache Kafka решает эту и многие другие проблемы, возникающие при обмене сообщениями между микросервисами. Не лишним будет напомнить, что бесперебойный и удобный обмен данными – одна из ключевых проблем, которую необходимо решить для обеспечения устойчивой работы микросервисной архитектуры.
Установка и настройка ZooKeeper и Apache Kafka на Windows 10
Первое, что надо знать для начала работы — это то, что Apache Kafka работает поверх сервиса ZooKeeper. ZooKeeper — это распределенный сервис конфигурирования и синхронизации, и это всё, что нам нужно знать о нём в данном контексте. Мы должны скачать, настроить и запустить его перед тем, как начать работу с Kafka. Прежде чем начать работу с ZooKeeper, убедитесь, что у вас установлен и настроен JRE.
Скачать свежею версию ZooKeeper можно с официального сайта.
Извлекаем из скаченного архива ZooKeeper`а файлы в какую-нибудь папку на диске.
В папке zookeeper с номером версии, находим папку conf и в ней файл “zoo_sample.cfg”.
Копируем его и меняем название копии на “zoo.cfg”. Открываем файл-копию и находим в нём строчку dataDir=/tmp/zookeeper. Прописываем в данной строчке полный путь к нашей папке zookeeper-х.х.х. У меня это выглядит так: dataDir=C:\\ZooKeeper\\zookeeper-3.6.0
Теперь добавим системную переменную среды: ZOOKEEPER_HOME = C:\ ZooKeeper \zookeeper-3.4.9 и в конце системной переменной Path добавим запись: ;%ZOOKEEPER_HOME%\bin;
Запускаем командную строку и пишем команду:
zkserver
Если всё сделано правильно, вы увидите примерно следующее.
Это означает, что ZooKeeper стартанул нормально. Переходим непосредственно к установке и настройке сервера Apache Kafka. Скачиваем свежую версию с официального сайта и извлекаем содержимое архива: kafka.apache.org/downloads
В папке с Kafka находим папку config, в ней находим файл server.properties и открываем его.
Находим строку log.dirs= /tmp/kafka-logs и указываем в ней путь, куда Kafka будет сохранять логи: log.dirs=c:/kafka/kafka-logs.
В этой же папке редактируем файл zookeeper.properties. Строчку dataDir=/tmp/zookeeper меняем на dataDir=c:/kafka/zookeeper-data, не забывая при этом, после имени диска указывать путь к своей папке с Kafka. Если вы всё сделали правильно, можно запускать ZooKeeper и Kafka.
Для кого-то может оказаться неприятной неожиданностью, что никакого GUI для управления Kafka нет. Возможно, это потому, что сервис рассчитан на суровых нёрдов, работающих исключительно с консолью. Так или иначе, для запуска кафки нам потребуется командная строка.
Сначала надо запустить ZooKeeper. В папке с кафкой находим папку bin/windows, в ней находим файл для запуска сервиса zookeeper-server-start.bat, кликаем по нему. Ничего не происходит? Так и должно быть. Открываем в этой папке консоль и пишем:
start zookeeper-server-start.bat
Опять не работает? Это норма. Всё потому что zookeeper-server-start.bat для своей работы требует параметры, прописанные в файле zookeeper.properties, который, как мы помним, лежит в папке config. Пишем в консоль:
start zookeeper-server-start.bat c:\kafka\config\zookeeper.properties
Теперь всё должно стартануть нормально.
Ещё раз открываем консоль в этой папке (ZooKeeper не закрывать!) и запускаем kafka:
start kafka-server-start.bat c:\kafka\config\server.properties
Для того, чтобы не писать каждый раз команды в командной строке, можно воспользоваться старым проверенным способом и создать батник со следующим содержимым:
start C:\kafka\bin\windows\zookeeper-server-start.bat C:\kafka\config\zookeeper.properties
timeout 10
start C:\kafka\bin\windows\kafka-server-start.bat C:\kafka\config\server.properties
Строка timeout 10 нужна для того, чтобы задать паузу между запуском zookeeper и kafka. Если вы всё сделали правильно, при клике на батник должны открыться две консоли с запущенным zookeeper и kafka.Теперь мы можем прямо из командной строки создать продюсера сообщений и консьюмера с нужными параметрами. Но, на практике это может понадобиться разве что для тестирования сервиса. Гораздо больше нас будет интересовать, как работать с kafka из IDEA.
Работа с kafka из IDEA
Мы напишем максимально простое приложение, которое одновременно будет и продюсером и консьюмером сообщения, а затем добавим в него полезные фичи. Создадим новый спринг-проект. Удобнее всего делать это с помощью спринг-инициалайзера. Добавляем зависимости org.springframework.kafka и spring-boot-starter-web
В итоге файл pom.xml должен выглядеть так:
Для того, чтобы отправлять сообщения, нам потребуется объект KafkaTemplate<K, V>. Как мы видим объект является типизированным. Первый параметр – это тип ключа, второй – самого сообщения. Пока оба параметра мы укажем как String. Объект будем создавать в классе-рестконтроллере. Объявим KafkaTemplate и попросим Spring инициализировать его, поставив аннотацию Autowired.
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
В принципе, наш продюсер готов. Всё что осталось сделать – это вызвать у него метод send(). Имеется несколько перегруженных вариантов данного метода. Мы используем в нашем проекте вариант с 3 параметрами — send(String topic, K key, V data). Так как KafkaTemplate типизирован String-ом, то ключ и данные в методе send будут являться строкой. Первым параметром указывается топик, то есть тема, в которую будут отправляться сообщения, и на которую могут подписываться консьюмеры, чтобы их получать. Если топик, указанный в методе send не существует, он будет создан автоматически. Полный текст класса выглядит так.
@RestController
@RequestMapping("msg")
public class MsgController {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@PostMapping
public void sendOrder(String msgId, String msg){
kafkaTemplate.send("msg", msgId, msg);
}
}
Контроллер мапится на localhost:8080/msg, в теле запроса передаётся ключ и само сообщений.
Отправитель сообщений готов, теперь создадим слушателя. Spring так же позволяет cделать это без особых усилий. Достаточно создать метод и пометить его аннотацией @KafkaListener, в параметрах которой можно указать только топик, который будет слушаться. В нашем случае это выглядит так.
@KafkaListener(topics="msg")
У самого метода, помеченного аннотацией, можно указать один принимаемый параметр, имеющий тип сообщения, передаваемого продюсером.
Класс, в котором будет создаваться консьюмер необходимо пометить аннотацией @EnableKafka.
@EnableKafka
@SpringBootApplication
public class SimpleKafkaExampleApplication {
@KafkaListener(topics="msg")
public void msgListener(String msg){
System.out.println(msg);
}
public static void main(String[] args) {
SpringApplication.run(SimpleKafkaExampleApplication.class, args);
}
}
Так же в файле настроек application.property необходимо указать параметр консьюмера groupe-id. Если этого не сделать, приложение не запустится. Параметр имеет тип String и может быть любым.
spring.kafka.consumer.group-id=app.1
Наш простейший кафка-проект готов. У нас есть отправитель и получатель сообщений. Осталось только запустить. Для начала запускаем ZooKeeper и Kafka с помощью батника, который мы написали ранее, затем запускаем наше приложение. Отправлять запрос удобнее всего с помощью Postman. В теле запроса не забываем указывать параметры msgId и msg.
Если мы видим в IDEA такую картину, значит всё работает: продюсер отправил сообщение, консьюмер получил его и вывел в консоль.
Усложняем проект
Реальные проекты с использованием Kafka конечно же сложнее, чем тот, который мы создали. Теперь, когда мы разобрались с базовыми функциями сервиса, рассмотрим, какие дополнительные возможности он предоставляет. Для начала усовершенствуем продюсера.
Если вы открывали метод send(), то могли заметить, что у всех его вариантов есть возвращаемое значение ListenableFuture<SendResult<K, V>>. Сейчас мы не будем подробно рассматривать возможности данного интерфейса. Здесь будет достаточно сказать, что он нужен для просмотра результата отправки сообщения.
@PostMapping
public void sendMsg(String msgId, String msg){
ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send("msg", msgId, msg);
future.addCallback(System.out::println, System.err::println);
kafkaTemplate.flush();
}
Метод addCallback() принимает два параметра – SuccessCallback и FailureCallback. Оба они являются функциональными интерфейсами. Из названия можно понять, что метод первого будет вызван в результате успешной отправки сообщения, второго – в результате ошибки.Теперь, если мы запустим проект, то увидим на консоли примерно следующее:
SendResult [producerRecord=ProducerRecord(topic=msg, partition=null, headers=RecordHeaders(headers = [], isReadOnly = true), key=1, value=Hello, world!, timestamp=null), recordMetadata=msg-0@6]
Посмотрим ещё раз внимательно на нашего продюсера. Интересно, что будет если в качестве ключа будет не String, а, допустим, Long, а в качестве передаваемого сообщения и того хуже – какая-нибудь сложная DTO? Попробуем для начала изменить ключ на числовое значение…
Если мы укажем в продюсере в качестве ключа Long, то приложение нормально запуститься, но при попытке отправить сообщение будет выброшен ClassCastException и будет сообщено, что класс Long не может быть приведён к классу String.
Если мы попробуем вручную создать объект KafkaTemplate, то увидим, что в конструктор в качестве параметра передаётся объект интерфейса ProducerFactory<K, V>, например DefaultKafkaProducerFactory<>. Для того, чтобы создать DefaultKafkaProducerFactory, нам нужно в его конструктор передать Map, содержащий настройки продюсера. Весь код по конфигурации и созданию продюсера вынесем в отдельный класс. Для этого создадим пакет config и в нём класс KafkaProducerConfig.
@Configuration
public class KafkaProducerConfig {
private String kafkaServer="localhost:9092";
@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
kafkaServer);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
LongSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
StringSerializer.class);
return props;
}
@Bean
public ProducerFactory<Long, String> producerFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigs());
}
@Bean
public KafkaTemplate<Long, String> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}
}
В методе producerConfigs() создаём мапу с конфигурациями и в качестве сериализатора для ключа указываем LongSerializer.class. Запускаем, отправляем запрос из Postman и видим, что теперь всё работает, как надо: продюсер отправляет сообщение, а консьюмер принимает его.
Теперь изменим тип передаваемого значения. Что если у нас не стандартный класс из библиотеки Java, а какой-нибудь кастомный DTO. Допустим такой.
@Data
public class UserDto {
private Long age;
private String name;
private Address address;
}
@Data
@AllArgsConstructor
public class Address {
private String country;
private String city;
private String street;
private Long homeNumber;
private Long flatNumber;
}
Для отправки DTO в качестве сообщения, нужно внести некоторые изменения в конфигурацию продюсера. В качестве сериализатора значения сообщения укажем JsonSerializer.class и не забудем везде изменить тип String на UserDto.
@Configuration
public class KafkaProducerConfig {
private String kafkaServer="localhost:9092";
@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
kafkaServer);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
LongSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
JsonSerializer.class);
return props;
}
@Bean
public ProducerFactory<Long, UserDto> producerFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigs());
}
@Bean
public KafkaTemplate<Long, UserDto> kafkaTemplate() {
return new KafkaTemplate<>(producerFactory());
}
}
Отправим сообщение. В консоль будет выведена следующая строка:
Теперь займёмся усложнением консьюмера. До этого наш метод public void msgListener(String msg), помеченный аннотацией @KafkaListener(topics=«msg») в качестве параметра принимал String и выводил его на консоль. Как быть, если мы хотим получить другие параметры передаваемого сообщения, например, ключ или партицию? В этом случае тип передаваемого значения необходимо изменить.
@KafkaListener(topics="msg")
public void orderListener(ConsumerRecord<Long, UserDto> record){
System.out.println(record.partition());
System.out.println(record.key());
System.out.println(record.value());
}
Из объекта ConsumerRecord мы можем получить все интересующие нас параметры.
Мы видим, что вместо ключа на консоль выводятся какие-то кракозябры. Это потому, что для десериализации ключа по умолчанию используется StringDeserializer, и если мы хотим, чтобы ключ в целочисленном формате корректно отображался, мы должны изменить его на LongDeserializer. Для настройки консьюмера в пакете config создадим класс KafkaConsumerConfig.
@Configuration
public class KafkaConsumerConfig {
@Value("${spring.kafka.bootstrap-servers}")
private String kafkaServer;
@Value("${spring.kafka.consumer.group-id}")
private String kafkaGroupId;
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaServer);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.GROUP_ID_CONFIG, kafkaGroupId);
return props;
}
@Bean
public KafkaListenerContainerFactory<?> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<Long, UserDto> factory =
new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}
@Bean
public ConsumerFactory<Long, UserDto> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}
}
Класс KafkaConsumerConfig очень похож на KafkaProducerConfig, который мы создавали ранее. Здесь так же присутствует Map, содержащий необходимые конфигурации, например, такие как десериализатор для ключа и значения. Созданная мапа используется при создании ConsumerFactory<>, которая в свою очередь, нужна для создания KafkaListenerContainerFactory<?>. Важная деталь: метод возвращающий KafkaListenerContainerFactory<?> должен называться kafkaListenerContainerFactory(), иначе Spring не сможет найти нужного бина и проект не скомпилируется. Запускаем.
Видим, что теперь ключ отображается как надо, а это значит, что всё работает. Конечно, возможности Apache Kafka далеко выходят за пределы тех, что описаны в данной статье, однако, надеюсь, прочитав её, вы составите представление о данном сервисе и, самое главное, сможете начать работу с ним.
Мойте руки чаще, носите маски, не выходите без необходимости на улицу, и будьте здоровы.
Запустить Apache Kafka и ZooKeeper на Windows 10 проще, чем кажется! Перед вами подробная инструкция без Docker и облаков: установка, настройка, создание тестового топика и обработка первых сообщений.
Apache Kafka — это распределённая система для стриминга данных, разработанная специально для обработки больших объёмов сообщений в реальном времени. Эта платформа используется повсеместно — от логирования и мониторинга до построения полноценных event-driven систем и микросервисной архитектуры. Она позволяет передавать сообщения между продюсерами (отправителями) и консьюмерами (получателями) через надёжную очередь, называемую топиком.
Однако Kafka не работает в одиночку. До версии 2.8 для управления кластером и хранения метаданных ей необходим компонент под названием ZooKeeper. ZooKeeper выполняет функции координатора: отслеживает состояние брокеров Kafka (серверов, обрабатывающих и хранящих сообщения), управляет выборами контроллера и помогает поддерживать целостность данных. Начиная с версии 2.8 Kafka поддерживает режим без ZooKeeper (KRaft mode). Однако в этом гайде используется классическая схема с ZooKeeper.
В продакшене Kafka обычно разворачивают двумя способами. Первый — в облаке или в виде кластера на VPS или собственных Linux-серверах, управляют всей инфраструктурой при этом самостоятельно. И второй — бессерверный Kafka, управляемый сторонними поставщиками услуг. Но для обучения, тестирования и небольших задач вполне подойдёт и локальная установка на Windows. В этой статье мы разберём последний способ и пошагово пройдём через весь процесс: от подготовки системы до запуска Kafka и отправки первого сообщения.
Аренда VPS/VDS виртуального сервера от AdminVPS — это прозрачная и честная услуга с доступной ценой
Подготовка системы
Прежде чем приступать к установке, проверим, готова ли система. Обе платформы написаны на Java, поэтому для их работы требуется установленная Java Virtual Machine (JVM) и библиотеки. Также желательно иметь консольные утилиты, такие как curl, и текстовый редактор — например, Notepad++ или VS Code — для работы с конфигурационными файлами.
Установка Java
Kafka требует Java 8 или выше. Мы рекомендуем OpenJDK 17 или 21 как стабильные и совместимые версии.
Скачайте OpenJDK. Перейдите на официальный сайт Adoptium и скачайте Temurin 17 (это сборка OpenJDK). Выберите установочный .msi-файл для Windows 10.
Установите Java. Запустите установщик и следуйте инструкциям. Убедитесь, что вы отметили галочку «Set JAVA_HOME variable», если такая опция есть.
После установки Java убедитесь, что переменная окружения JAVA_HOME настроена, а в Path добавлен путь к её bin. Пример:
JAVA_HOME=C:\Program Files\Adoptium\jdk-17
Path=…;%JAVA_HOME%\bin
Проверьте установку. Откройте терминал PowerShell или CMD и выполните команду:
java -version
Ожидаемый вывод:
openjdk version "17.0.x"
Если команда не распознаётся, проверьте значение JAVA_HOME и Path.
Создание рабочих директорий
При раздельной установке выделите отдельные папки для ZooKeeper и Kafka. Продумайте структуру, в нашем примере оба каталога будут находиться в корне диска C. В этих директориях мы разместим и скачанные архивы, и конфигурационные файлы.
Папки нужно создавать как можно ближе к корню — чтобы избежать ошибок при запуске.
Установка 7-Zip
Продукты Apache распространяются в .tgz-архивах. Чтобы их распаковать, установите 7-Zip или любую другую win-утилиту, поддерживающую .tar.gz.
Теперь, когда подготовка завершена, приступим к установке и настройке ZooKeeper. Если вы устанавливаете обе платформы раздельно, то он потребуется первым, так как Kafka ставится поверх него.
ZooKeeper нужен для хранения метаданных, отслеживания брокеров и координации кластера. В этом разделе мы установим его и настроим базовую конфигурацию.
Скачайте ZooKeeper. Перейдите на официальный сайт ZooKeeper в раздел «Download» и скачайте последнюю стабильную версию (на момент написания статьи это 3.8.4) в архиве .tar.gz.
Переместите архив в C:\zookeeper\. Распакуйте его в 7-Zip или аналогичной программе. После распаковки ZooKeeper будет находиться в папке с номером версии:
C:\zookeeper\zookeeper-3.8.4\
Следующий шаг — создание конфигурации. ZooKeeper может работать в двух режимах: Standalone и Replicated. Мы рассмотрим Standalone Mode. В этом режиме ZooKeeper использует конфигурационный файл zoo.cfg, который нужно создать вручную. Перейдите в директорию conf:
C:\zookeeper\zookeeper-3.8.4\conf\
Там находится пример — файл zoo_sample.cfg. Скопируйте его и переименуйте копию в zoo.cfg, затем откройте для редактирования. В нём нужно указать путь к директории с данными. По умолчанию указано:
dataDir=/tmp/zookeeper
Поменяем значение на актуальное:
tickTime=2000
dataDir=C:/zookeeper/zookeeper-3.8.4/data
clientPort=2181
maxClientCnxns=60
Не забудьте создать соответствующий каталог.
После этого добавим переменную среды окружения:
ZOOKEEPER_HOME=C:\zookeeper\zookeeper-3.8.4
И в конец системной переменной Path добавьте:
%ZOOKEEPER_HOME%\bin
Обратите внимание
В Windows не требуется ставить точку с запятой вручную, если редактировать переменные через GUI — система сама добавит разделитель. Указание «;%ZOOKEEPER_HOME%\bin;» допустимо только при редактировании переменной вручную через set.
Готово! Теперь переходим к запуску.
ZooKeeper запускается через скрипт zkServer.cmd. Откройте терминал PowerShell:
cd C:\zookeeper\zookeeper-3.8.4\bin
.\zkServer.cmd
По умолчанию ZooKeeper запускается на порту 2181. Этот порт можно изменить в конфигурационном файле zoo.cfg.
Установка Kafka и ZooKeeper одним пакетом
Kafka поставляется с базовой конфигурацией ZooKeeper и утилитами запуска, но не содержит полноценной самостоятельной сборки ZooKeeper. Для надёжной работы рекомендуется установить ZooKeeper отдельно. Скачайте архив с бинарными файлами с сайта проекта, у нас это kafka_2.13-4.0.0.tgz. Найдите его, и распакуйте с помощью архиватора, поддерживающего .tgz (например, 7-Zip). После распаковки у вас будет папка с номером версии в имени. Для удобства можно переименовать её, например, в Kafka.
Обратите внимание
Убедитесь, что версия Scala (2.13) совместима с установленной версией Kafka. Не всегда новые Kafka-сборки поддерживают все старые версии Scala.
Структура каталогов
Откройте проводник и перейдите в папку Kafka. Структура дерева каталогов
должна быть примерно такой:
C:\
└── kafka\
├── bin\
│ └── windows\
├── config\
└── ...
Здесь:
- bin — исполняемые скрипты для управления кластером. В подкаталоге /windows расположены файлы, адаптированные для работы под ОС Windows.
- config — хранит конфигурационные файлы (например, zookeeper.properties, server.properties), позволяющие кастомизировать настройки брокера и ZooKeeper.
- libs — включает библиотеки зависимостей (JAR-файлы), необходимые для работы Kafka.
- logs — директория с журналами событий. Логи помогают анализировать работу системы, диагностировать ошибки и отслеживать взаимодействие компонентов.
- site-docs — официальная документация по текущей версии Kafka — полезный ресурс для изучения функционала.
- LICENSE и NOTICE — текстовые файлы с информацией о лицензионных условиях и юридическими уведомлениями.
Настройка ZooKeeper
Модуль ZooKeeper находится в папке bin\windows, его конфигурационный файл — по пути config\zookeeper.properties. Он уже содержит рабочие настройки по умолчанию, но для понимания стоит знать основные параметры:
dataDir=C:/kafka/zookeeper-data
clientPort=2181
maxClientCnxns=0
Где:
- dataDir — путь, где ZooKeeper будет хранить свои данные. Его нужно изменить на win-совместимый. Windows не имеет каталога /tmp. Путь по умолчанию здесь — свидетельство того, что Kafka изначально создавался для Linux.
- clientPort — порт, на котором ZooKeeper принимает подключения. По умолчанию — 2181.
Изменим dataDir на Windows-путь.
Откройте в любом текстовом редакторе файл:
config\zookeeper.properties
Замените строку:
dataDir=/tmp/zookeeper
на
dataDir=C:/kafka/zookeeper-data
Создайте папку zookeeper-data внутри каталога Kafka, если она ещё не существует, затем дайте пользователю права на запись:
icacls "C:\kafka\zookeeper-data" /grant "*Users":(OI)(CI)F
Запуск ZooKeeper
В PowerShell или командной строке зайдите в корневую папку Kafka и выполните:
.\bin\windows\zookeeper-server-start.bat .\config\zookeeper.properties
Если всё настроено верно, вы увидите лог со строкой:
INFO binding to port 0.0.0.0/0.0.0.0:2181
Настройка и запуск Kafka
После запуска ZooKeeper можно переходить к Kafka.
Конфигурация Kafka
Конфиги Kafka находятся по пути:
config\server.properties
Откройте этот файл для редактирования и найдите следующие параметры:
broker.id=0
log.dirs=C:/kafka/kafka-logs
zookeeper.connect=localhost:2181
Внесём изменения для Windows. В строке log.dirs по умолчанию указан путь в стиле Linux (/tmp/kafka-logs), который не существует в Windows. Замените его, например, на:
log.dirs=C:/kafka/kafka-logs
Убедитесь, что zookeeper.connect указывает на localhost и порт 2181 (если вы не меняли его ранее):
zookeeper.connect=localhost:2181
Создайте папку kafka-logs в каталоге Kafka, чтобы избежать ошибок при запуске и предоставьте права на запись:
icacls "C:\kafka\kafka-logs" /grant "*Users":(OI)(CI)F
Запуск Kafka-сервера
Теперь, когда всё настроено, можно запускать Kafka. Откройте второе окно PowerShell или командной строки и войдите в каталог Kafka, например:
cd C:\kafka
Затем запустите Kafka:
.\bin\windows\kafka-server-start.bat ".\config\server.properties"
Если всё работает правильно, вы увидите в выводе сообщение, означающее, что Kafka успешно запущен и готов к работе:
INFO [KafkaServer id=0] started (kafka.server.KafkaServer)
Проверка работы Kafka
После запуска Kafka можно проверить, как она работает, создав топик, отправив в него сообщение и считав его обратно. Для этого используем встроенные утилиты командной строки, входящие в состав Kafka.
Создание топика
Откройте ещё одно окно PowerShell (Kafka и ZooKeeper уже работают в своих окнах) и перейдите в папку Kafka:
cd C:\kafka
Выполните для создания нового топика:
.\bin\windows\kafka-topics.bat --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
Если всё прошло успешно, вы увидите сообщение:
Created topic test-topic
Проверить список доступных топиков можно так:
.\bin\windows\kafka-topics.bat --list --bootstrap-server localhost:9092
Отправка сообщения
Теперь отправим сообщение в созданный топик. Для этого используется Kafka Producer. Запустите в том же окне (третьем):
.\bin\windows\kafka-console-producer.bat --bootstrap-server localhost:9092 --topic test-topic
После запуска вы не увидите приглашения командной строки — это нормально. Просто введите сообщение и нажмите Enter, чтобы отправить его в топик.
Если вы работаете с нестандартными типами данных (например, JSON или Avro), Kafka может потребовать указания сериализаторов. В этом случае при запуске Producer добавьте параметры:
--producer-property key.serializer=org.apache.kafka.common.serialization.StringSerializer ^
--producer-property value.serializer=org.apache.kafka.common.serialization.StringSerializer
Для строковых сообщений эти параметры не обязательны — Kafka использует их по умолчанию.
Чтение сообщений из топика
Откройте ещё одно окно PowerShell (да, у вас теперь уже 4 окна) и запустите Kafka Consumer:
cd C:\kafka
.\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test-topic --from-beginning
Если обработка сообщений проходит успешно — и Producer, и Consumer работают корректно, — то вы должны увидеть отправленное сообщение.
Завершение работы Kafka и ZooKeeper
После тестирования или использования Kafka важно корректно завершить работу сервисов, чтобы избежать повреждения логов или потери информации.
Остановка Kafka
Найдите окно PowerShell, где запущен Kafka-сервер. Просто нажмите Ctrl+C — это отправит сигнал остановки, и Kafka завершит работу.
Пример вывода:
[KafkaServer id=0] shutting down
[KafkaServer id=0] shut down completed
Если Kafka не реагирует на Ctrl+C, можно закрыть окно PowerShell, но это менее предпочтительный способ.
Остановка ZooKeeper
Перейдите в окно, где запущен ZooKeeper, и также нажмите Ctrl+C. Вы увидите строки, подтверждающие завершение:
Shutting down…
Closed socket...
Очистка временных данных (по желанию)
Kafka и ZooKeeper хранят временные данные в папках:
- C:\kafka\kafka-logs — логи Kafka;
- C:\kafka\zookeeper-data — данные ZooKeeper (если вы указывали эту папку при запуске).
Их можно удалить перед следующим чистым запуском Kafka, если вы экспериментировали с настройками и нужно сбросить состояние. В PowerShell:
Remove-Item -Recurse -Force C:\kafka\kafka-logs
Remove-Item -Recurse -Force C:\kafka\zookeeper-data
Будьте осторожны: это удалит все сообщения, топики и внутреннее состояние кластера. Используйте эти команды, только если уверены в своих действиях.
Заключение
Мы рассмотрели, как установить и запустить ZooKeeper и Kafka на Windows 10. Несмотря на то что Kafka изначально разрабатывалась с прицелом на Linux, её вполне можно использовать и в среде Windows — особенно для целей разработки, обучения или тестирования.
В ходе статьи мы:
- установили Java и проверили её работоспособность;
- скачали и распаковали Kafka;
- запустили ZooKeeper и Kafka как отдельные процессы;
- создали и протестировали простой топик, отправив и получив сообщения;
- корректно завершили работу сервисов.
Читайте в блоге:
- Какие серверные SSD-накопители с интерфейсом NVMe лучше
- Как включить и настроить удалённый доступ к серверу
- Как выбрать виртуальный сервер для сложных задач: гайд по GPU-решениям
How To Set Up Apache Kafka on Window 10
By Chunren Lai, Dec. 12, 2020
This article lists steps to install and run Apache Kafka on Windows 10.
Table of Contents
Step 1. Introduction
Step 2. Download Files
Step 3. Install the 7zip and Notepad++
Step 4. Install the Java Runtime
Step 5. Install ZooKeeper
Step 6. Install and Set up Kafka
Step 7. Test Apache Kafka
Step 1. Introduction
To run Apache Kafka on a windows OS, you will need to download , install, and set up Java, ZooKeeper, and Apache Kakfa. After set up the Apache Kafka, we will run some commands to produce and consume some messages on a test topics on Kafka to ensure Apache Kafka is running properly.
Step 2. Download Files
-
Upzip and Text Editor tools
- If you don’t have 7-zip installed on your windows, you are recommended to download the 7-zip from (https://www.7-zip.org/download.html). If your system is 64-bit x64, you can download the exe installer from (https://www.7-zip.org/a/7z1900-x64.exe)
- You are also recommended to download the text editor Notepad++ from (https://notepad-plus-plus.org/downloads/)
-
JRE download
- You can download the Java runtime from Oracle site ( http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html) based on your CPU architecture.
-
ZooKeeper download
- You can download the ZooKeepr from Apache site ( http://zookeeper.apache.org/releases.html)
-
Kafka download
- You can download the Apache Kafka from Apache site ( http://kafka.apache.org/downloads.html)
The following is a list of my downloads.
Step 3. Install the 7zip and Notepad plus plus
You can directly run the executable installer (e.g., «7z1900-x64.exe» and «npp.7.8.8.Installer.x64.exe»)
Step 4. Install the Java Runtime
You can run the JRE installer (e.g., «jre-8u271-windows-x64.exe»), and install the Java in its default installation folder (e.g., «C:\Program Files\Java\jre1.8.0_271»).
After the installation, you need to set up:
- Environment variable for JAVA_HOME
Open the «Control Panel» -> «System» -> «Advanced system settings» -> «Environment Variables» -> «System variables» («New»):
Item | Value |
---|---|
Variable name | JAVA_HOME |
Variable value | Java installation folder (e.g., «C:\Program Files\Java\jre1.8.0_271») |
- Add Java path to the «Path» variable
Select «Path» of the «System variable» section, and the click «Edit…» button to add the java path. In the «Edit environment variable» pop up window, click the «New» button, and add:
Step 5. Install ZooKeeper
dataDir=C:/zookeeper-3.6.2/data
- Similar to the above Java installation,
- to add a variable of «ZOOKEEPER_HOME» to the System Variables:
Item | Value |
---|---|
Variable name | ZOOKEEPER_HOME |
Variable value | C:\zookeeper-3.6.2 |
- to add «%ZOOKEEPER_HOME%\bin» new entry to the System Variable «Path»
- Start the ZooKeeper, by
- type «cmd» in the Search area (bottom left side)
- in the commond line, type
cd c:\zookeeper-3.6.2\bin
- type «zkserver», and you will see:
Step 6. Install and Set up Kafka
log.dirs=c:/kafka/kafka-logs
- If you plan to run Kafka on your loacal machine with other default settings, you are ready to go, otherwise you can change the following default setting:
zookeeper.connect=localhost:2181 with a proper IP address and a custom port number. - Open a new command prompt, and:
- type:
cd c:\kafka, and press enter
- then press «Enter», and type:
.\bin\windows\kafka-server-start.bat .\config\server.properties
, and press enter, you will see:
3) Now you finish installing and setting up Apache Kafka, and the Kafka server is up running.
Step 7. Test Apache Kafka
-
Create a topic called «StudentImport»
- Open a new command prompt, and type: cd c:\kafka\bin\windows, press enter
- type:
kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic StudentImport
- Now the «StudentImport» has been successfully created. See below:
-
Create a Producer to the Kafka server
- Open a new command prompt (called producer command window «P»), and type: cd c:\kafka\bin\windows, press enter
- type:
kafka-console-producer.bat --broker-list localhost:9092 --topic StudentImport
- Now it is ready for you to enter any message in the Producer console. See below:
-
Create a Consumer to the Kafka server
- Open a new command prompt (called consumer command window «C»), and type: cd c:\kafka\bin\windows, press enter
- type:
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic StudentImport
- Now it is listening any messages in the Producer console.
-
Testing message communications
- In the producer command window «P» (see above), when you type: «Hello, it is Chunren», and press enter, then in the consumer command window «C» (see above), you will see the message «Hello, It is Chunren» being displayed.
- In the producer command window «P», when you type: «We are going to import student rosters soon.», and press enter, then in the consumer command window «C», uou will see the message «We are going to import student rosters soon.» being displayed.
- See below the results:
In the producer command window «P»:In the consumer command window «C»:
Congratulations! You have successfully set up Apache Kafka on your Windows 10.
How to Install ZooKeeper on Windows 11
Apache ZooKeeper is a distributed coordination service that is commonly used in distributed systems. In this tutorial, we will guide you through the process of installing ZooKeeper on Windows 11.
Prerequisites
Before installing Apache ZooKeeper, make sure you have the following prerequisites installed on your Windows 11 machine:
- Java Development Kit (JDK)
- Administrator access
Step 1: Downloading ZooKeeper
- Navigate to the ZooKeeper download page.
- Select the version you want to download. We recommend choosing the latest stable version.
- Click on the link to download the binary release.
Step 2: Extracting ZooKeeper
- Once the download is complete, extract the contents of the .tar.gz file to your desired directory.
- Rename the extracted directory to
zookeeper
.
Step 3: Configuring ZooKeeper
- Navigate to the
zookeeper/conf
directory. - Rename the
zoo_sample.cfg
file tozoo.cfg
. - Open the
zoo.cfg
file using a text editor. - Configure the
dataDir
parameter to point to a directory where ZooKeeper will store its data. For example:C:/zookeeper/data
. - Save and close the
zoo.cfg
file.
Step 4: Starting ZooKeeper
-
Open a Command Prompt window with administrator privileges.
-
Navigate to the
zookeeper/bin
directory. -
Run the following command to start ZooKeeper:
.\zkServer.cmd
-
ZooKeeper should now be running. Keep the Command Prompt window open.
Step 5: Testing ZooKeeper
-
Open another Command Prompt window with administrator privileges.
-
Navigate to the
zookeeper/bin
directory. -
Run the following command to connect to ZooKeeper:
.\zkCli.cmd
-
You should now see the ZooKeeper prompt. Type
help
to see a list of available commands. -
To test if ZooKeeper is functioning correctly, run the following command:
create /test test
-
If successful, you should see the message
Created /test
. -
Type
exit
to exit the ZooKeeper prompt.
Congratulations, you have successfully installed Apache ZooKeeper on your Windows 11 machine!
If you want to self-host in an easy, hands free way, need an external IP address, or simply want your data in your own hands, give IPv6.rs a try!
Alternatively, for the best virtual desktop, try Shells!