【问题标题】:Pyspark can't find csv in dockerPyspark 在 docker 中找不到 csv
【发布时间】: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 示例吗?

标签: docker csv pyspark


【解决方案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 命令上传的。

【讨论】:

    猜你喜欢
    • 2022-09-29
    • 2017-03-02
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多