Pyspark - Загрузить файл: путь не существует

Я новичок в Spark. Я пытаюсь прочитать локальный CSV-файл в кластере EMR. Файл находится в: / home / hadoop /. Вот сценарий, который я использую:

spark = SparkSession \
    .builder \
    .appName("Protob Conversion to Parquet") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()\

df = spark.read.csv('/home/hadoop/observations_temp.csv, header=True)

Когда я запускаю скрипт, появляется следующее сообщение об ошибке:

pyspark.sql.utils.AnalysisException: u'Path не существует: hdfs: //ip-172-31-39-54.eu-west-1.compute.internal: 8020 / home / hadoop / monitoring_temp.csv

Затем я обнаружил, что мне нужно добавить file: // в путь к файлу, чтобы он мог прочитать файл локально:

df = spark.read.csv('file:///home/hadoop/observations_temp.csv, header=True)

Но на этот раз вышеупомянутый подход вызвал другую ошибку:

Потерянная задача 0.3 на этапе 0.0 (TID 3,
ip-172-31-41-81.eu-west-1.compute.internal, исполнитель 1): java.io.FileNotFoundException: File file: / home / hadoop /observations_temp.csv не существует

Я думаю, это потому, что расширение файла // просто читает файл локально и не распределяет файл по другим узлам.

Вы знаете, как я могу прочитать файл csv и сделать его доступным для всех других узлов?


person ebertbm    schedule 07.02.2017    source источник
comment
Кроме того, я обнаружил, что хранение файлов данных в S3 немного упростило жизнь после того, как вы предоставили кластеру доступ к своим корзинам. Я знаю, что это не решает вашу проблему напрямую, но подумал, что все равно упомяну.   -  person ImDarrenG    schedule 07.02.2017
comment
Да, он находится в экземпляре, который запускает драйвер (главный узел, если вы это имеете в виду)   -  person ebertbm    schedule 07.02.2017
comment
Исходный файл находится в S3, но мне нужно сначала загрузить его, чтобы иметь возможность обработать и преобразовать в другой формат. Результат - тот, который я пытаюсь прочитать.   -  person ebertbm    schedule 07.02.2017
comment
Как вы скачиваете файл?   -  person ImDarrenG    schedule 07.02.2017
comment
Я загружаю файл с помощью cli os.system (aws s3 cp s3: //raw_data/files/observation.protob / home / hadoop / mount_point / s3)). Качаю на другой том (из-за размера файла). Оттуда я могу прочитать его и сгенерировать выходной файл в / home / hadoop /   -  person ebertbm    schedule 07.02.2017
comment
Какой у вас менеджер кластера? Автономная Spark или YARN?   -  person mrsrinivas    schedule 07.02.2017


Ответы (3)


Вы правы в том, что ваш файл отсутствует на ваших рабочих узлах, поэтому возникает ошибка, которую вы получили.

Вот официальная документация Ref. Внешние наборы данных.

Если используется путь в локальной файловой системе, файл также должен быть доступен по тому же пути на рабочих узлах. Либо скопируйте файл для всех рабочих, либо используйте подключенную к сети общую файловую систему.

Итак, в основном у вас есть два решения:

Вы копируете свой файл в каждого работника перед тем, как приступить к работе;

Или вы загрузите в HDFS что-то вроде: (рекомендуемое решение)

hadoop fs -put localfile /user/hadoop/hadoopfile.csv

Теперь вы можете прочитать это с помощью:

df = spark.read.csv('/user/hadoop/hadoopfile.csv', header=True)

Похоже, вы тоже используете AWS S3. Вы всегда можете попробовать прочитать его прямо с S3, не загружая его. (конечно, с соответствующими полномочиями)

Некоторые предполагают, что тег --files, поставляемый с spark-submit, загружает файлы в каталоги выполнения. Я не рекомендую этот подход, если ваш CSV-файл не очень мал, но тогда вам не понадобится Spark.

В качестве альтернативы я бы остановился на HDFS (или любой распределенной файловой системе).

person eliasah    schedule 07.02.2017
comment
Поскольку ответу сейчас 2 года, я хотел бы знать, есть ли какие-либо обновления по этой проблеме? Это довольно странная и дешевая неисправность apache, из-за которой Spark не может получить доступ к файлам в случайных местах. Я имею в виду, что это за аналитический движок, который даже не может получить доступ к файлам должным образом? - person Amir; 22.08.2019

Я думаю, что вам не хватает явной настройки главного узла при инициализации SparkSession, попробуйте что-то вроде этого

spark = SparkSession \
    .builder \
    .master("local") \
    .appName("Protob Conversion to Parquet") \
    .config("spark.some.config.option", "some-value") \
    .getOrCreate()

а затем прочтите файл так же, как вы это делали

df = spark.read.csv('file:///home/hadoop/observations_temp.csv')

Это должно решить проблему...

person Nishant Sethi    schedule 19.11.2020
comment
Вы можете привести пример? - person lightbox142; 14.05.2021

Может быть полезно для тех, кто запускает zeppelin на Mac с помощью Docker.

  1. Скопируйте файлы в пользовательскую папку: /Users/my_user/zeppspark/myjson.txt

  2. docker run -p 8080: 8080 -v / Users / my_user / zeppspark: / zeppelin / notebook --rm --name zeppelin apache / zeppelin: 0.9.0

  3. На Zeppelin вы можете запустить это, чтобы получить свой файл:

% pyspark

json_data = sc.textFile ('/ zeppelin / notebook / myjson.txt')

person Impermanence    schedule 13.05.2021