Как настроить параметры Java для Kafka?

Я экспериментировал с Kafka и увидел из документации на основном сайте, что вы можете установить различные параметры для jvm, такие как размер кучи и сборщик мусора, который он использует:

http://kafka.apache.org/documentation.html

Однако он не говорит о том, как / где установить эти параметры. Приложение поставляется с каталогом /config, содержащим множество файлов, используемых для настройки, но ни один из них не предназначен для Java. Он также поставляется с каталогом / bin, содержащим кучу сценариев для Kafka, но опять же ничего не указывает на то, как настроить Java.

Итак, мой вопрос, как мне настроить параметры Java, которые использует Kafka? Это делается через файл или есть другой способ?

4 ответа

Решение

Я не согласен с принятым ответом. Изменение сценария в bin каталог крайне не рекомендуется. При обновлении Kafka до следующей версии извлечение новых двоичных файлов переопределит изменения, внесенные в скрипт.

Предпочтительным способом должна быть установка переменной среды KAFKA_HEAP_OPTS вне сценария.

export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"

Если переменная установлена ​​до запуска Kafka через скрипт, она будет использовать переменную вместо значений по умолчанию, определенных в /bin/kafka-server-start.sh

Еще один способ сделать это, изменив информацию, написанную в /bin/kafka-server-start.sh:

export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"

или в /bin/kafka-run-class.sh:

KAFKA_JVM_PERFORMANCE_OPTS="-server -XX:+UseCompressedOops -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+DisableExplicitGC -Djava.awt.headless=true"

Глядя на kafka-run-classh.sh - kafka использует следующие переменные:

  • $ KAFKA_HEAP_OPTS
  • $ KAFKA_JVM_PERFORMANCE_OPTS
  • $ KAFKA_GC_LOG_OPTS
  • $ KAFKA_JMX_OPTS
  • $ KAFKA_LOG4J_OPTS

Вы можете запустить его через:

export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G" 
export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12346 -Dcom.sun.management.jmxremote.rmi.port=12346 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false" 
bin/kafka-server-start.sh -daemon config/server.properties

Вы также можете установить эти параметры через определение вашей службы, как показано ниже.

[Unit]
Requires=zookeeper.service
After=zookeeper.service

[Service]
Type=simple
User=kafka
ExecStart=/bin/sh -c '/home/kafka/kafka/bin/kafka-server-start.sh /home/kafka/kafka/config/server.properties > /home/kafka/kafka.log 2>&1'
ExecStop=/home/kafka/kafka/bin/kafka-server-stop.sh
Restart=on-abnormal
Environment="KAFKA_HEAP_OPTS=-Xmx4G"
Environment="KAFKA_JMX_OPTS=-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.net.preferIPv4Stack=true"
Environment="JMX_PORT=9999"

[Install]
WantedBy=multi-user.target

Чтобы добавить общие настройки JVM (например, часовой пояс пользователя), вы можете использовать KAFKA_OPTS переменная среды из kafka-run-class.sh:

# Generic jvm settings you want to add
if [ -z "$KAFKA_OPTS" ]; then
  KAFKA_OPTS=""
fi

Вы можете передать параметры Java из командной строки. Например

java -server -Xms3072m -Xmx3072m -XX:NewSize=256m -XX:MaxNewSize=256m  -classpath <long list of jars> foo.class

Для конфигурации производственного сервера вы можете создать файл свойств или установить их в коде, создав

 Properties props = new Properties();
 props.put("serializer.class", "kafka.serializer.StringEncoder");

А затем поставьте их на производителя Config

ProducerConfig config = new ProducerConfig(props);
Другие вопросы по тегам