2015-10-03 1 views
1

Je copie une arborescence de fichiers de S3 vers HDFS avec S3DistCP dans une étape EMR initiale. hdfs dfs -ls -R hdfs:///data_dir montre les fichiers attendus, ce qui ressemble à quelque chose comme:Comment éviter les exceptions "Pas un fichier" lors de la lecture de HDFS avec étincelle

/data_dir/year=2015/ 
/data_dir/year=2015/month=01/ 
/data_dir/year=2015/month=01/day=01/ 
/data_dir/year=2015/month=01/day=01/data01.12345678 
/data_dir/year=2015/month=01/day=01/data02.12345678 
/data_dir/year=2015/month=01/day=01/data03.12345678 

Les « répertoires » sont répertoriés sous forme de fichiers de zéro octet. Je lance ensuite une étincelle qui doit lire ces fichiers. Le code de chargement est ainsi:

sqlctx.read.json('hdfs:///data_dir, schema=schema) 

Le travail échoue avec une exception java

java.io.IOException: Not a file: hdfs://10.159.123.38:9000/data_dir/year=2015 

J'ai eu (peut-être naïvement) suppose que étincelle récursive descendre le « arbre dir » et charger les fichiers de données. Si je pointe vers S3, il charge les données avec succès.

Ai-je mal compris HDFS? Puis-je demander à spark d'ignorer les fichiers de zéro octet? Puis-je utiliser S3DistCp pour aplatir l'arbre?

+0

Je ne peux pas dire pour API DataFrame, mais en Spark pur, c'est-à-dire avec RDD, vous pouvez charger tous les fichiers dans un répertoire avec 'SparkContext.wholeTextFiles (* path *)', voir [docs] (http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.SparkContext) pour plus d'informations . – mehmetminanc

+3

Que diriez-vous de "/data_dir/*/*/*/*.*"? De mon expérience spark ne charge pas les fichiers récursivement dans les sous-répertoires. – WoodChopper

+0

@WoodChopper Merci, vous avez raison. Le pilote HDFS ne descend pas récursivement la hiérarchie de fichiers. –

Répondre

4

Dans la configuration Hadoop pour le contexte d'allumage en cours, configurer lecture pour Hadoop InputFormat « récursive » avant d'obtenir le CTX sql

val hadoopConf = sparkCtx.hadoopConfiguration 
hadoopConf.set("mapreduce.input.fileinputformat.input.dir.recursive", "true") 

Cela donnera la solution pour « pas un fichier ». Ensuite, pour lire les fichiers multiples:

Hadoop job taking input files from multiple directories

ou union la liste des fichiers en simple dataframe:

Read multiple files from a directory using Spark

0

Les paramètres doivent être définis de cette manière en version 2.1.0 étincelle :

.set("spark.hive.mapred.supports.subdirectories","true") 
.set("spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive","true")