Pyspark не может найти csv в docker

#docker #csv #pyspark

#docker #csv #pyspark

Вопрос:

Я новичок в Docker и pyspark…

У меня есть образ docker, который работает на python3.7-alpine. На данный момент я просто хочу прочитать csv-файл в spark dataframe

     spark = SparkSession. 
                    builder. 
                    appName("pythonfile"). 
                    master("spark://spark-master:7077"). 
                    config("spark.executor.memory", "512m"). 
                    getOrCreate()

    spark.read.option('header', True).csv('Crimes_2001_to_Present.csv')
    
 

но я получаю:

 java.io.FileNotFoundException: File file:/Crimes_2001_to_Present.csv does not exist
 

прежде чем я попытаюсь прочитать в csv, я распечатал свой текущий рабочий каталог и все папки и файлы в этом рабочем каталоге

 print(os.getcwd())
print(os.listdir())
 

и мой bash выводит, что файл csv находится в этом каталоге:

 pythonfile_1      | /
pythonfile_1      | ['home', 'srv', 'etc', 'opt', 'root', 'lib', 'mnt', 'usr', 'media', 'sys', 'dev', 
'sbin', 'bin', 'run', 'proc', 'tmp', 'var', 'data', '__pycache__', '.dockerenv', 
'Crimes_2001_to_Present.csv', 'Get_data.py', 'Main.py', 'Transform_data.py']
 

кто-нибудь знает — или дайте мне подсказку — почему pyspark не может найти этот csv?

 pyspark version = 3.0.1
spark_version = 3.0.1
hadoop_version = 2.7
 

Заранее спасибо 🙂

Комментарии:

1. Как вы запускаете приложение? Вы используете standalone или yarn? В зависимости от конфигурации вам нужно будет поместить файл туда, куда могут попасть исполнители (например, hdfs), а не только туда, где находится драйвер. Или просто попробуйте master("local[*]") , поскольку вы тестируете.

2. Я запускаю приложение в Dockerfile, связанном с созданным мной образом docker.. CMD [‘python’, ‘./Get_Data.py «] Я попробовал master (‘local [*]’), но он по-прежнему не может найти файл… Я даже пытался с помощью SparkContext

3. Это должно было сработать, тогда нам все еще не хватает информации. Можете ли вы добавить минимальный пример dockerfile, который воспроизводит ошибку?

Ответ №1:

Мое решение:

Мне пришлось использовать образ Ubuntu в качестве образа docker. Я установил на этот образ docker python pyspark и spark. Dockerfile:

 FROM ubuntu:latest


RUN apt-get update
RUN apt-get install -y openjdk-8-jdk
RUN apt-get update
RUN apt-get install git -y
RUN apt-get update
RUN apt-get install wget -y

COPY handler.py /
COPY Crimes.csv /

RUN wget 'https://downloads.apache.org/spark/spark-3.0.1/spark-3.0.1-bin- 
hadoop2.7.tgz'
RUN tar -xzvf spark-3.0.1-bin-hadoop2.7.tgz
RUN rm spark-3.0.1-bin-hadoop2.7.tgz

RUN apt-get install -y python3-pip python3-dev python3
RUN apt-get update

RUN pip3 install --upgrade pip

RUN ln -s /usr/bin/python3 /usr/bin/python

RUN pip install pyspark


RUN sed -i.py 's/r$//' handler.py
CMD ./spark-3.0.1-bin-hadoop2.7/bin/spark-submit --master spark://spark-master:7077 -- 
files Crimes.csv ./handler.py
 

Команда spark-submit с помощью —files загружает csv на главный и все подчиненные устройства.
После этого я смог прочитать в файле CSV следующий код:

 from pyspark.sql import SparkSession
from pyspark import SparkFiles

spark = SparkSession.builder.appName("pysparkapp").config("spark.executor.memory", 
"512m").getOrCreate()

sc = spark.sparkContext

df = sc.textFile(SparkFiles.get('Crimes.csv'))
 

SparkFiles.get(‘fileName’) получает путь из файла в системе spark, который был загружен с помощью команды spark-submit —files .