启用JMX后ksql-test-runner报端口占用错误的求助
问题:启用JMX的ksqlDB服务器导致ksql-test-runner端口冲突
运行ksql-test-runner时出现JMX端口占用错误,具体报错如下:
sh-4.4$ ksql-test-runner -s /testing/ksql-statements-enhanced.ksql -i /testing/input.json -o /testing/output.json OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. Error: JMX connector server communication error: service:jmx:rmi://primary-ksqldb-server:1089 jdk.internal.agent.AgentConfigurationError: java.rmi.server.ExportException: Port already in use: 1089; nested exception is: java.net.BindException: Address already in use (Bind failed) at jdk.management.agent/sun.management.jmxremote.ConnectorBootstrap.exportMBeanServer(ConnectorBootstrap.java:820) at jdk.management.agent/sun.management.jmxremote.ConnectorBootstrap.startRemoteConnectorServer(ConnectorBootstrap.java:479) at jdk.management.agent/jdk.internal.agent.Agent.startAgent(Agent.java:447) at jdk.management.agent/jdk.internal.agent.Agent.startAgent(Agent.java:599) Caused by: java.rmi.server.ExportException: Port already in use: 1089; nested exception is: java.net.BindException: Address already in use (Bind failed) at java.rmi/sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:335) at java.rmi/sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:243) at java.rmi/sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:412) at java.rmi/sun.rmi.transport.LiveRef.exportObject(LiveRef.java:147) at java.rmi/sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:234) at jdk.management.agent/sun.management.jmxremote.ConnectorBootstrap$PermanentExporter.exportObject(ConnectorBootstrap.java:203) at java.management.rmi/javax.management.remote.rmi.RMIJRMPServerImpl.export(RMIJRMPServerImpl.java:153) at java.management.rmi/javax.management.remote.rmi.RMIJRMPServerImpl.export(RMIJRMPServerImpl.java:138) at java.management.rmi/javax.management.remote.rmi.RMIConnectorServer.start(RMIConnectorServer.java:473) at jdk.management.agent/sun.management.jmxremote.ConnectorBootstrap.exportMBeanServer(ConnectorBootstrap.java:816) ... 3 more Caused by: java.net.BindException: Address already in use (Bind failed) at java.base/java.net.PlainSocketImpl.socketBind(Native Method) at java.base/java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:436) at java.base/java.net.ServerSocket.bind(ServerSocket.java:395) at java.base/java.net.ServerSocket.<init>(ServerSocket.java:257) at java.base/java.net.ServerSocket.<init>(ServerSocket.java:149) at java.rmi/sun.rmi.transport.tcp.TCPDirectSocketFactory.createServerSocket(TCPDirectSocketFactory.java:45) at java.rmi/sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(TCPEndpoint.java:670) at java.rmi/sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:324) ... 12 more
当前docker-compose中ksqlDB服务器的JMX相关配置:
primary-ksqldb-server: image: ${KSQL_IMAGE_BASE}confluentinc/ksqldb-server:${KSQL_VERSION} hostname: primary-ksqldb-server container_name: primary-ksqldb-server depends_on: - kafka - schema-registry ports: - "8088:8088" - "1099:1099" - "1089:1089" logging: driver: local options: max-size: "10m" max-file: "3" environment: KSQL_CONFIG_DIR: "/etc/ksql" KSQL_LISTENERS: http://0.0.0.0:8088 KSQL_BOOTSTRAP_SERVERS: kafka:9092 KSQL_KSQL_ADVERTISED_LISTENER : http://localhost:8088 KSQL_KSQL_SCHEMA_REGISTRY_URL: http://schema-registry:8081, http://secondary-schema-registry:8082 KSQL_KSQL_LOGGING_PROCESSING_STREAM_AUTO_CREATE: "true" KSQL_KSQL_LOGGING_PROCESSING_TOPIC_AUTO_CREATE: "true" KSQL_KSQL_EXTENSION_DIR: "/usr/ksqldb/ext/" KSQL_KSQL_SERVICE_ID: "nrt_" KSQL_KSQL_STREAMS_NUM_STANDBY_REPLICAS: 1 KSQL_KSQL_QUERY_PULL_ENABLE_STANDBY_READS: "true" KSQL_KSQL_HEARTBEAT_ENABLE: "true" KSQL_KSQL_LAG_REPORTING_ENABLE : "true" KSQL_KSQL_QUERY_PULL_MAX_ALLOWED_OFFSET_LAG : 100 KSQL_LOG4J_APPENDER_KAFKA_APPENDER: "org.apache.kafka.log4jappender.KafkaLog4jAppender" KSQL_LOG4J_APPENDER_KAFKA_APPENDER_LAYOUT: "io.confluent.common.logging.log4j.StructuredJsonLayout" KSQL_LOG4J_APPENDER_KAFKA_APPENDER_BROKERLIST: localhost:9092 KSQL_LOG4J_APPENDER_KAFKA_APPENDER_TOPIC: KSQL_LOG KSQL_LOG4J_LOGGER_IO_CONFLUENT_KSQL: INFO,kafka_appender KSQL_KSQL_QUERY_PULL_METRICS_ENABLED: "true" KSQL_JMX_OPTS: > -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.rmi.port=1089
禁用JMX配置时ksql-test-runner可正常运行,需在保留JMX指标的同时解决冲突。
解决方案
方案1:修改ksqlDB服务器的JMX端口
修改docker-compose中KSQL_JMX_OPTS里的端口,避免与ksql-test-runner默认使用的端口冲突:
KSQL_JMX_OPTS: > -Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1199 # 修改为未占用的端口 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.rmi.port=1189 # 修改为对应未占用的端口
同时更新ports映射:
ports: - "8088:8088" - "1199:1199" - "1189:1189"
修改后重启ksqlDB服务,再运行ksql-test-runner即可。
方案2:运行ksql-test-runner时指定自定义JMX端口
启动ksql-test-runner时通过环境变量覆盖JMX端口配置,避免与ksqlDB服务器冲突:
export JMX_OPTS="-Dcom.sun.management.jmxremote.port=1299 -Dcom.sun.management.jmxremote.rmi.port=1289" ksql-test-runner -s /testing/ksql-statements-enhanced.ksql -i /testing/input.json -o /testing/output.json
这种方式不需要修改ksqlDB的配置,仅针对测试工具临时调整端口。
方案3:阻止ksql-test-runner启用JMX
如果测试过程不需要JMX指标,可以直接禁用ksql-test-runner的JMX功能:
export JMX_OPTS="" ksql-test-runner -s /testing/ksql-statements-enhanced.ksql -i /testing/input.json -o /testing/output.json
内容的提问来源于stack exchange,提问作者vka
相关产品推荐
相关产品推荐

