spark-submit --keytab选项不会将文件复制到执行程序

时间:2017-06-23 08:38:22

标签: apache-kafka apache-spark-sql spark-streaming

在我的情况下,我使用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.

任何提示?

2 个答案:

答案 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 中找到这个

lauch_container.sh