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

Sto seguendo il grande tutorial di scintilla

quindi sto provando a 46m: 00s per caricare README.md ma 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 :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 caricare quel file README.md ?

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

SparkContext.textFile chiama internamente org.apache.hadoop.mapred.FileInputFormat.getSplits , che a sua volta utilizza org.apache.hadoop.fs.getDefaultUri se lo schema è assente. Questo metodo legge il parametro “fs.defaultFS” di Hadoop conf. Se si imposta la variabile di ambiente HADOOP_CONF_DIR, il parametro viene solitamente impostato come “hdfs: // …”; altrimenti “file: //”.

la risposta di gonbe è eccellente. Ma ancora voglio menzionare quel file:/// = ~/../../ , non $SPARK_HOME . Spero che questo possa risparmiare un po ‘di tempo per newb come me.

È sufficiente specificare il percorso del file come “file: /// directory / file”

esempio:

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

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 tutti i \ to / character per il percorso file.

Per verificare se ha funzionato, ho digitato:

 textFile.foreach(println) 

Sto usando Windows 7 e non ho installato Hadoop.

Mentre Spark supporta il caricamento di file dal filesystem locale, richiede che i file siano disponibili sullo stesso percorso su tutti i nodes del cluster.

Alcuni file system di rete, come NFS, AFS e il livello NFS di MapR, sono esposti all’utente come un normale file system.

Se i tuoi dati sono già in uno di questi sistemi, puoi utilizzarli come input semplicemente specificando un file: // path; Spark lo manterrà finché il filesystem sarà montato sullo stesso percorso su ciascun nodo. Ogni nodo deve avere lo stesso percorso

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

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

Fai attenzione a mettere il file: // in primo piano e l’uso di “/” o “\” in base al sistema operativo.

Questo è stato discusso in mailing list spark, e si prega di fare riferimento a questa mail .

Dovresti usare hadoop fs -put ... copia il file in hdfs :

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

Se il file si trova nel tuo nodo master Spark (ad esempio, in caso di utilizzo di AWS EMS), avviare prima la shell spark 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, è ansible prima copiare il file su HDFS dal file system locale e quindi avviare Spark nella sua 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| +----+-------+ 

Attenzione:

Assicurarsi di eseguire la scintilla in modalità locale quando si caricano i dati da locale ( sc.textFile("file:///path to the file/") ) o si otterrà un errore come questo Caused by: java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist . Gli esecutori di Becasuse che girano su diversi lavoratori non troveranno questo file nel suo percorso locale.

Questo è successo a me con Spark 2.3 con Hadoop installato anche nella comune directory home “hadoop”. Sia Spark che Hadoop sono stati installati sotto la stessa directory comune, Spark considera lo schema come hdfs , e inizia a cercare l’input file in hdf come specificato da fs.defaultFS in core-site.xml di Hadoop. In questi casi, è necessario specificare esplicitamente lo schema come file:/// .

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

Carica il file HVAC.csv non elaborato, analizzalo utilizzando la funzione

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

Utilizziamo (wasb: ///) per consentire a Hadoop di accedere al file di archiviazione del blog in azure e le tre barre rappresentano 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 è la 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 tre barre relative.

Spero che questo ti aiuti.

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

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

provare

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