Як завантажити локальний файл у sc.textFile, а не HDFS


100

Я стежу за великим уроком із іскри

тому я намагаюся в 46m: 00s завантажити, README.mdале не вдалося зробити те, що я роблю, це:

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

як я можу це завантажити README.md?

Відповіді:


177

Спробуйте чітко вказати sc.textFile("file:///path to the file/"). Помилка виникає при встановленні середовища Hadoop.

SparkContext.textFile внутрішньо викликає org.apache.hadoop.mapred.FileInputFormat.getSplits, який, у свою чергу, використовує, org.apache.hadoop.fs.getDefaultUriякщо схема відсутня. Цей метод читає параметр "fs.defaultFS" Hadoop conf. Якщо встановити змінну середовища HADOOP_CONF_DIR, параметр зазвичай встановлюється як "hdfs: // ..."; в іншому випадку "файл: //".


Чи знаєте ви, як це зробити з Java? Я не бачу методу. Дуже неприємно вважати, що існує непростий спосіб дати шлях до завантаження файлу з простої файлової системи.
Бред Елліс

відповідаючи собі. Існує --файл-комутатор, який ви передаєте за допомогою іскрової подачі. Таким чином, шлях до файлу може бути жорстко закодований або, однак, ваша конфігурація налаштована для програми, але ви також сигналізуєте про цей шлях. коли ви подаєте заявку, щоб виконавці могли бачити шлях.
Бред Елліс

24

відповідь Гонбе відмінна. Але все ж хочу зазначити, що file:///= ~/../../, ні $SPARK_HOME. Сподіваюся, це може заощадити час для новонароджених, як я.


4
file:///є кореневою папкою файлової системи, як це бачить виконавець JVM, а не на два рівні над домашньою папкою. Формат URI, визначений в RFC 8089, є file://hostname/absolute/path. У місцевому випадку hostnameкомпонент (повноваження) порожній.
Христо Ілієв

17

У той час як Spark підтримує завантаження файлів з локальної файлової системи, він вимагає, щоб файли були доступними однаковим шляхом у всіх вузлах кластера.

Деякі мережеві файлові системи, такі як NFS, AFS і NFS шар MapR, піддаються користувачеві як звичайна файлова система.

Якщо ваші дані вже є в одній із цих систем, ви можете використовувати їх як вхід, просто вказавши файл: // path; Іскра буде обробляти її до тих пір, поки файлова система змонтована однаковим шляхом на кожному вузлі. Кожен вузол повинен мати однаковий шлях

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

Якщо ваш файл вже не на всіх вузлах кластера, ви можете завантажити його локально на драйвер, не проходячи іскри, а потім зателефонувати паралельно, щоб розповсюдити вміст серед працівників

Не забудьте поставити файл: // спереду та використання "/" або "\" відповідно до ОС.


1
Чи існує спосіб, коли Spark автоматично копіює дані зі свого каталогу $ SPARK_HOME на всі обчислювальні вузли. Або вам це потрібно зробити вручну?
Маттіас

де іскровий вихідний код обробляє різні формати файлової системи?
Сахер Ахваль

12

Вам потрібно просто вказати шлях до файлу як "файл: /// каталог / файл"

приклад:

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

12

Увага:

Переконайтеся, що ви запускаєте іскру в локальному режимі, коли ви завантажуєте дані з local ( sc.textFile("file:///path to the file/")), або ви отримаєте помилку на зразок цієї Caused by: java.io.FileNotFoundException: File file:/data/sparkjob/config2.properties does not exist. Виконавці Becasuse, які працюють на різних працівників, не знайдуть цей файл у його локальному шляху.


11

Якщо файл знаходиться у головному вузлі Spark (наприклад, у випадку використання AWS EMR), то спочатку запустіть іскрову оболонку в локальному режимі.

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

Крім того, ви можете спочатку скопіювати файл у HDFS з локальної файлової системи, а потім запустити Spark у режимі за замовчуванням (наприклад, YARN у випадку використання AWS EMR) для читання файлу безпосередньо.

$ 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

У мене на робочому столі є файл під назвою NewsArticle.txt.

В Spark я набрав:

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

Мені потрібно було змінити всі \ на / характер для файлового шляху.

Щоб перевірити, чи спрацювало це, я набрав:

textFile.foreach(println)

Я запускаю Windows 7 і у мене не встановлено Hadoop.


5

Це було обговорено у списку розсилки для іскрових розсилок, і будь ласка, зверніться до цієї пошти .

Ви повинні hadoop fs -put <localsrc> ... <dst>скопіювати файл у hdfs:

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

5

Це сталося зі мною Spark 2.3 з Hadoop, також встановленим під загальним домашнім каталогом користувачів "hadoop". Оскільки і Spark, і Hadoop були встановлені в одній загальній директорії, Spark за замовчуванням розглядає схему як hdfsі починає шукати вхідні файли під hdfs, як зазначено fs.defaultFSв Hadoop's core-site.xml. У таких випадках нам потрібно чітко вказати схему як file:///<absoloute path to file>.


0

Це рішення цієї помилки, що я потрапляв на кластер Spark, який розміщується в Azure на кластері Windows:

Завантажте необроблений файл HVAC.csv, проаналізуйте його за допомогою функції

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

Ми використовуємо (wasb: ///), щоб дозволити Hadoop отримати доступ до файлу зберігання блогу azure, і три косої риси є відносним посиланням на папку контейнера, що працює.

Наприклад: Якщо шлях до вашого файлу до Провідника файлів на інформаційній панелі кластера Spark:

sflcc1 \ sflccspark1 \ HdiSamples \ SensorSampleData \ hvac

Тож описати шлях слід так: sflcc1: це ім'я облікового запису пам’яті. sflccspark: це ім'я вузла кластера.

Отже, ми посилаємось на поточне ім'я вузла кластера з відносними трьома косою рисою.

Сподіваюся, це допомагає.


0

Якщо ви намагаєтеся прочитати файл формату HDFS. намагається встановити шлях у SparkConf

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

Будь ласка, додайте до коду 4-пробіл / вкладку, щоб він був відформатований як код. З найкращими побажаннями
YakovL

0

Вам не доведеться використовувати sc.textFile (...) для перетворення локальних файлів у кадри даних. Один із варіантів - прочитати локальний файл за рядком та перетворити його в Spark Dataset. Ось приклад для машини Windows на 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);

Тепер ви можете використовувати кадр даних dataу своєму коді.


0

Я спробував наступне, і це працювало з моєї локальної файлової системи. В основному іскра може читати з локального, HDFS та AWS S3 шляху

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

-6

спробуйте

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
Жас

Чи можете ви зробити pwdна оболонці башbash-4.1#
Soumya Simanta

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

Це працює для мене на іскрі без hadoop / hdfs. Однак, схоже, це не працює для ОП, оскільки це дало їм дамп помилок.
Павло
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.