2017-05-16 1 views
2

Ich habe eine Eingabedatei, die benutzerdefiniert ist und an newAPIHadoopFile übergeben wird, um sie als RDD [String] zu konvertieren. Die Datei befindet sich unter dem Projektressourcenverzeichnis. Der folgende Code funktioniert gut, wenn er von der Eclipse-IDE ausgeführt wird. JedochEingabedatei von jar lesen, während die Anwendung von spark-submit ausgeführt wird

val path = this.getClass() 
       .getClassLoader() 
       .getResource(fileName)     
       .toURI().toString() 
    val conf = new org.apache.hadoop.conf.Configuration() 
    conf.set("textinputformat.record.delimiter", recordDelimiter) 

    return sc.newAPIHadoopFile(
     path, 
     classOf[org.apache.hadoop.mapreduce.lib.input.TextInputFormat], 
     classOf[org.apache.hadoop.io.LongWritable], 
     classOf[org.apache.hadoop.io.Text], 
     conf) 
    .map(_._2.toString) 

wenn ich es auf laufen Funken einreichen (mit einem uber Glas) wie folgt

spark-submit /Users/anon/Documents/myUber.jar 

ich die unten Fehler.

Exception in thread "main" java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: jar:file:/Users/anon/Documents/myUber.jar!/myhome-data.json 

Irgendwelche Eingaben bitte?

Antwort

1

Wenn die Datei für sc.newAPIHadoopFile ist, die einen Pfad nicht einen Eingabestream erfordert, würde ich --files Option von spark-submit empfehlen.

--files FILES kommagetrennte Liste von Dateien im Arbeitsverzeichnis jeden Testamentsvollstrecker platziert werden. Auf Dateipfade dieser Dateien in Executors kann über SparkFiles.get (fileName) zugegriffen werden.

Siehe SparkFiles.get Methode:

den absoluten Pfad einer Datei durch SparkContext.addFile() hinzugefügt Get.

Damit sollten Sie spark-submit wie folgt verwenden:

spark-submit --files fileNameHere /Users/anon/Documents/myUber.jar 

In einem allgemeinen Fall, wenn eine Datei in einer JAR-Datei ist, sollten Sie InputStream verwenden, um die Datei zuzugreifen (nicht als File direkt).

Der Code könnte wie folgt aussehen:

val content = scala.io.Source.fromInputStream(
    classOf[yourObject].getClassLoader.getResourceAsStream(yourFileNameHere) 

See Scala Source Objekt und ClassLoader.getResourceAsStream Methode Java.

+0

Ich habe dies versucht, aber die sc.newAPIHadoopFile erfordert einen Pfad und nicht eingegebene Stream – user1384205

+0

Antwort aktualisiert ... lass mich wissen, wie es funktioniert. –

Verwandte Themen