2017-05-16 2 views
2

J'ai un fichier d'entrée qui est délimité par des valeurs personnalisées et est passé à newAPIHadoopFile pour être converti en RDD [String]. Le fichier réside sous le répertoire de ressources du projet. Le code suivant fonctionne bien lorsqu'il est exécuté à partir de l'IDE Eclipse.Lecture du fichier d'entrée depuis le fichier jar lors de l'exécution de l'application à partir de spark-submit

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) 

Cependant quand je lance sur étincelle soumettre (avec un pot de uber) comme suit

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

Je reçois l'erreur ci-dessous.

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 

Toutes les entrées s'il vous plaît?

Répondre

1

Si le fichier est pour sc.newAPIHadoopFile qui nécessite un chemin d'accès pas un flux d'entrée, je recommanderais d'utiliser l'option --files de spark-submit.

--files FICHIERS liste séparés par une virgule des fichiers à placer dans le répertoire de travail de chaque exécuteur testamentaire. Les chemins d'accès aux fichiers de ces fichiers dans les exécuteurs sont accessibles via SparkFiles.get (nomfichier).

Voir méthode SparkFiles.get:

Obtenez le chemin absolu d'un fichier ajouté par SparkContext.addFile().

Avec cela, vous devez utiliser spark-submit comme suit:

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

Dans un cas général, si un fichier se trouve dans un fichier jar, vous devez utiliser InputStream pour accéder au fichier (non comme File directement).

Le code pourrait se présenter comme suit:

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

Voir objet de Scala Source et la méthode Java ClassLoader.getResourceAsStream.

+0

J'ai essayé cela mais le fichier sc.newAPIHadoopFile nécessite un chemin d'accès et non un flux d'entrée – user1384205

+0

Réponse mise à jour ... faites-moi savoir comment cela fonctionne. –