Yerel dosya HDFS yerine sc.textFile'da nasıl yüklenir


100

Harika kıvılcım eğitimini takip ediyorum

bu yüzden 46: 00'larda yüklemeye çalışıyorum README.mdama yaptığım şeyde başarısız oluyorum :

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

bunu nasıl yükleyebilirim README.md?

Yanıtlar:


177

Açıkça belirtmeyi deneyin sc.textFile("file:///path to the file/"). Hata, Hadoop ortamı ayarlandığında ortaya çıkar.

SparkContext.textFile dahili olarak çağırır org.apache.hadoop.mapred.FileInputFormat.getSplitsve bu org.apache.hadoop.fs.getDefaultUrida şema yoksa bunu kullanır . Bu yöntem, Hadoop conf'in "fs.defaultFS" parametresini okur. HADOOP_CONF_DIR ortam değişkenini ayarlarsanız, parametre genellikle "hdfs: // ..." olarak ayarlanır; aksi takdirde "file: //".


Bunu Java ile nasıl yapacağınızı biliyor musunuz? Bir yöntem görmüyorum. Basit bir dosya sisteminden dosya yüklemek için kolay bir yol vermenin kolay bir yolu olmaması çok sinir bozucu.
Brad Ellis

kendime cevap veriyorum. Spark-submit ile geçtiğiniz bir --file anahtarı vardır. Bu nedenle, dosya yolu sabit kodlanabilir veya ancak yapılandırmanız uygulama için ayarlanmış olabilir, ancak bu yolu da işaret edersiniz. Gönderdiğinizde, uygulayıcıların yolu görebilmesi için.
Brad Ellis

24

gonbe'nin cevabı mükemmel. Ama yine de bahsetmek istiyorum file:///= ~/../../değil $SPARK_HOME. Umarım bu benim gibi yeniler için biraz zaman kazandırır.


4
file:///JVM tarafından görüldüğü şekliyle dosya sisteminin kök klasörüdür, ana klasörün iki seviye üzerinde değil. Belirtilen URI biçimi RFC 8089 olduğunu file://hostname/absolute/path. Yerel durumda hostname(yetki) bileşeni boştur.
Hristo Iliev

18

Spark, yerel dosya sisteminden dosya yüklemeyi desteklerken, dosyaların kümenizdeki tüm düğümlerde aynı yolda bulunmasını gerektirir.

NFS, AFS ve MapR'ın NFS katmanı gibi bazı ağ dosya sistemleri, kullanıcıya normal bir dosya sistemi olarak sunulur.

Verileriniz zaten bu sistemlerden birindeyse, o zaman bir file: // yolu belirterek onu girdi olarak kullanabilirsiniz ; Spark, dosya sistemi her düğümde aynı yola bağlı olduğu sürece bunu halledecektir. Her düğümün aynı yola sahip olması gerekir

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

Dosyanız zaten kümedeki tüm düğümlerde değilse, Spark'a geçmeden yerel olarak sürücüye yükleyebilir ve ardından içeriği çalışanlara dağıtmak için paralelleştirme çağrısı yapabilirsiniz.

Başına file: // koymaya ve işletim sistemine göre "/" veya "\" kullanımına dikkat edin.


1
Spark'ın verileri $ SPARK_HOME dizininden tüm hesaplama düğümlerine otomatik olarak kopyalamasının bir yolu var mı? Yoksa bunu elle yapmanız mı gerekiyor?
Matthias

kıvılcım kaynak kodu farklı dosya sistemi formatlarını nerede işliyor?
Saher Ahwal

12

Dosyanın yolunu "file: /// dizin / dosya" olarak belirtmeniz yeterlidir.

misal:

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

12

Dikkat:

Local'den ( sc.textFile("file:///path to the file/")) veri yüklediğinizde spark'ı local modda çalıştırdığınızdan emin olun yoksa böyle bir hata alırsınız Caused by: java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist. Çünkü farklı çalışanlar üzerinde çalışan uygulayıcılar bu dosyayı yerel yolunda bulamayacaklar.


