我有一个使用Kafka-Streams-API的应用程序。我在当地工作时没有问题。我想连接到远程Kafka代理进行阶段测试。远程Kafka代理被设置为使用GSSAPI sasl机制并使用Kerberos。当我运行用java编写的Streams应用程序时,我遇到了一个错误。在我查找错误消息后,我找到了答案,但仍然有问题。
错误消息;获取关联id为3的元数据时出错:{[APPID]-KTABLE-AGGREGATE-STATE-STORE-00000000008-repartition=UNKNOWN_TOPIC_OR_PARTITION
我找到的答案是:;
当使用Authorizer并且用户对主题没有"描述"授权时,代理将不再向请求返回topic_authorization_FAILED错误,因为这会泄露主题名称。相反,将返回UNKNOWN_TOPIC_OR_PARTITION错误代码。这可能会在使用生产者和消费者时导致意外的超时或延迟,因为Kafka客户端通常会在未知主题错误时自动重试。如果您怀疑可能会发生这种情况,则应查阅客户端日志。
所以我的实际问题是如何授权使用GSAPI sasl机制的远程主题?
有点晚了,但这就是答案。有两种方法可以将Kerberized Kafka集群与Stream应用程序连接起来。
详细信息
-
缓存凭据:使用缓存凭据创建jaas.conf文件。要使用缓存的Kerberos凭据(首先使用kinit(,请使用此配置。它只适合手动运行。
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useTicketCache=true; };
-
通过使用keyTab:创建一个jaas.conf文件,其中包含keyTab和主体信息。它适用于自动运行。
KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTab=true keyTab="/etc/security/keytabs/mykafkaclient.keytab" principal="mykafkaclient/clients.hostname.com@EXAMPLE.COM"; };
使用定义环境变量
export KAFKA_OPTS="-Djava.security.auth.login.config=/home/user/jaas.conf"
不要忘记控制访问名为KRB5.conf(在unix中(或KRB5.ini(在Windows中(的文件
krb5
当然,有些参数必须正确定义。如果您想使用kafka CLI访问kafka主题,请创建一个包含内容的client.properties文件
<code>security.protocol=SASL_PLAINTEXT
sasl.kerberos.service.name=kafka
sasl.mechanism=GSSAPI
</code>
使用Kafka流应用程序,您将在属性中提供这些参数。
- Kerberos是一个复杂的主题。如果有人对它的细节感兴趣,我强烈推荐";Hadoop和Kerberos:门外的疯狂;git簿