从spark访问hdfs时出现tokencache错误,无法获取用作续订程序的主kerberos主体

mccptt67  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(322)

我正在尝试运行一个测试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()

当我用Pypark运行它时
py4j.protocol.py4jjavaerror:调用o21.collect时出错:java.io.ioexception:无法在org.apache.hadoop.mapreduce.security.tokencache.obtaintokensfornamenodesinternal(tokencache)获取用作续订程序的主kerberos主体。java:116)在org.apache.hadoop.mapreduce.security.tokencache.obtaintokensfornamenodesinternal(tokencache。java:100)在org.apache.hadoop.mapreduce.security.tokencache.obtaintokensfornamenodes(令牌缓存)。java:80)在org.apache.hadoop.mapred.fileinputformat.liststatus(fileinputformat。java:187)位于org.apache.hadoop.mapred.fileinputformat.getsplits(fileinputformat)。java:251)在org.apache.spark.rdd.hadooprdd.getpartitions(hadooprdd。scala:140)在org.apache.spark.rdd.rdd$$anonfun$分区$2.apply(rdd。scala:207)在org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd。scala:205)在scala.option.getorelse(option。scala:120)在org.apache.spark.rdd.rdd.partitions(rdd。scala:205)在org.apache.spark.rdd.mappedrdd.getpartitions(mappedrdd。scala:28)在org.apache.spark.rdd.rdd$$anonfun$分区$2.apply(rdd。scala:207)在org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd。scala:205)在scala.option.getorelse(option。scala:120)在org.apache.spark.rdd.rdd.partitions(rdd。scala:205)在org.apache.spark.api.pythonrdd.getpartitions(pythonrdd。scala:46)在org.apache.spark.rdd.rdd$$anonfun$分区$2.apply(rdd。scala:207)在org.apache.spark.rdd.rdd$$anonfun$partitions$2.apply(rdd。scala:205)在scala.option.getorelse(option。scala:120)在org.apache.spark.rdd.rdd.partitions(rdd。scala:205)在org.apache.spark.sparkcontext.runjob(sparkcontext。scala:898)在org.apache.spark.rdd.rdd.collect(rdd。scala:608)在org.apache.spark.api.java.javarddlike$class.collect(javarddlike。scala:243)在org.apache.spark.api.java.javardd.collect(javardd。scala:27)在sun.reflect.nativemethodaccessorimpl.invoke0(本机方法)在sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl)。java:57)在sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl。java:43)在java.lang.reflect.method.invoke(方法。java:606)在py4j.reflection.methodinvoker.invoke(methodinvoker。java:231)在py4j.reflection.reflectionengine.invoke(reflectionengine。java:379)在py4j.gateway.invoke(gateway。java:259)在py4j.commands.abstractcommand.invokemethod(abstractcommand。java:132)在py4j.commands.callcommand.execute(callcommand。java:79)在py4j.gatewayconnection.run(网关连接。java:207)在java.lang.thread.run(线程。java:744)
尽管事实上
我做了一个kinit和klist显示我有正确的代币
当我发布一个./bin/hadoop fs-lshdfs://hadoop_node.place:9000/errs.txt显示文件
本地hadoop客户端和spark都有相同的配置文件
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>

有人能指出我遗漏了什么吗?

vjhs03f7

vjhs03f71#

为了更好地理解hadoop的工作原理,我创建了自己的hadoop集群。我修好了。
必须为spark提供有效的.keytab文件,该文件是为至少具有hadoop集群读访问权限的帐户生成的。
此外,还必须为spark提供hdfs集群的hdfs-site.xml。
所以在我的例子中,我必须创建一个keytab文件,当你运行
klist-k-e-t公司
在上面你可以看到如下的条目
主机/fully.qualified.domain。name@realm.com
在我的例子中,host是字面意思的host,而不是一个变量。在hdfs-site.xml中,还必须提供keytab文件的路径
主持人/_host@realm.com
将是您的帐户。
cloudera有一个非常详细的关于如何做到这一点的文章。
编辑后玩了一点不同的配置,我认为应该注意以下几点。必须为spark提供hadoop集群的确切hdfs-site.xml和core-site.xml。否则就不行了

相关问题