我正在使用 Flink 1.8 尝试连接到 Kerberized Kafka Broker。
我在jaas.conf中设置KafkaClient条目,如下所示:
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
renewTicket=true
serviceName="kafka";
};
Client {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
renewTicket=true
serviceName="zookeeper";
};
并通过在代码中设置此属性来指向该 jaas 文件,该属性与其余必需属性(bootstrap.servers 等(一起传递给 Kafka 消费者......
Properties properties = new Properties();
properties.setProperty("bootstrap.servers", args[0]);
properties.setProperty("security.protocol", "SASL_PLAINTEXT");
properties.setProperty("java.security.auth.login.config","/usr/hdp/current/kafka-broker/conf/kafka_client_jaas.conf");
在启动 flink 应用程序之前KAFKA_OPTS我还尝试在环境变量上指定 jaas.conf 路径。
我得到的错误是:
java.lang.IllegalArgumentException: 找不到 'KafkaClient' JAAS 配置中的条目。系统属性 'java.security.auth.login.config' 是/tmp/jaas-6335181385007718768.conf
我不知道jaas.conf文件是否应该自动放入临时文件,或者它没有很好地检测到指定的配置文件。发生错误后,临时文件将被删除,但tmp上有一些来自先前启动的文件,它们不包含任何代码(只有一些默认注释和空配置(。
设置中有两个问题;首先,传递 jaas conf 文件位置,然后传递 jaas conf 文件内容
java.security.auth.login.config是系统属性。所以你应该通过在代码中设置系统属性来传递
System.setProperty("java.security.auth.login.config", "/usr/hdp/current/kafka-broker/conf/kafka_client_jaas.conf");
或通过在运行时设置 JVM 参数 -D。
-Djava.security.auth.login.config=/usr/hdp/current/kafka-broker/conf/kafka_client_jaas.conf
应将 JAAS 文件条目配置为使用密钥表或用户名/密码
kafka-keytab-auth-jaas.conf
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab = true
useTicketCache=false
storeKey = true
keyTab="/tmp/kafka.service.keytab"
principal="****@REALM"
serviceName="kafka";
};
kafka-password-auth-jaas.conf
KafkaClient {
org.apache.kafka.common.security.plain.PlainLoginModule required
username="user"
password="userpassword";
};