Как настроить параметры 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);