当前位置:  开发笔记 > 编程语言 > 正文

从Spark访问Hdfs会产生TokenCache错误无法获取Master Kerberos主体以用作续订程序

如何解决《从Spark访问Hdfs会产生TokenCache错误无法获取MasterKerberos主体以用作续订程序》经验,为你挑选了1个好方法。

我正在尝试运行测试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.protocol.Py4JJavaError:调用o21.collect时发生错误.:java.io.IOException:无法将orber.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal (TokenCache.java:116)中的主Kerberos主体用作续订器,位于org.apache.hadoop.mapreduce.security.位于org.apache.hadoop.mapred.FileInputFormat.listStatus(FileInputFormat.java:187)的org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodes(TokenCache.java:80)中的TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:100) org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:251)org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:140)at org.apache.spark.rdd.RDD $$ anonfun $ partition $ 2.apply(RDD.scala:207)at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:205)at scala.Option.getOrElse(Option.scala:120) )org.apache.spark.rdd.RDD.partitions(RDD.scala:205)atg.apache.spark.rdd.MappedRDD.getPartitions(MappedRDD.scala:28)at org.apache.spark.rdd.RDD $ $ anonfun $在org上划分$ 2.apply(RDD.scala:207).位于org.apache.spark.rdd.RDD.partitions的scala.Option.getOrElse(Option.scala:120)中的apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:205)(RDD. scala:205)org.apache.spark.api.python.PythonRDD.getPartitions(PythonRDD.scala:46)at org.apache.spark.rdd.RDD $$ anonfun $ partitions $ 2.apply(RDD.scala:207) at org.apache.spark.rdd.RDD $$ anonfun $在org.apache.spark.rdd.RDD.partitions的scala.Option.getOrElse(Option.scala:120)处分区$ 2.apply(RDD.scala:205) (RDD.scala:205)org.apache.spark.SparkContext.runJob(SparkContext.scala:898)位于org.apache.spark的org.apache.spark.rdd.RDD.collect(RDD.scala:608). api.java.JavaRDDLike $ class.collect(JavaRDDLike.scala:243)atg.apache.spark.api.java.JavaRDD.collect(JavaRDD.scala:27)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke (Method.java:606)py4j.reflection.MetodInvoke.invoke(MethodInvoker.java:231)py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379)py4j.Gateway.invoke(Gateway.java:259) at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)at py4j.commands.CallCommand.execute(CallCommand.java:79)at py4j.GatewayConnection.run(GatewayConnection.java:207)at java.lang.Thread.运行(Thread.java:744)

尽管事实如此,但仍然会发生

我做了一个kinit和一个klist显示我有正确的令牌

当我发出./bin/hadoop fs -ls hdfs://hadoop_node.place:9000/errs.txt它显示文件

本地hadoop客户端和spark都具有相同的配置文件

spark/conf和hadoop/conf文件夹中的core-site.xml如下所示(从其中一个hadoop节点获取)


    

        hadoop.security.auth_to_local
        
            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
        
    
    
        net.topology.node.switch.mapping.impl
        org.apache.hadoop.net.TableMapping
    
    
        net.topology.table.file.name
        /etc/hadoop/conf/topology.table.file
    
    
        fs.defaultFS
        hdfs://server.place:9000/
    
    
      hadoop.security.authentication
      kerberos
    

    
      hadoop.security.authorization
      true
    

    
      hadoop.proxyuser.hive.hosts
      *
    

    
      hadoop.proxyuser.hive.groups
      *
    


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



1> ndp..:

在创建我自己的hadoop集群之后,为了更好地理解hadoop如何工作.我修好了它.

您必须为Spark提供一个有效的.keytab文件,该文件是为至少具有hadoop集群读取权限的帐户生成的.

此外,您必须使用hdfs集群的hdfs-site.xml提供spark.

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

klist -k -e -t

在它上面你会得到如下条目

host/fully.qualified.domain.name@REALM.COM

在我的情况下,主机是文字主机而不是变量.同样在你的hdfs-site.xml中,你必须提供keytab文件的路径并说出来

host/_HOST@REALM.COM

将是您的帐户.

Cloudera有一个关于如何做的非常详细的文章.

使用不同的配置播放后编辑我认为应该注意以下内容.您必须使用hadoop集群的确切hdfs-site.xml和core-site.xml提供spark.否则它不会工作


Could you please add the link to Cloudera writeup?
推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有