2014-04-23 15 views
6

Sto provando a eseguire uno script di prova Spark per collegare Spark a hadoop. Lo script è la seguenteAccedere a Hdf da Spark dà errore TokenCache Impossibile ottenere il principal Kerberos principale da utilizzare come rinnovo

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() 

quando lo eseguo con pyspark ottengo

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)

Questo accade nonostante i fatti che

  • Ho fatto un kinit e una mostra klist Ho i token corretti
  • quando emetto un file ./bin/hadoop fs -ls hdfs: //hadoop_node.place: 9000/errs.txt it sho ws il file
  • Sia il client Hadoop locale e scintilla hanno lo stesso file di configurazione

Il core-site.xml nella scintilla/conf e cartelle Hadoop/conf è la seguente (ottenuto da uno dei i nodi hadoop)

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

Qualcuno può indicare cosa mi manca?

+0

Anche gli schiavi Spark hanno tutti la configurazione? –

+0

Spark viene eseguito in una modalità pseudo-distribuibile in modo che sia presente un solo server/nodo – ndp

+1

Avresti ancora un paio di JVM in esecuzione: la tua applicazione, il master Spark, il worker Spark e l'executor. Penso che la tua applicazione e l'esecutore saranno quelli che accedono a HDFS, quindi devi assicurarti che abbiano caricato la configurazione corretta. Potresti stampare 'Sistema.getProperties' sull'esecutore da controllare. –

risposta

5

Dopo aver creato il mio cluster di hadoop per capire meglio come funziona hadoop. L'ho riparato.

È necessario fornire a Spark un file .keytab valido che è stato generato per un account che ha almeno l'accesso in lettura al cluster hadoop.

Inoltre, devi fornire una scintilla con hdfs-site.xml del tuo cluster hdfs.

Così per il mio caso ho dovuto creare un file keytab che quando si esegue

klist -k -e -t

su di esso si ottiene voci simile al seguente

host/[email protected]

Nel mio caso il padrone di casa era la parola letterale host e non una variabile. Anche nel vostro HDFS-site.xml è necessario fornire il percorso del file keytab e dire che

host/[email protected]

sarà il tuo account.

Cloudera ha una descrizione abbastanza dettagliata su come farlo.

Modifica dopo aver giocato un po 'con diverse configurazioni Penso che la si segnala. Devi fornire una scintilla con l'esatto hdfs-site.xml e core-site.xml del tuo cluster hadoop. Altrimenti non funzionerà

+2

Potresti aggiungere il link a Cloudera writeup? –

+0

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

+0

Quale nome parametro si utilizza per connettere da Spark a HDFS con Kerberos –

Problemi correlati