Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Authentication 从Spark访问Hdfs时,缓存错误可能';无法获取用作续订者的主Kerberos主体_Authentication_Hadoop_Kerberos_Apache Spark - Fatal编程技术网

Authentication 从Spark访问Hdfs时,缓存错误可能';无法获取用作续订者的主Kerberos主体

Authentication 从Spark访问Hdfs时,缓存错误可能';无法获取用作续订者的主Kerberos主体,authentication,hadoop,kerberos,apache-spark,Authentication,Hadoop,Kerberos,Apache Spark,我正在尝试运行一个测试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() 当我用P

我正在尝试运行一个测试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.收集:java.io.IOException:无法获取主Kerberos 作为续约人使用的委托人 位于org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:116) 位于org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:100) 位于org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodes(TokenCache.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$partitions$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.mapperdd.getPartitions(mapperdd.scala:28) 位于org.apache.spark.rdd.rdd$$anonfun$partitions$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.python.PythonRDD.getPartitions(PythonRDD.scala:46) 位于org.apache.spark.rdd.rdd$$anonfun$partitions$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(Method.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处(GatewayConnection.java:207) 运行(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
规则:[1:$1](.@place)s/@place//
规则:[2:$1/$2@$0](.*/node1。place@place)/^([a-zA-Z]*)./$1/
规则:[2:$1/$2@$0](.*/node2。place@place)/^([a-zA-Z]*)./$1/
规则:[2:$1/$2@$0](.*/node3。place@place)/^([a-zA-Z]*)./$1/
规则:[2:$1/$2@$0](.*/node4。place@place)/^([a-zA-Z]*)./$1/
规则:[2:$1/$2@$0](.*/node5。place@place)/^([a-zA-Z]*)./$1/
规则:[2:$1/$2@$0](.*/node6。place@place)/^([a-zA-Z]*)./$1/
规则:[2:$1/$2@$0](.*/node7。place@place)/^([a-zA-Z]*)./$1/
规则:[2:无人]
违约
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
真的
hadoop.proxyuser.hive.hosts
*
hadoop.proxyuser.hive.groups
*

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

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

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

此外,还必须为spark提供hdfs集群的hdfs-site.xml

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

klist-k-e-t

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

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()
host/full.qualified.domain。name@REALM.COM

在我的例子中,host是字面值的host,而不是一个变量。 在hdfs-site.xml中,还必须提供keytab文件的路径,并说明

主人/_HOST@REALM.COM

这将是你的帐户

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

编辑 在使用不同的配置玩了一点之后,我认为应该注意以下几点。
您必须为spark提供hadoop集群的确切hdfs-site.xml和core-site.xml。否则它将无法工作

所有Spark从属服务器是否也都有配置?Spark以伪可分发模式运行,因此只有一个服务器/节点您仍将运行两个JVM