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?
Anche gli schiavi Spark hanno tutti la configurazione? –
Spark viene eseguito in una modalità pseudo-distribuibile in modo che sia presente un solo server/nodo – ndp
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. –