Cara memuat file lokal di sc.textFile, alih-alih HDFS

100

Saya mengikuti tutorial percikan hebat

jadi saya mencoba pada 46m: 00s untuk memuat README.mdtetapi gagal untuk apa yang saya lakukan adalah ini:

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

bagaimana saya bisa memuat itu README.md?

Jas
sumber

Jawaban:

177

Coba tentukan secara eksplisit sc.textFile("file:///path to the file/"). Kesalahan terjadi saat lingkungan Hadoop disetel.

SparkContext.textFile memanggil secara internal org.apache.hadoop.mapred.FileInputFormat.getSplits, yang akan digunakan org.apache.hadoop.fs.getDefaultUrijika skema tidak ada. Metode ini membaca parameter "fs.defaultFS" dari konfigurasi Hadoop. Jika Anda menyetel variabel lingkungan HADOOP_CONF_DIR, parameter biasanya disetel sebagai "hdfs: // ..."; sebaliknya "file: //".

suztomo.dll
sumber
Apakah Anda kebetulan tahu cara melakukan ini dengan Java? Saya tidak melihat metode. Merasa sangat frustasi karena tidak ada cara mudah untuk memberikan jalur untuk memuat file dari sistem file sederhana.
Brad Ellis
menjawab diriku sendiri. Ada tombol --file yang Anda lewati dengan spark-submit. Jadi, jalur file dapat dikodekan keras atau bagaimanapun konfigurasi Anda disiapkan untuk aplikasi, tetapi Anda juga memberi sinyal jalur itu. saat Anda mengirimkan sehingga pelaksana dapat melihat jalurnya.
Brad Ellis
24

Jawaban gonbe luar biasa. Tapi tetap saya ingin menyebutkan bahwa file:///= ~/../../, tidak $SPARK_HOME. Semoga ini bisa menghemat waktu untuk pemula seperti saya.

zaxliu
sumber
4
file:///adalah folder root dari sistem file seperti yang terlihat oleh JVM yang menjalankan, bukan dua tingkat di atas folder utama. Format URI seperti yang ditentukan dalam RFC 8089 adalah file://hostname/absolute/path. Dalam kasus lokal, hostnamekomponen (otoritas) kosong.
Hristo Iliev
17

Sementara Spark mendukung pemuatan file dari sistem file lokal, itu mengharuskan file tersedia di jalur yang sama di semua node di cluster Anda.

Beberapa sistem berkas jaringan, seperti NFS, AFS, dan lapisan NFS MapR, diekspos ke pengguna sebagai sistem berkas biasa.

Jika data Anda sudah ada di salah satu sistem ini, Anda dapat menggunakannya sebagai input hanya dengan menentukan file: // path; Spark akan menanganinya selama filesystem dipasang di jalur yang sama pada setiap node. Setiap node harus memiliki jalur yang sama

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

Jika file Anda belum ada di semua node dalam cluster, Anda dapat memuatnya secara lokal di driver tanpa melalui Spark lalu memanggil parallelize untuk mendistribusikan konten ke pekerja

Berhati-hatilah untuk meletakkan file: // di depan dan gunakan "/" atau "\" sesuai dengan OS.

Aklank Jain
sumber
1
Apakah ada cara Spark akan secara otomatis menyalin data dari direktori $ SPARK_HOME ke semua node komputasi. Atau apakah Anda perlu melakukannya secara manual?
Matthias
di mana kode sumber spark menangani format sistem file yang berbeda?
Saher Ahwal
12

Anda hanya perlu menentukan jalur file sebagai "file: /// directory / file"

contoh:

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

Perhatian:

Pastikan Anda menjalankan spark dalam mode lokal ketika Anda memuat data dari local ( sc.textFile("file:///path to the file/")) atau Anda akan mendapatkan kesalahan seperti ini Caused by: java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist. Karena pelaksana yang dijalankan pada pekerja yang berbeda tidak akan menemukan file ini di jalur lokalnya.

Matiji66
sumber
11

