web-dev-qa-db-fra.com

Comment charger un fichier local dans sc.textFile au lieu de HDFS

Je suis le grand tutoriel spark

donc j'essaye à 46m: 00s de charger le README.md mais échoue à ce que je fais est la suivante:

$ Sudo docker run -i -t -h sandbox sequenceiq/spark:1.1.0 /etc/bootstrap.sh -bash
bash-4.1# cd /usr/local/spark-1.1.0-bin-hadoop2.4
bash-4.1# ls README.md
README.md
bash-4.1# ./bin/spark-Shell
scala> val f = sc.textFile("README.md")
14/12/04 12:11:14 INFO storage.MemoryStore: ensureFreeSpace(164073) called with curMem=0, maxMem=278302556
14/12/04 12:11:14 INFO storage.MemoryStore: Block broadcast_0 stored as values in memory (estimated size 160.2 KB, free 265.3 MB)
f: org.Apache.spark.rdd.RDD[String] = README.md MappedRDD[1] at textFile at <console>:12
scala> val wc = f.flatMap(l => l.split(" ")).map(Word => (Word, 1)).reduceByKey(_ + _)
org.Apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://sandbox:9000/user/root/README.md
    at org.Apache.hadoop.mapred.FileInputFormat.singleThreadedListStatus(FileInputFormat.Java:285)

comment puis-je charger ce README.md?

84
Jas

Essayez de spécifier explicitement sc.textFile("file:///path to the file/"). L'erreur se produit lorsque l'environnement Hadoop est défini. 

SparkContext.textFile appelle en interne org.Apache.hadoop.mapred.FileInputFormat.getSplits, qui à son tour utilise org.Apache.hadoop.fs.getDefaultUri si le schéma est absent. Cette méthode lit le paramètre "fs.defaultFS" de Hadoop conf. Si vous définissez la variable d'environnement HADOOP_CONF_DIR, le paramètre est généralement défini sur "hdfs: // ..."; sinon "fichier: //".

149
gonbe

la réponse de Gonbe est excellente. Mais je tiens tout de même à mentionner que file:/// = ~/../../, pas $SPARK_HOME. J'espère que cela pourrait économiser du temps pour les newbs comme moi.

20
zaxliu

Il vous suffit de spécifier le chemin du fichier en tant que "fichier: /// répertoire/fichier"

exemple:

val textFile = sc.textFile("file:///usr/local/spark/README.md")
11
Hamdi Charef

Bien que Spark prenne en charge le chargement de fichiers à partir du système de fichiers local, les fichiers doivent être disponibles sur le même chemin sur tous les nœuds de votre cluster. 

Certains systèmes de fichiers réseau, tels que NFS, AFS et la couche NFS de MapR, sont exposés à l’utilisateur sous forme de système de fichiers classique. 

Si vos données se trouvent déjà dans l'un de ces systèmes, vous pouvez les utiliser comme entrée en spécifiant simplement un fichier file: // path; Spark le gérera tant que le système de fichiers sera monté sur le même chemin sur chaque nœud. Chaque nœud doit avoir le même chemin

 rdd = sc.textFile("file:///path/to/file")

Si votre fichier ne figure pas déjà sur tous les nœuds du cluster, vous pouvez le charger localement sur le pilote sans passer par Spark, puis appeler paralléliser pour distribuer le contenu aux opérateurs.

Prenez soin de mettre le fichier: // devant et l’utilisation de "/" ou "\" selon le système d’exploitation. 

9
Aklank Jain

J'ai un fichier appelé NewsArticle.txt sur mon bureau. 

Dans Spark, j'ai tapé:

