2017-07-08 2 views
1

J'ai essayé de résoudre ce problème depuis longtemps maintenant ... je ne sais pas pourquoi j'obtiens ça? Pour info, je cours Spark sur un cluster sur AWS EMR Cluster. J'ai débogué et clairement voir le chemin de destination fourni ... quelque chose comme s3://my-bucket-name/. Le travail d'étincelle crée des fichiers orc et les écrit après avoir créé une partition comme ceci: date=2017-06-10. Des idées?AWS EMR Spark: Erreur lors de l'écriture sur S3 - IllegalArgumentException - Impossible de créer un chemin à partir d'une chaîne vide

17/07/08 22:48:31 ERROR ApplicationMaster: User class threw exception: java.lang.IllegalArgumentException: Can not create a Path from an empty string 
java.lang.IllegalArgumentException: Can not create a Path from an empty string 
    at org.apache.hadoop.fs.Path.checkPathArg(Path.java:126) 
    at org.apache.hadoop.fs.Path.<init>(Path.java:134) 
    at org.apache.hadoop.fs.Path.<init>(Path.java:93) 
    at org.apache.hadoop.fs.Path.suffix(Path.java:361) 
    at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand.deleteMatchingPartitions(InsertIntoHadoopFsRelationCommand.scala:138) 
    at org.apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand.run(InsertIntoHadoopFsRelationCommand.scala:82) 
Code

qui écrit orc:

dataframe.write 
    .partitionBy(partition) 
    .option("compression", ZLIB.toString) 
    .mode(SaveMode.Overwrite) 
    .orc(destination) 
+0

Est-il possible il y a une partition vide? –

+0

Les fichiers orc sont d'abord écrits dans un répertoire '_temporary', puis déplacés dans le répertoire principal. Je ne sais pas comment ce scénario surgirait! – iyerland

+0

Post le code, il pourrait aider à comprendre le problème –

Répondre

0

J'ai vu un problème similaire lors de l'écriture des fichiers de parquet à S3. Le problème est le SaveMode.Overwrite. Ce mode ne semble pas fonctionner correctement en combinaison avec S3. Essayez de supprimer toutes les données dans votre seau S3 my-bucket-name avant d'écrire dedans. Ensuite, votre code devrait fonctionner avec succès.

Pour supprimer tous les fichiers de votre seau my-bucket-name vous pouvez utiliser le code pyspark suivant:

# see https://www.quora.com/How-do-you-overwrite-the-output-directory-when-using-PySpark 
URI = sc._gateway.jvm.java.net.URI 
Path = sc._gateway.jvm.org.apache.hadoop.fs.Path 
FileSystem = sc._gateway.jvm.org.apache.hadoop.fs.FileSystem 

# see http://crazyslate.com/how-to-rename-hadoop-files-using-wildcards-while-patterns/ 
fs = FileSystem.get(URI("s3a://my-bucket-name"), sc._jsc.hadoopConfiguration()) 
file_status = fs.globStatus(Path("/*")) 
for status in file_status: 
    fs.delete(status.getPath(), True)