it-swarm.com.de

So laden Sie eine lokale Datei in sc.textFile anstelle von HDFS

Ich verfolge das tolle spark Tutorial

also versuche ich bei 46m: 00s, den README.md zu laden, scheitert jedoch daran,

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

wie kann ich diesen README.md laden?

84
Jas

Versuchen Sie explizit, sc.textFile("file:///path to the file/") anzugeben. Der Fehler tritt auf, wenn die Hadoop-Umgebung festgelegt ist. 

SparkContext.textFile ruft intern org.Apache.hadoop.mapred.FileInputFormat.getSplits auf, der wiederum org.Apache.hadoop.fs.getDefaultUri verwendet, wenn das Schema nicht vorhanden ist. Diese Methode liest den Parameter "fs.defaultFS" von Hadoop conf. Wenn Sie die Umgebungsvariable HADOOP_CONF_DIR setzen, wird der Parameter normalerweise auf "hdfs: // ..." gesetzt. ansonsten "file: //".

149
gonbe

gonbes Antwort ist hervorragend. Aber ich möchte noch erwähnen, dass file:/// = ~/../../, nicht $SPARK_HOME. Ich hoffe, das könnte Zeit für Neulinge wie mich sparen.

20
zaxliu

Sie müssen nur den Pfad der Datei als angeben "Datei: /// Verzeichnis/Datei"

beispiel:

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

Während Spark das Laden von Dateien aus dem lokalen Dateisystem unterstützt, müssen die Dateien auf allen Knoten in Ihrem Cluster unter demselben Pfad verfügbar sein. 

Einige Netzwerkdateisysteme wie NFS, AFS und NFS-Schicht von MapR werden dem Benutzer als normales Dateisystem zur Verfügung gestellt. 

Wenn sich Ihre Daten bereits in einem dieser Systeme befinden, können Sie sie als Eingabe verwenden, indem Sie einfach eine Datei angeben: // path; Spark wird damit umgehen, solange das Dateisystem auf jedem Knoten unter demselben Pfad eingehängt ist. Jeder Knoten muss den gleichen Pfad haben

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

Wenn sich Ihre Datei nicht bereits auf allen Knoten im Cluster befindet, können Sie sie lokal in den Treiber laden, ohne Spark zu durchlaufen, und dann Parallelize aufrufen, um den Inhalt an die Worker zu verteilen

Stellen Sie sicher, dass Sie die Datei: // voranstellen und die Verwendung von "/" oder "\" je nach Betriebssystem verwenden. 

9
Aklank Jain

Ich habe eine Datei namens NewsArticle.txt auf meinem Desktop. 

In Spark habe ich Folgendes eingegeben:

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

Ich musste alle\to/Zeichen für den Dateipfad ändern. 

Um zu testen, ob es funktioniert hat, habe ich Folgendes eingegeben:

textFile.foreach(println)

Ich verwende Windows 7 und habe kein Hadoop installiert. 

7
Gene

Dies wurde in der Spark-Mailingliste besprochen, und verweisen Sie auf diese mail .

Verwenden Sie hadoop fs -put <localsrc> ... <dst>, um die Datei in hdfs zu kopieren: 

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

Beachtung:

Stellen Sie sicher, dass Sie Spark im lokalen Modus ausführen, wenn Sie Daten von local laden (sc.textFile("file:///path to the file/")). Andernfalls wird ein Fehler wie folgt ausgegeben Caused by: Java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist. Wenn Executoren, die auf verschiedenen Workern ausgeführt werden, diese Datei nicht im lokalen Pfad finden.

5
Matiji66

Dies ist mir mit Spark 2.3 passiert, wobei Hadoop auch unter dem gemeinsamen "hadoop" -Benutzer-Home-Verzeichnis installiert ist. Da sowohl Spark als auch Hadoop unter demselben gemeinsamen Verzeichnis installiert wurden, betrachtet Spark standardmäßig das Schema als hdfs und sucht nach der Eingabe Dateien unter hdfs, wie von fs.defaultFS in Hadoops core-site.xml angegeben. In solchen Fällen müssen wir das Schema explizit als file:///<absoloute path to file> angeben.

4
Binita Bharati

Wenn sich die Datei in Ihrem Spark-Master-Knoten befindet (z. B. bei Verwendung von AWS EMR), starten Sie zuerst die Spark-Shell im lokalen Modus.

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

Alternativ können Sie die Datei zuerst aus dem lokalen Dateisystem nach HDFS kopieren und dann Spark im Standardmodus starten (z. B. YARN im Falle der Verwendung von AWS EMR), um die Datei direkt zu lesen.

$ 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

Wenn Sie versuchen, eine Datei von HDFS zu lesen. Einstellungspfad in SparkConf versuchen

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

Sie müssen nicht sc.textFile (...) verwenden, um lokale Dateien in Datenrahmen zu konvertieren. Eine der Optionen ist, eine lokale Datei Zeile für Zeile zu lesen und diese dann in Spark-Dataset umzuwandeln. Hier ist ein Beispiel für einen Windows-Computer 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);

Jetzt können Sie Dataframe data in Ihrem Code verwenden.

Ich habe Folgendes versucht und es funktionierte von meinem lokalen Dateisystem aus. Grundsätzlich kann Spark von lokalen, HDFS- und AWS S3-Pfaden lesen

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

Dies ist die Lösung für diesen Fehler, den ich in einem Spark-Cluster erhalten habe, der in Azure auf einem Windows-Cluster gehostet wird:

Laden Sie die unformatierte HVAC.csv-Datei und analysieren Sie sie mit der Funktion

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

Wir verwenden (wasb: ///), um Hadoop den Zugriff auf die Azure-Blogspeicherdatei zu ermöglichen. Die drei Schrägstriche sind ein relativer Verweis auf den Ordnerordner des aktiven Knotens.

Beispiel: Wenn der Pfad für Ihre Datei im Datei-Explorer im Spark-Cluster-Dashboard lautet:

sflcc1\sflccspark1\HdiSamples\SensorSampleData\hvac

Um den Pfad zu beschreiben, lautet der Pfad wie folgt: sflcc1: ist der Name des Speicherkontos. sflccspark: ist der Name des Clusterknotens.

Wir beziehen uns also auf den aktuellen Namen des Cluster-Knotens mit den relativen drei Schrägstrichen.

Hoffe das hilft.

0
Mostafa