当前位置: 首页 > 知识库问答 >
问题:

从Spark访问Hdfs会出现TokenCache错误无法获取主Kerberos本金用作续订器

赫连瀚
2023-03-14

我正在尝试运行一个测试Spark脚本,以便将Spark连接到hadoop。脚本如下

from pyspark import SparkContext

sc = SparkContext("local", "Simple App")
file = sc.textFile("hdfs://hadoop_node.place:9000/errs.txt")
errors = file.filter(lambda line: "ERROR" in line)
errors.count()

当我用pyspark运行它时

py4j。协议Py4JJavaError:调用o21时出错。收款人:JAVAio。IOException:无法获取主Kerberos主体以用作组织的续订者。阿帕奇。hadoop。mapreduce。安全令牌缓存。org上的obtainTokensForNamenodesInternal(TokenCache.java:116)。阿帕奇。hadoop。mapreduce。安全令牌缓存。org上的obtainTokensForNamenodesInternal(TokenCache.java:100)。阿帕奇。hadoop。mapreduce。安全令牌缓存。org上的obtainTokensForNamenodes(TokenCache.java:80)。阿帕奇。hadoop。映射。FileInputFormat。组织中的listStatus(FileInputFormat.java:187)。阿帕奇。hadoop。映射。FileInputFormat。组织上的getSplits(FileInputFormat.java:251)。阿帕奇。火花rdd。HadoopRDD。org上的getPartitions(HadoopRDD.scala:140)。阿帕奇。火花rdd。RDD$$anonfun$分区$2。在组织中应用(RDD.scala:207)。阿帕奇。火花rdd。RDD$$anonfun$分区$2。在scala处应用(RDD.scala:205)。选项位于org的getOrElse(Option.scala:120)。阿帕奇。火花rdd。RDD。org上的分区(RDD.scala:205)。阿帕奇。火花rdd。MappedRDD。位于org的getPartitions(MappedRDD.scala:28)。阿帕奇。火花rdd。RDD$$anonfun$分区$2。在组织中应用(RDD.scala:207)。阿帕奇。火花rdd。RDD$$anonfun$分区$2。在scala处应用(RDD.scala:205)。选项位于org的getOrElse(Option.scala:120)。阿帕奇。火花rdd。RDD。org上的分区(RDD.scala:205)。阿帕奇。火花api。python蟒蛇。org上的getPartitions(PythonRDD.scala:46)。阿帕奇。火花rdd。RDD$$anonfun$分区$2。在组织中应用(RDD.scala:207)。阿帕奇。火花rdd。RDD$$anonfun$分区$2。在scala处应用(RDD.scala:205)。选项位于org的getOrElse(Option.scala:120)。阿帕奇。火花rdd。RDD。org上的分区(RDD.scala:205)。阿帕奇。火花SparkContext。org上的runJob(SparkContext.scala:898)。阿帕奇。火花rdd。RDD。在组织收集(RDD.scala:608)。阿帕奇。火花api。JAVAJavaRDDLike$类。在org上收集(JavaRDDLike.scala:243)。阿帕奇。火花api。JAVAJavaRDD。在sun收集(javard.scala:27)。反映NativeMethodAccessorImpl。在sun调用0(本机方法)。反映NativeMethodAccessorImpl。在sun上调用(NativeMethodAccessorImpl.java:57)。反映DelegatingMethodAccessorImpl。在java上调用(DelegatingMethodAccessorImpl.java:43)。lang.reflect。方法在py4j调用(方法java:606)。反射MethodInvoker。在py4j上调用(MethodInvoker.java:231)。反射反光发动机。在py4j处调用(ReflectionEngine.java:379)。网关。在py4j上调用(Gateway.java:259)。命令。AbstractCommand。py4j上的invokeMethod(AbstractCommand.java:132)。命令。CallCommand。在py4j上执行(CallCommand.java:79)。网关连接。在java上运行(GatewayConnection.java:207)。lang.Thread。运行(Thread.java:744)

尽管事实是

  • 我做了一个kinit,一个klist显示我有正确的代币
  • 当我发出一个/bin/hadoop fs-lshdfs://hadoop_node.place:9000/errs.txt它显示文件
  • 本地hadoop客户端和spark都有相同的配置文件

火花/conf和hadoop/conf文件夹中的core-site.xml如下(从其中一个hadoop节点获得)