Jika file terletak di node master Spark Anda (misalnya, jika menggunakan AWS EMR), luncurkan spark-shell dalam mode lokal terlebih dahulu.

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

Sebagai alternatif, Anda dapat menyalin file ke HDFS dari sistem file lokal terlebih dahulu dan kemudian meluncurkan Spark dalam mode defaultnya (misalnya, YARN jika menggunakan AWS EMR) untuk membaca file secara langsung.

$ 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|
+----+-------+
Joarder Kamal
sumber
9

Saya memiliki file bernama NewsArticle.txt di Desktop saya.

Di Spark, saya mengetik:

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

Saya perlu mengubah semua karakter \ ke / untuk jalur file.

Untuk menguji apakah itu berhasil, saya mengetik:

textFile.foreach(println)

Saya menjalankan Windows 7 dan saya belum menginstal Hadoop.

Gen
sumber
5

Ini telah dibahas dalam milis spark, dan silakan merujuk email ini .

Anda harus menggunakan hadoop fs -put <localsrc> ... <dst>salin file ke hdfs:

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

Ini terjadi pada saya dengan Spark 2.3 dengan Hadoop juga diinstal di bawah direktori home pengguna "hadoop". Karena Spark dan Hadoop diinstal di bawah direktori umum yang sama, Spark secara default menganggap skema sebagai hdfs, dan mulai mencari file input di bawah hdfs seperti yang ditentukan oleh fs.defaultFSdi Hadoop's core-site.xml. Dalam kasus seperti itu, kita perlu secara eksplisit menentukan skema sebagai file:///<absoloute path to file>.

Binita Bharati
sumber
0

Ini adalah solusi untuk kesalahan ini yang saya dapatkan di cluster Spark yang di-hosting di Azure di cluster windows:

Muat file HVAC.csv mentah, parsing menggunakan fungsi

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

Kami menggunakan (wasb: ///) untuk mengizinkan Hadoop mengakses file penyimpanan blog biru dan tiga garis miring adalah referensi relatif ke folder wadah node yang sedang berjalan.

Misalnya: Jika jalur untuk file Anda di File Explorer di dasbor cluster Spark adalah:

sflcc1 \ sflccspark1 \ HdiSamples \ SensorSampleData \ hvac

Jadi untuk menggambarkan path tersebut adalah sebagai berikut: sflcc1: adalah nama dari akun penyimpanan tersebut. sflccspark: adalah nama node cluster.

Jadi kita mengacu pada nama node cluster saat ini dengan relatif tiga garis miring.

Semoga ini membantu.

Mostafa
sumber
0

Jika Anda mencoba membaca bentuk file HDFS. mencoba mengatur jalur di SparkConf

 val conf = new SparkConf().setMaster("local[*]").setAppName("HDFSFileReader")
 conf.set("fs.defaultFS", "hdfs://hostname:9000")
Viyaan Jhiingade
sumber
Harap tambahkan indentasi 4 spasi / tab ke kode Anda sehingga dapat diformat sebagai kode. Salam
YakovL
0

Anda tidak harus menggunakan sc.textFile (...) untuk mengubah file lokal menjadi dataframe. Salah satu opsinya adalah, membaca file lokal baris demi baris dan kemudian mengubahnya menjadi Set Data Spark. Berikut adalah contoh untuk mesin Windows di 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);

Sekarang Anda dapat menggunakan dataframe datadalam kode Anda.

Andrushenko Alexander
sumber
0

Saya mencoba yang berikut ini dan berhasil dari sistem file lokal saya .. Pada dasarnya percikan dapat membaca dari jalur lokal, HDFS dan AWS S3

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

mencoba

val f = sc.textFile("./README.md")
Soumya Simanta
sumber
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
Bisakah Anda melakukan pwdpada bash shellbash-4.1#
Soumya Simanta
bash-4.1 # pwd /usr/local/spark-1.1.0-bin-hadoop2.4
Jas
Ini bekerja untuk saya pada percikan tanpa hadoop / hdfs. Namun, tampaknya tidak berfungsi untuk OP, karena memberi mereka dump kesalahan.
Paul