【问题标题】:spark-submit --keytab option does not copy the file to executorsspark-submit --keytab 选项不会将文件复制到执行程序
【发布时间】: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


【解决方案1】:

我解决了这个问题,制作了我的 keytab 文件的副本(例如,原始文件是 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";
};

也许这个解决方案需要较少的努力来记住文件之间的符号链接,所以我希望它有所帮助。

【讨论】:

    【解决方案2】:

    spark-submit --keytab 选项在您在纱线上提交应用程序时复制本地容器目录中具有不同名称的文件。

    你可以在 lauch_container.sh 中找到它

    lauch_container.sh

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-28
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 2018-07-28
      • 2019-10-10
      相关资源
      最近更新 更多