【发布时间】:2017-11-26 18:17:57
【问题描述】:
在我的情况下,我使用的是 Spark (2.1.1),并且对于处理我需要连接到 Kafka(使用 kerberos,因此是 keytab)。
提交作业时,我可以使用 --keytab 和 --principal 选项传递 keytab。主要缺点是 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.
有什么建议吗?
【问题讨论】:
-
我在某处读到 Kerberos 委托令牌的管理(用于 HDFS、HBase、Hive ......但不是 Kafka!)已在 Spark 2.1.1 中进行了重构,这可能是 Spark 现在秘密发布的原因HDFS 的 keytab。
-
您是否只是尝试重命名目标文件,即应该在每个 YARN 容器的工作目录中上传
tmp.keytab的--files /wtf/wtf/keytab.keytab#tmp.keytab?它在早期版本中有一些怪癖,参见。 issues.apache.org/jira/browse/SPARK-10858 但现在应该稳定了。 -
@SamsonScharfrichter 是的,我试过了,但我猜它比较了源名称,并且它无法抱怨上传两次相同的文件。关于第一个,我不知道它是否秘密上传,但事实是不可用。我现在的解决方案是在我提交作业的机器上创建一个符号链接,以yarn-client模式发送它,符号链接作为keytab,正确的keytab文件在--files中。但不是一个好人...
-
我会尝试完全相同的事情,代替你。希望未来的 Spark 版本会为通过
--keytab传递的 keytab 使用随机临时名称,您将能够删除您的解决方法...
标签: apache-kafka apache-spark-sql spark-streaming