11

Dosya, Spark ana düğümünüzde bulunuyorsa (örneğin, AWS EMR kullanılması durumunda), önce spark-shell'i yerel modda başlatın.

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

Alternatif olarak, dosyayı önce yerel dosya sisteminden HDFS'ye kopyalayabilir ve ardından dosyayı doğrudan okumak için Spark'ı varsayılan modunda (örn. AWS EMR kullanılması durumunda YARN) başlatabilirsiniz.

$ 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

Masaüstümde NewsArticle.txt adında bir dosyam var.

Spark'ta şunu yazdım:

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

Dosya yolu için tüm \ karakterini / karakterini değiştirmem gerekiyordu.

Çalışıp çalışmadığını test etmek için şunu yazdım:

textFile.foreach(println)

Windows 7 çalıştırıyorum ve Hadoop yüklü değil.


5

Bu, kıvılcım posta listesinde tartışılmıştır ve lütfen bu postaya bakın .

hadoop fs -put <localsrc> ... <dst>Dosyayı şu konuma kopyalamanız gerekir hdfs:

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

5

Bu, Hadoop'un ortak "hadoop" kullanıcı ana dizini altında kurulu olduğu Spark 2.3 ile başıma geldi. Hem Spark hem de Hadoop aynı ortak dizin altında kurulduğundan, Spark varsayılan olarak şemayı olarak görür hdfsve giriş dosyalarını aramaya başlar tarafından belirtilen HDF'ler altında fs.defaultFSHadoop en içinde core-site.xml. Bu tür durumlarda, şemayı açıkça belirtmemiz gerekir file:///<absoloute path to file>.


0

Azure'da bir Windows kümesinde barındırılan Spark kümesinde aldığım bu hatanın çözümü budur:

Ham HVAC.csv dosyasını yükleyin, işlevi kullanarak ayrıştırın

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

Hadoop'un gök mavisi blog depolama dosyasına erişmesine izin vermek için (wasb: ///) kullanıyoruz ve üç eğik çizgi, çalışan düğüm konteyner klasörüne göreceli bir referanstır.

Örneğin: Spark küme panosundaki Dosya Gezgini'ndeki dosyanızın yolu şuysa:

sflcc1 \ sflccspark1 \ HdiSamples \ SensorSampleData \ hvac

Bu yüzden yolu açıklamak gerekirse: sflcc1: depolama hesabının adıdır. sflccspark: küme düğüm adıdır.

Bu nedenle, mevcut küme düğüm adına göreceli üç eğik çizgi ile başvuruyoruz.

Bu yardımcı olur umarım.


0

Dosya formunu HDFS okumaya çalışıyorsanız. SparkConf'ta yol ayarlamaya çalışmak

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

Kod olarak biçimlendirilmesi için lütfen kodunuza 4 boşluk / sekme girintisi ekleyin. Saygılarımızla
YakovL

0

Yerel dosyaları veri çerçevelerine dönüştürmek için sc.textFile (...) kullanmanız gerekmez. Seçeneklerden biri, yerel bir dosyayı satır satır okumak ve ardından onu Spark Veri Kümesine dönüştürmektir. Java'daki Windows makinesi için bir örnek:

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

Artık kodunuzda dataframe kullanabilirsiniz data.


0

Aşağıdakileri denedim ve yerel dosya sistemimde çalıştı .. Temel olarak spark yerel, HDFS ve AWS S3 yolundan okuyabilir

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

-6

Deneyin

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

pwdBash kabuğunda bir yapabilir misinbash-4.1#
Soumya Simanta

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

Bu benim için hadoop / hdfs olmadan spark üzerinde çalışıyor. Ancak, onlara bir hata dökümü verdiği için OP için işe yaramıyor gibi görünüyor.
Paul
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.