Ich versuche, ein Spark-Skript zu testen, um Spark mit hadoop zu verbinden. Das Skript ist folgendeZugriff auf Hdfs von Spark gibt TokenCache-Fehler Kann Master Kerberos Principal nicht zur Verwendung als Erneuerer erhalten
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()
Wenn ich es mit pyspark laufe ich
py4j.protocol.Py4JJavaError: An error occurred while calling o21.collect. : java.io.IOException: Can't get Master Kerberos principal for use as renewer at org.apache.hadoop.mapreduce.security.TokenCache.obtainTokensForNamenodesInternal(TokenCache.java:116) 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.mapred.FileInputFormat.listStatus(FileInputFormat.java:187) at org.apache.hadoop.mapred.FileInputFormat.getSplits(FileInputFormat.java:251) at org.apache.spark.rdd.HadoopRDD.getPartitions(HadoopRDD.scala:140) at org.apache.spark.rdd.RDD$$anonfun$partitions$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) at org.apache.spark.rdd.RDD.partitions(RDD.scala:205) at org.apache.spark.rdd.MappedRDD.getPartitions(MappedRDD.scala:28) at org.apache.spark.rdd.RDD$$anonfun$partitions$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) at org.apache.spark.rdd.RDD.partitions(RDD.scala:205) at 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$partitions$2.apply(RDD.scala:205) at scala.Option.getOrElse(Option.scala:120) at org.apache.spark.rdd.RDD.partitions(RDD.scala:205) at org.apache.spark.SparkContext.runJob(SparkContext.scala:898) at org.apache.spark.rdd.RDD.collect(RDD.scala:608) at org.apache.spark.api.java.JavaRDDLike$class.collect(JavaRDDLike.scala:243) at org.apache.spark.api.java.JavaRDD.collect(JavaRDD.scala:27) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 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) at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:231) at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:379) at 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.run(Thread.java:744)
Dies geschieht trotz der Tatsache, dass
- ich kinit und eine klist Show gemacht habe Ich habe die richtigen Tokens
- , wenn ich eine ./bin/hadoop fs -ls hdfs ausgeben: //hadoop_node.place: 9000/errs.txt es sho ws die Datei
- Sowohl die lokale hadoop Client und Funken haben die gleiche Konfigurationsdatei
Der Kern-site.xml in der Funken/conf und hadoop/conf Ordner ist der folgende (habe es von einem der die Hadoop-Knoten)
<configuration>
<property>
<name>hadoop.security.auth_to_local</name>
<value>
RULE:[1:$1](.*@place)s/@place//
RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/
RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/
RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/
RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/
RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/
RULE:[2:$1/[email protected]$0](.*/[email protected])s/^([a-zA-Z]*).*/$1/
RULE:[2:$1/[email protected]$0](.*/[email protected])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>
Kann jemand darauf hinweisen, was ich vermisse?
Haben alle Spark-Slaves auch die Konfiguration? –
Spark wird in einem pseudo-verteilbaren Modus ausgeführt, sodass nur ein Server/Knoten vorhanden ist. – ndp
Sie würden immer noch einige JVMs ausführen: Ihre Anwendung, den Spark-Master, den Spark-Worker und den Executor. Ich denke, Ihre Anwendung und der Executor sind diejenigen, die auf HDFS zugreifen, also müssen Sie sicherstellen, dass sie die richtige Konfiguration geladen haben. Sie könnten 'System drucken.GetProperties auf dem Executor zu überprüfen. –