<configuration>
    <property>

        <name>hadoop.security.auth_to_local</name>
        <value>
            RULE:[1:$1](.*@place)s/@place//
            RULE:[2:$1/$2@$0](.*/node1.place@place)s/^([a-zA-Z]*).*/$1/
            RULE:[2:$1/$2@$0](.*/node2.place@place)s/^([a-zA-Z]*).*/$1/
            RULE:[2:$1/$2@$0](.*/node3.place@place)s/^([a-zA-Z]*).*/$1/
            RULE:[2:$1/$2@$0](.*/node4.place@place)s/^([a-zA-Z]*).*/$1/
            RULE:[2:$1/$2@$0](.*/node5.place@place)s/^([a-zA-Z]*).*/$1/
            RULE:[2:$1/$2@$0](.*/node6.place@place)s/^([a-zA-Z]*).*/$1/
            RULE:[2:$1/$2@$0](.*/node7.place@place)s/^([a-zA-Z]*).*/$1/
            RULE:[2:nobody]
            DEFAULT
        </value>
    </property>
    <property>
        <name>net.topology.node.switch.mapping.impl</name>
        <value>org.apache.hadoop.net.TableMapping</value>
    </property>
    <property>
        <name>net.topology.table.file.name</name>
        <value>/etc/hadoop/conf/topology.table.file</value>
    </property>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://server.place:9000/</value>
    </property>
    <property>
      <name>hadoop.security.authentication</name>
      <value>kerberos</value>
    </property>

    <property>
      <name>hadoop.security.authorization</name>
      <value>true</value>
    </property>

    <property>
      <name>hadoop.proxyuser.hive.hosts</name>
      <value>*</value>
    </property>

    <property>
      <name>hadoop.proxyuser.hive.groups</name>
      <value>*</value>
    </property>

</configuration>

有人能指出我错过了什么吗?

共有1个答案

谭昱
2023-03-14

为了更好地理解hadoop的工作原理,我创建了自己的hadoop集群。我把它修好了。

您必须为Spark提供有效的。为至少具有hadoop集群读取权限的帐户生成的keytab文件。

此外,您还必须为spark提供hdfs站点。hdfs集群的xml。

所以对于我的情况,我必须创建一个keytab文件,当您运行时

klist-k-e-t

在上面你可以看到如下的条目

主机/fully.qualified.domain.name@REALM.COM

在我的例子中,主机是字面意思主机,而不是变量。同样,在您的hdfs-site.xml中,您必须提供keytab文件的路径并说

主机/_HOST@REALM.COM

将是您的帐户。

Cloudera有一篇关于如何做到这一点的非常详细的文章。

使用不同的配置播放一段时间后进行编辑,我认为应该注意以下几点。您必须为spark提供准确的hdfs站点。xml和核心站点。hadoop集群的xml。否则就不行了

 类似资料:
  • 我使用kerberos身份验证配置了HDFS,我可以使用自己的keytab文件访问HDFS集群中任何机器上的HDFS。但是当我使用相同的keytab访问HDFS集群外的远程服务器上的HDFS时,我无法访问。我收到以下错误消息,顺便说一下,我已经将服务器的配置文件krb5.conf复制到hadoop集群外的远程机器。

  • Database ricks作业用于连接到ADLS G2存储并成功处理文件。 最近,在更新了服务主体机密,并更新了Key-vault中的机密之后,现在作业正在失败。 使用databricks cli<code>databricks-secrets list scopes--profile mycluster</code>,我能够识别正在使用的键值,还验证了相应的密钥是否正确更新。 在笔记本中,我遵

  • 问题内容: 我正在尝试连接到在Cloudera上运行的HDFS实例。我的第一个步骤启用Kerberos和创建Keytabs(如图所示这里)。 在下一步中,我想使用密钥表进行身份验证。 它失败并显示以下错误 java.io.IOException:从keytab /etc/hadoop/conf/hdfs.keytab登录hdfs @ CLOUDERA失败:javax.security.auth.l

  • 问题内容: 我是Rust的新手。我正在使用板条箱,但该程序只是退出而没有引起恐慌。我要做的唯一不同就是数据库不同。 问题答案: 引发了错误,但是您忽略了它。 长an 非致命错误通常通过返回来传播,因此调用方可以处理该错误。紧急情况通常用于发生不可恢复的错误,并将中止当前线程。在这种情况下,redis库使用该类型,它是的别名。 如果要处理错误,则应通过匹配结果类型来进行。尝试将您的主要功能更改为以下

  • 我写了一段代码,每当我用特定的图像名称点击url时返回图像,如果找不到图像,就返回错误图像。 但我还是会遇到这个错误,当我试图击中错误的图像 代码出了什么问题?

  • 我有一个使用mod_wsgi安装了apache和django的生产服务器。 django应用程序有一个REST API,它在发送GET请求时提供一些信息。 如果我们使用manage运行django,这在开发服务器上总是很好。屏幕中的py。现在,我们用运行django的apache创建了一个生产服务器,但当从本地主机或同一网络中的其他机器(使用192.168.X.X IP)运行wget时,该API返