#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 .