温馨提示 本文內容在使用 ttr-2.2.0 版本之前,開啓Kerberos後才會遇到。

後續版本已經做了處理,無需關注! 如果在部署、二開過程中,遇到任何問題可以讓作者幫你解決。

一、問題現象

在 Ambari 啓用 Kerberos 後啓動 Kafka 服務時,出現如下錯誤,Kafka 無法正常啓動。

[2025-10-29 10:53:11,598] INFO Registered kafka:type=kafka.Log4jController MBean (kafka.utils.Log4jControllerRegistration$)
[2025-10-29 10:53:12,414] INFO starting (kafka.server.KafkaServer)
[2025-10-29 10:53:12,415] INFO Connecting to zookeeper on hadoop1:2181,hadoop2:2181,hadoop3:2181 (kafka.server.KafkaServer)
[2025-10-29 10:53:12,465] ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
java.lang.SecurityException: zookeeper.set.acl is true, but ZooKeeper client TLS configuration identifying at least kafka.server.KafkaConfig$@6572421.ZkSslClientEnableProp, kafka.server.KafkaConfig$@6572421.ZkClientCnxnSocketProp, and kafka.server.KafkaConfig$@6572421.ZkSslKeyStoreLocationProp was not present and the verification of the JAAS login file failed [java.security.auth.login.config=null, zookeeper.sasl.client=default:true, zookeeper.sasl.clientconfig=default:Client]
        at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:445)
        at kafka.server.KafkaServer.startup(KafkaServer.scala:191)
        at kafka.Kafka$.main(Kafka.scala:109)
        at kafka.Kafka.main(Kafka.scala)
[2025-10-29 10:53:12,473] INFO shutting down (kafka.server.KafkaServer)
[2025-10-29 10:53:12,486] INFO shut down completed (kafka.server.KafkaServer)
[2025-10-29 10:53:12,486] ERROR Exiting Kafka. (kafka.Kafka$)
[2025-10-29 10:53:12,488] INFO shutting down (kafka.server.KafkaServer)
[root@hadoop1 kafka]#

【Ambari開啓Kerberos】-Kafka啓動失敗處理_cdh

二、原因分析

從日誌看,java.security.auth.login.config=null,説明 Kafka 未正確加載 JAAS 登錄配置。 在 Kerberos 模式下,Kafka 依賴 KAFKA_KERBEROS_PARAMS 變量來傳遞 JAAS 文件路徑及認證參數。

而在 Ambari 2.2.0 以前版本,Kafka 環境模板(kafka-env.sh)中並未自動加入此變量, 導致即使啓用了 Kerberos,Kafka 進程仍然以默認參數啓動,從而報:

zookeeper.set.acl is true ... verification of the JAAS login file failed

三、應急解決方案(無需重新部署)

可以直接在 Ambari Web → Kafka → 配置 → kafka-env template 中補充一行環境變量定義。

修改位置:

打開模板編輯:

【Ambari開啓Kerberos】-Kafka啓動失敗處理_開源_02

在文件末尾加入以下內容:

export KAFKA_OPTS="$KAFKA_OPTS ${KAFKA_KERBEROS_PARAMS:+$KAFKA_KERBEROS_PARAMS }"

修改後完整內容示例:

#!/bin/bash

# Set KAFKA specific environment variables here.

# The java implementation to use.
export JAVA_HOME={{java64_home}}
export PATH=$PATH:$JAVA_HOME/bin
export PID_DIR={{kafka_pid_dir}}
export LOG_DIR={{kafka_log_dir}}
{% if kerberos_security_enabled or kafka_other_sasl_enabled %}
export KAFKA_KERBEROS_PARAMS="-Djavax.security.auth.useSubjectCredsOnly=false {{kafka_kerberos_params}}"
{% else %}
export KAFKA_KERBEROS_PARAMS={{kafka_kerberos_params}}
{% endif %}
# Add kafka sink to classpath and related depenencies
if [ -e "/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar" ]; then
  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar
  export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/lib/*
fi
{% if stack_supports_kafka_env_include_ranger_script %}
if [ -f /etc/kafka/conf/kafka-ranger-env.sh ]; then
. /etc/kafka/conf/kafka-ranger-env.sh
fi
{% else %}
      export CLASSPATH=$CLASSPATH:{{conf_dir}}
{% endif %}
export KAFKA_OPTS="$KAFKA_OPTS ${KAFKA_KERBEROS_PARAMS:+$KAFKA_KERBEROS_PARAMS }"

四、説明與建議

版本説明

  • Ambari ≤ 2.2.0:默認模板中 未包含 KAFKA_KERBEROS_PARAMS 引用,必須手動添加。
  • Ambari ≥ 2.2.1:官方模板已合入該修復,不再需要人工干預。