在我的情况下,我使用Spark(2.1.1)并且我需要连接到Kafka(使用kerberos,因此是keytab)。
提交作业时,我可以使用--keytab和--principal选项传递keytab。主要缺点是密钥表将不会发送到分布式缓存(或至少可供执行程序使用),因此它将失败。
Caused by: org.apache.kafka.common.KafkaException: Failed to construct kafka consumer
...
Caused by: org.apache.kafka.common.KafkaException: javax.security.auth.login.LoginException: Could not login: the client is being asked for a password, but the Kafka client code does not currently support obtaining a password from the user. not available to garner` authentication information from the user
如果我尝试在--files中传递它也可以(版本2.1.0),但在最新版本(2.1.1)中,它是不允许的,因为它因以下原因而失败:
Exception in thread "main" java.lang.IllegalArgumentException: Attempt to add (file:keytab.keytab) multiple times to the distributed cache.
任何提示?
答案 0 :(得分:1)
我解决了这个问题,制作了我的密钥表文件的副本(例如原始文件为osboo.keytab
及其副本osboo-copy-for-kafka.keytab
)并通过--files
选项将其推送到HDFS。
# Call
spark2-submit --keytab osboo.keytab \
--principal osboo \
--files osboo-copy-for-kafka.keytab#osboo-copy-for-kafka.keytab,kafka.jaas#kafka.jaas
# kafka.jaas
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="osboo-copy-for-kafka.keytab"
principal="osboo@REALM.COM"
serviceName="kafka";
};
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="osboo-copy-for-kafka.keytab"
serviceName="zookeeper"
principal="osboo@REALM.COM";
};
也许这个解决方案需要更少的努力来记住文件之间的符号链接,所以我希望它有所帮助。
答案 1 :(得分:1)
spark-submit --keytab 选项,当你在yarn上提交应用程序时,将不同名称的文件复制到本地容器目录中。
你可以在 lauch_container.sh 中找到这个