val textFile= sc.textFile(“file:///C:/Users/582767/Desktop/NewsArticle.txt”)

Je devais changer tout le caractère\to/pour le chemin du fichier. 

Pour vérifier si cela fonctionnait, j'ai tapé:

textFile.foreach(println)

J'utilise Windows 7 et je n'ai pas installé Hadoop. 

7
Gene

Cela a été discuté dans la liste de diffusion spark, et s'il vous plaît référez-vous ceci mail .

Vous devriez utiliser hadoop fs -put <localsrc> ... <dst> copier le fichier dans hdfs

${HADOOP_COMMON_HOME}/bin/hadoop fs -put /path/to/README.md README.md
5
Nan Xiao

Attention:

Assurez-vous que vous exécutez spark en mode local lorsque vous chargez des données à partir de (sc.textFile("file:///path to the file/")), sinon vous obtiendrez une erreur comme celle-ci Caused by: Java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist. Les exécuteurs de Becasuse qui s'exécutent sur différents travailleurs ne trouveront pas ce fichier dans son chemin d'accès local.

5
Matiji66

C’est ce qui m’est arrivé avec Spark 2.3 avec Hadoop également installé dans le répertoire de base commun de l’utilisateur "hadoop". Depuis que Spark et Hadoop ont été installés dans le même répertoire commun, Spark considère par défaut le schéma comme étant hdfs et commence à fichiers sous hdfs comme spécifié par fs.defaultFS dans le core-site.xml de Hadoop. Dans de tels cas, nous devons explicitement spécifier le schéma en tant que file:///<absoloute path to file>.

4
Binita Bharati

Si le fichier se trouve dans votre nœud maître Spark (par exemple, si vous utilisez AWS EMR), lancez d'abord spark-Shell en mode local.

$ spark-Shell --master=local
scala> val df = spark.read.json("file:///usr/lib/spark/examples/src/main/resources/people.json")
df: org.Apache.spark.sql.DataFrame = [age: bigint, name: string]

scala> df.show()
+----+-------+
| age|   name|
+----+-------+
|null|Michael|
|  30|   Andy|
|  19| Justin|
+----+-------+

Sinon, vous pouvez d'abord copier le fichier sur HDFS à partir du système de fichiers local, puis lancer Spark dans son mode par défaut (par exemple, YARN en cas d'utilisation d'AWS EMR) pour lire le fichier directement.

$ hdfs dfs -mkdir -p /hdfs/spark/examples
$ hadoop fs -put /usr/lib/spark/examples/src/main/resources/people.json /hdfs/spark/examples
$ hadoop fs -ls /hdfs/spark/examples
Found 1 items
-rw-r--r--   1 hadoop hadoop         73 2017-05-01 00:49 /hdfs/spark/examples/people.json

$ spark-Shell
scala> val df = spark.read.json("/hdfs/spark/examples/people.json")
df: org.Apache.spark.sql.DataFrame = [age: bigint, name: string]

scala> df.show()
+----+-------+
| age|   name|
+----+-------+
|null|Michael|
|  30|   Andy|
|  19| Justin|
+----+-------+
3
Joarder Kamal

Si vous essayez de lire le fichier depuis HDFS. essayer de définir le chemin dans SparkConf

 val conf = new SparkConf().setMaster("local[*]").setAppName("HDFSFileReader")
 conf.set("fs.defaultFS", "hdfs://hostname:9000")
0
Viyaan Jhiingade

Vous n'êtes pas obligé d'utiliser sc.textFile (...) pour convertir des fichiers locaux en images. L'une des options consiste à lire un fichier local ligne par ligne, puis à le transformer en jeu de données Spark. Voici un exemple pour une machine Windows en Java:

StructType schemata = DataTypes.createStructType(
            new StructField[]{
                    createStructField("COL1", StringType, false),
                    createStructField("COL2", StringType, false),
                    ...
            }
    );

String separator = ";";
String filePath = "C:\\work\\myProj\\myFile.csv";
SparkContext sparkContext = new SparkContext(new SparkConf().setAppName("MyApp").setMaster("local"));
JavaSparkContext jsc = new JavaSparkContext (sparkContext );
SQLContext sqlContext = SQLContext.getOrCreate(sparkContext );

List<String[]> result = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
    String line;
    while ((line = br.readLine()) != null) {
      String[] vals = line.split(separator);
      result.add(vals);
    }
 } catch (Exception ex) {
       System.out.println(ex.getMessage());
       throw new RuntimeException(ex);
  }
  JavaRDD<String[]> jRdd = jsc.parallelize(result);
  JavaRDD<Row> jRowRdd = jRdd .map(RowFactory::create);
  Dataset<Row> data = sqlContext.createDataFrame(jRowRdd, schemata);

Vous pouvez maintenant utiliser dataframe data dans votre code.

0

J'ai essayé ce qui suit et cela a fonctionné à partir de mon système de fichiers local. Essentiellement, spark peut lire à partir du chemin d'accès local, HDFS et AWS S3

listrdd=sc.textFile("file:////home/cloudera/Downloads/master-data/retail_db/products")
0
cloudguru

Voici la solution à cette erreur liée au cluster Spark hébergé dans Azure sur un cluster Windows:

Chargez le fichier HVAC.csv brut, analysez-le à l'aide de la fonction

data = sc.textFile("wasb:///HdiSamples/SensorSampleData/hvac/HVAC.csv")

Nous utilisons (wasb: ///) pour permettre à Hadoop d'accéder au fichier de stockage du blog Azure. Les trois barres obliques constituent une référence relative au dossier de conteneur du noeud en cours d'exécution.

Par exemple: Si le chemin d'accès à votre fichier dans l'Explorateur de fichiers du tableau de bord du cluster Spark est:

sflcc1\sflccspark1\HdiSamples\SensorSampleData\hvac

Pour décrire le chemin, procédez comme suit: sflcc1: est le nom du compte de stockage. sflccspark: est le nom du nœud du cluster.

Nous nous référons donc au nom du nœud de cluster actuel avec les trois barres obliques relatives.

J'espère que cela t'aides.

0
Mostafa