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的主要内容,如果未能解决你的问题,请参考以下文章