Come caricare il file locale in sc.textFile, invece di HDFS


100

Sto seguendo il fantastico tutorial su Spark

quindi sto provando a 46m: 00s per caricare il README.mdma non riesco a quello che sto facendo è questo:

$ 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)

come posso caricarlo README.md?

Risposte:


177

Prova a specificare esplicitamente sc.textFile("file:///path to the file/"). L'errore si verifica quando è impostato l'ambiente Hadoop.

SparkContext.textFile chiama internamente org.apache.hadoop.mapred.FileInputFormat.getSplits, che a sua volta utilizza org.apache.hadoop.fs.getDefaultUrise lo schema è assente. Questo metodo legge il parametro "fs.defaultFS" di Hadoop conf. Se imposti la variabile d'ambiente HADOOP_CONF_DIR, il parametro è solitamente impostato come "hdfs: // ..."; altrimenti "file: //".


Ti capita di sapere come farlo con Java? Non vedo un metodo. Trovo molto frustrante che non ci sia un modo semplice per fornire un percorso per caricare un file da un semplice file system.
Brad Ellis

rispondendomi. C'è un interruttore --file che passi con lo spark-submit. Quindi, il percorso del file può essere hardcoded o comunque la tua configurazione è impostata per l'app, ma tu segnali anche quel percorso. quando si invia in modo che gli esecutori possano vedere il percorso.
Brad Ellis

24

la risposta di gonbe è eccellente. Ma voglio ancora menzionarlo file:///= ~/../../, no $SPARK_HOME. Spero che questo possa far risparmiare tempo ai neofiti come me.


4
file:///è la cartella radice del filesystem come vista dalla JVM in esecuzione, non due livelli sopra la cartella home. Il formato URI come specificato in RFC 8089 è file://hostname/absolute/path. Nel caso locale il hostnamecomponente (autorità) è vuoto.
Hristo Iliev

17

Sebbene Spark supporti il ​​caricamento di file dal file system locale, richiede che i file siano disponibili nello stesso percorso su tutti i nodi del cluster.

Alcuni filesystem di rete, come NFS, AFS e il livello NFS di MapR, sono esposti all'utente come un normale filesystem.

Se i tuoi dati sono già in uno di questi sistemi, puoi utilizzarli come input specificando semplicemente un file: // percorso; Spark lo gestirà fintanto che il filesystem è montato sullo stesso percorso su ogni nodo. Ogni nodo deve avere lo stesso percorso

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

Se il tuo file non è già su tutti i nodi del cluster, puoi caricarlo localmente sul driver senza passare da Spark e quindi chiamare parallelize per distribuire il contenuto ai lavoratori

Fare attenzione a mettere file: // davanti e usare "/" o "\" a seconda del sistema operativo.


1
C'è un modo in cui Spark copierà automaticamente i dati dalla sua directory $ SPARK_HOME a tutti i nodi di calcolo. O hai bisogno di farlo manualmente?
Matthias

dov'è il codice sorgente Spark che gestisce diversi formati di file system?
Saher Ahwal

12

Devi solo specificare il percorso del file come "file: /// directory / file"

esempio:

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

12

Attenzione:

Assicurati di eseguire spark in modalità locale quando carichi i dati da local ( sc.textFile("file:///path to the file/")) o otterrai un errore come questo Caused by: java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist. Poiché gli esecutori utilizzati su diversi worker non troveranno questo file nel suo percorso locale.


11

Se il file si trova nel tuo nodo master Spark (ad esempio, in caso di utilizzo di AWS EMR), avvia prima spark-shell in modalità locale.

$ 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|
+----+-------+

In alternativa, puoi prima copiare il file in HDFS dal file system locale e quindi avviare Spark nella modalità predefinita (ad esempio, YARN in caso di utilizzo di AWS EMR) per leggere direttamente il file.

$ 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|
+----+-------+

9

Ho un file chiamato NewsArticle.txt sul mio desktop.

In Spark, ho digitato:

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

Avevo bisogno di cambiare tutto il carattere \ in / per il percorso file.

Per verificare se ha funzionato, ho digitato:

textFile.foreach(println)

Uso Windows 7 e non ho installato Hadoop.


5

Questo è stato discusso nella mailing list spark, e per favore fai riferimento a questa mail .

Dovresti usare hadoop fs -put <localsrc> ... <dst>copia il file in hdfs:

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

5

Questo mi è successo con Spark 2.3 con Hadoop installato anche nella directory home dell'utente comune "hadoop". Poiché sia ​​Spark che Hadoop sono stati installati nella stessa directory comune, Spark per impostazione predefinita considera lo schema come hdfse inizia a cercare i file di input sotto hdf come specificato da fs.defaultFSin Hadoop core-site.xml. In tali casi, è necessario specificare esplicitamente lo schema come file:///<absoloute path to file>.


0

Questa è la soluzione per questo errore che stavo ottenendo sul cluster Spark ospitato in Azure su un cluster Windows:

Carica il file HVAC.csv grezzo, analizzalo utilizzando la funzione

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

Usiamo (wasb: ///) per consentire a Hadoop di accedere al file di archiviazione del blog di Azure e le tre barre sono un riferimento relativo alla cartella del contenitore del nodo in esecuzione.

Ad esempio: se il percorso del file in Esplora file nel dashboard del cluster Spark è:

sflcc1 \ sflccspark1 \ HdiSamples \ SensorSampleData \ HVAC

Quindi per descrivere il percorso è il seguente: sflcc1: è il nome dell'account di archiviazione. sflccspark: è il nome del nodo del cluster.

Quindi ci riferiamo al nome del nodo del cluster corrente con le relative tre barre.

Spero che questo ti aiuti.


0

Se stai cercando di leggere il file da HDFS. cercando di impostare il percorso in SparkConf

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

Aggiungi un rientro di 4 spazi / tabulazioni al codice in modo che venga formattato come codice. Cordiali saluti
YakovL

0

Non è necessario utilizzare sc.textFile (...) per convertire i file locali in dataframe. Una delle opzioni è leggere un file locale riga per riga e quindi trasformarlo in Spark Dataset. Ecco un esempio per la macchina Windows in 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);

Ora puoi usare dataframe datanel tuo codice.


0

Ho provato quanto segue e ha funzionato dal mio file system locale .. Fondamentalmente Spark può leggere dal percorso locale, HDFS e AWS S3

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

-6

provare

val f = sc.textFile("./README.md")

scala> val f = sc.textFile("./README.md") 14/12/04 12:54:33 INFO storage.MemoryStore: ensureFreeSpace(81443) called with curMem=164073, maxMem=278302556 14/12/04 12:54:33 INFO storage.MemoryStore: Block broadcast_1 stored as values in memory (estimated size 79.5 KB, free 265.2 MB) f: org.apache.spark.rdd.RDD[String] = ./README.md MappedRDD[5] 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
Jas il

Puoi fare un pwdcolpo di bash-4.1#
fulmine

bash-4.1 # pwd /usr/local/spark-1.1.0-bin-hadoop2.4
Jas

Questo funziona per me su Spark senza hadoop / hdfs. Tuttavia, non sembra funzionare per l'OP, poiché ha fornito loro un dump degli errori.
Paul
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.