我们正在尝试使用 talend 批处理 (spark) 作业来访问 Kerberos 集群中的配置单元,但我们收到以下“无法获取主 Kerberos 主体以用作更新程序”错误。
通过使用 talend 中的标准作业(非 Spark),我们可以毫无问题地访问 Hive。
以下是观察结果:
我不确定到底是什么问题导致了令牌问题。有人可以帮助我们了解根本原因吗?
如果我使用 Spark 批处理作业读取/写入 hdfs,那么除了 hive 之外还需要添加一件事,所以唯一的问题是 hive 和 Kerberos。
您应该将 hadoop 配置包含在类路径 (:/path/hadoop-configuration) 中。您应该包含该 hadoop 配置目录中的所有配置文件,而不仅仅是 core-site.xml 和 hdfs-site.xml 文件。这发生在我身上,解决了问题。
当我在 k8s 上启动 Spark 时遇到同样的问题,
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: java.io.IOException: Can't get Master Kerberos principal for use as renewer
at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:133)
at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:100)
at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodes(TokenCache.java:80)
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:243)
at org.apache.spark.input.WholeTextFileInputFormat.setMinPartitions(WholeTextFileInputFormat.scala:52)
at org.apache.spark.rdd.WholeTextFileRDD.getPartitions(WholeTextFileRDD.scala:54)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:273)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:269)
at scala.Option.getOrElse(Option.scala:121)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:269)
我只需将
yarn-site.xml
添加到 HADOOP_CONFIG_DIR
。
yarn-site.xml
仅包含yarn.resourcemanager.principal
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<name>yarn.resourcemanager.principal</name>
<value>yarn/[email protected]</value>
</property>
</configuration>
这对我有用。
如果它是一个新集群,并且是yarn作业,请确保您已将mr-framework上传到hdfs中的/user/yarn/mapreduce/mr-framewor。 如果该路径丢失,所有纱线作业都将失败并出现以下错误: 错误: java.io.IOException:无法获取主 Kerberos 主体用作更新程序
$ hdfs dfs -put 3.1.1.7.1.7.2032-1-mr-framework.tar.gz /user/yarn/mapreduce/mr-framework