Pyspark 在 docker 中找不到 csv

Posted

技术标签:

【中文标题】Pyspark 在 docker 中找不到 csv【英文标题】:Pyspark can't find csv in docker 【发布时间】:2020-12-20 16:53:58 【问题描述】:

我是 Docker 和 pyspark 的新手...

我有一个在 python3.7-alpine 上运行的 docker 镜像。现在我只想将 csv 文件读入 spark 数据帧

    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

提前致谢:)

【问题讨论】:

你是如何启动应用程序的?您使用的是独立的还是纱线?根据配置,您必须将文件放置在执行程序可以访问的位置(例如 hdfs),而不仅仅是驱动程序所在的位置。或者只是尝试master("local[*]"),因为您正在测试。 我在 Dockerfile 中启动与我构建的 docker 映像相关的应用程序。 CMD ['python', './Get_Data.py'] 我试过 master('local[*]') 但是它仍然找不到文件...我什至尝试使用 SparkContext 这应该可行,那时我们仍然缺少信息。你能添加一个重现错误的最小 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

带有 --files 的 spark-submit 命令将 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 命令上传的。

【讨论】:

以上是关于Pyspark 在 docker 中找不到 csv的主要内容,如果未能解决你的问题,请参考以下文章

Docker - 在 docker 容器日志中找不到模块

Prisma 随机在 jenkins 中找不到 docker 图像

Docker,MySQL - 在 .sh 文件中找不到命令

在 docker php 容器中找不到 MySQLi

在当前项目和插件组中找不到前缀“docker”的插件

在容器中找不到 Docker“/usr/bin/php”