如何为Kafka设置Java选项?

52
我一直在尝试使用Kafka,并从主网站的文档中了解到可以设置不同的jvm选项,如堆大小和垃圾收集器:

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

然而,它并没有说明如何/在哪里设置这些选项。应用程序带有一个/config目录,其中包含许多用于配置的文件,但没有Java文件。它还带有/binc目录,其中包含一堆用于Kafka的脚本,但同样没有真正指示如何配置Java。

所以我的问题是,我如何配置Kafka使用的Java选项?是通过文件完成还是有其他方法?

6个回答

78

强烈不建议修改 bin 目录中的脚本。当升级 Kafka 到下一个版本时,提取新的二进制文件将覆盖在脚本中所做的更改。

首选的方式应该是在脚本外部设置环境变量 KAFKA_HEAP_OPTS

export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"

如果在启动 Kafka 之前设置了这个变量,它将使用该变量而不是在 /bin/kafka-server-start.sh 中定义的默认值。


我同意这个观点。我认为当我提出这个问题时,我找不到任何一篇文档来解释如何修改默认值,这就是为什么当时只能通过修改启动脚本来实现的原因。但现在看来并非如此,因为这可以在脚本之外设置。感谢您指出这一点。 - Luis Medina
你如何为Kafka Connect做同样的事情呢? - eddyP23
4
我视力有点差。进一步挖掘后,你会发现connect-distributed使用了kafka-run-class,而该程序正好也使用了相同的KAFKA_HEAP_OPTS变量。我将此留在这里,供像我这样视力不好的其他人参考。 - eddyP23
我正在运行Confluent 5.0.0,默认值设置为“-Xmx1G -Xms1G” 如果 [ "x$KAFKA_HEAP_OPTS" = "x" ]; then     export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G" fi - Vezir

18

另一种方法是修改 /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"

谢谢!这就是我最终做的。 - Luis Medina

12

查看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

1
你可以通过_sudo KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"运行它 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_ - mfedko
我喜欢人们展示变量在哪里被使用。这样,如果有一天他们更改了这个变量的名称,我就有一个可以查看的地方。谢谢。 - WesternGun

5
您可以通过以下方式在服务定义中设置这些参数。
[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

3

要添加通用的JVM设置(例如用户时区),您可以使用KAFKA_OPTS环境变量从kafka-run-class.sh

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

-2

你可以从命令行传递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");

然后将它们提供给producerConfig

ProducerConfig config = new ProducerConfig(props);

对于属性文件,它本身会是什么样子?在启动服务器时又该如何使用呢?而对于代码选项,这段代码应该放在哪里呢?以上所有问题都是基于我正在使用kafka-server-start.sh脚本来启动Kafka的前提下。 - Luis Medina
@massivedynamic http://www.programcreek.com/java-api-examples/index.php?api=kafka.producer.ProducerConfig - sol4me
ProducerConfig 不是问题所询问的内容。 - OneCricketeer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接