2014-04-23 8 views
6

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?

+0

Haben alle Spark-Slaves auch die Konfiguration? –

+0

Spark wird in einem pseudo-verteilbaren Modus ausgeführt, sodass nur ein Server/Knoten vorhanden ist. – ndp

+1

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. –

Antwort

5

Nachdem ich meinen eigenen Hadoop-Cluster erstellt habe, um besser zu verstehen, wie Hadoop funktioniert. Ich habe es repariert.

Sie müssen Spark eine gültige .keytab-Datei bereitstellen, die für ein Konto erstellt wurde, das mindestens Lesezugriff auf den Hadoop-Cluster hat.

Außerdem müssen Sie spark mit der hdfs-site.xml Ihres hdfs-Clusters bereitstellen.

Also für meinen Fall hatte ich eine Keytab-Datei zu erzeugen, die, wenn Sie

klist -k -e -t

darauf laufen Sie Einträge wie folgt

host/[email protected]

In meinem Fall bekommen die Gastgeber die wörtliche Wort war Host und keine Variable. Auch in Ihrer hdfs-site.xml Sie haben den Pfad der Keytab-Datei zur Verfügung zu stellen und sagen, dass

host/[email protected]

Ihr Konto.

Cloudera hat eine ziemlich detaillierte Beschreibung, wie es geht.

bearbeiten nach einem wenig mit verschiedenen Konfigurationen zu spielen denke ich folgendes zu beachten. Sie müssen spark die genaue hdfs-site.xml und core-site.xml Ihres Hadoop-Clusters bereitstellen. Sonst funktioniert es nicht

+2

Könnten Sie bitte den Link zu Cloudera writeup hinzufügen? –

+0

http://www.cloudera.com/content/cloudera/en/documentation/core/latest/topics/cdh_sg_kerberos_prin_keytab_deploy.html – mxm

+0

Welchen Parameternamen verwenden Sie, um eine Verbindung von Spark zu HDFS mit Kerberos herzustellen? –