CDP7.1.7下Flume对接Kafka报错缺失KafkaClient JAAS配置项
问题根因与修复方案
当前报错核心是JVM未拿到Kerberos JAAS配置文件路径,由以下几个配置/命令错误共同导致:
- 启动命令参数写法错误:
flume-ng的-c是--conf的短选项,需要紧跟配置目录路径。原命令写为-c -conf /xxx/conf/,导致-c的入参被识别为字符串-conf,后续的配置目录路径完全未被解析,Flume启动时不会加载目标目录下的flume-env.sh,配置在env.sh里的JVM参数全部不生效,这就是报错提示System property 'java.security.auth.login.config' is not set的直接原因。 flume-env.sh参数续行错误:原配置中JAVA_OPTS的两个-D参数直接换行,未在第一行末尾加Shell续行符\,就算env.sh被正确加载,第二行的JAAS配置路径参数也不会被追加到JVM启动参数中。- 路径配置不规范:
flafka_jaas.conf和flume.conf中keytab文件均使用相对路径flume.keytab,Flume进程的工作目录不固定为conf目录,会出现后续找不到keytab文件的Kerberos认证失败问题。 - 冗余配置:
flume.conf中重复写了两次kafka.consumer.security.protocol配置项,虽不直接触发当前报错,但易引发配置覆盖歧义。
修正后配置参考
1. 启动命令
flume-ng agent -n KafkaAgent --conf /opt/cdpdeployment/apache-flume-1.9.0-bin/conf/ -f /opt/cdpdeployment/apache-flume-1.9.0-bin/conf/kafka-flume.conf -Dflume.root.logger=DEBUG,console
2. flume-env.sh 中JAVA_OPTS配置
export JAVA_OPTS="$JAVA_OPTS -Djava.security.krb5.conf=/etc/krb5.conf \ -Djava.security.auth.login.config=/opt/cloudera/security/flafka_jaas.conf"
注意第一行末尾的\是Shell续行符,前后不要加多余的无关空格
3. flafka_jaas.conf 配置
将keytab替换为实际绝对路径,示例如下:
Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true keyTab="/opt/cloudera/security/flume.keytab" principal="flume/hostname@realm"; }; KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true storeKey=true serviceName="kafka" keyTab="/opt/cloudera/security/flume.keytab" principal="flume/hostname@realm"; };
4. flume.conf 配置
删除重复的security.protocol配置,将keytab路径改为绝对路径:
KafkaAgent.sources = source_kafka KafkaAgent.channels = MemChannel KafkaAgent.sinks = LoggerSink # 配置Source KafkaAgent.sources.source_kafka.type = org.apache.flume.source.kafka.KafkaSource KafkaAgent.sources.source_kafka.kafka.bootstrap.servers = hostn1:9092,host2:9092,host3:9092 KafkaAgent.sources.source_kafka.kafka.topics = cim KafkaAgent.sources.source_kafka.kafka.consumer.group.id = flume KafkaAgent.sources.source_kafka.channels = MemChannel KafkaAgent.sources.source_kafka.agent-principal=flume/hostname@realm KafkaAgent.sources.source_kafka.agent-keytab=/opt/cloudera/security/flume.keytab KafkaAgent.sources.source_kafka.kafka.consumer.security.protocol = SASL_PLAINTEXT KafkaAgent.sources.source_kafka.kafka.consumer.sasl.kerberos.service.name = kafka KafkaAgent.sources.source_kafka.kafka.consumer.sasl.mechanism = GSSAPI # 配置Sink KafkaAgent.sinks.LoggerSink.type = logger # 配置Channel KafkaAgent.channels.MemChannel.type = memory KafkaAgent.channels.MemChannel.capacity = 10000 KafkaAgent.channels.MemChannel.transactionCapacity = 1000 # 绑定Source和Sink到Channel KafkaAgent.sinks.LoggerSink.channel = MemChannel
内容的提问来源于stack exchange,提问作者Advik
相关产品推荐
相关产品推荐

