TLDR: 为什么我的 Spark 集群无法完成对 Delta 表的写入,除非我的 Jupyter Notebook 能够访问数据位置,这与我的预期相反,Spark 应该独立于 Jupyter 的数据访问来处理写入?
我已经设置了一个连接到 Spark 集群的 PySpark Jupyter Notebook,其中 Spark 实例旨在执行对 Delta 表的写入。但是,我观察到,如果 Jupyter Notebook 无权访问数据位置,Spark 实例将无法完成写入。 回购以实现可重复性。
设置:
version: '3'
services:
spark:
image: com/data_lake_spark:latest
# Spark service configuration details...
spark-worker-1:
# Configuration details...
spark-worker-2:
# Configuration details...
jupyter:
image: com/data_lake_notebook:latest
# Jupyter Notebook service configuration details...
Spark 会话配置:
# Spark session setup...
命令代码:
# Write initial test data to Delta table
owner_df.write.format("delta").mode("overwrite").save(delta_output_path)
删除 Jupyter 对 Docker Compose 配置中的
/data
目录的访问权限会在尝试写入 Delta 表时导致 DeltaIOException。但是,提供对 /data
目录的访问权限可以成功写入。
错误信息:
Py4JJavaError: An error occurred while calling o56.save.
: org.apache.spark.sql.delta.DeltaIOException: [DELTA_CANNOT_CREATE_LOG_PATH] Cannot create file:/data/delta_table_of_dog_owners/_delta_log
at org.apache.spark.sql.delta.DeltaErrorsBase.cannotCreateLogPathException(DeltaErrors.scala:1534)
at org.apache.spark.sql.delta.DeltaErrorsBase.cannotCreateLogPathException$(DeltaErrors.scala:1533)
at org.apache.spark.sql.delta.DeltaErrors$.cannotCreateLogPathException(DeltaErrors.scala:3203)
at org.apache.spark.sql.delta.DeltaLog.createDirIfNotExists$1(DeltaLog.scala:443)
我希望 Spark 能够独立于 Jupyter 的数据访问来处理写入。寻求解决此问题的见解或建议。任何指导将不胜感激。
在 Docker Compose 文件中,当您定义卷时,Docker 会将该卷链接到容器内的特定路径。如果您没有为 Jupyter 笔记本设置与数据位置对齐的卷,笔记本将无法与文件系统的该部分进行交互。
因此 Spark 确实独立处理写入,但需要访问
/data
目录。正如您所正确提到的,如果您不使用通用文件系统显式链接容器,则写入将失败并显示 DeltaIOException
。
总而言之,当您运行涉及读取和写入数据的操作时,Spark 集群和 Jupyter Notebook 都需要访问相同的文件系统位置,否则会出现权限问题。
这个结构会失败:
services:
spark:
image: com/data_lake_spark:latest
# Spark service configuration details...
# Filesystem 1
jupyter:
image: com/data_lake_notebook:latest
# Jupyter Notebook service configuration details...
# Filesystem 2
在容器中添加以下体积应该可以解决问题,我认为您已经这样做了,因此不会失败。
services:
spark:
image: com/data_lake_spark:latest
# Spark service configuration details...
# Volume
volumes:
- ./data:/data
jupyter:
image: com/data_lake_notebook:latest
# Jupyter Notebook service configuration details...
# Volume
volumes:
- ./data:/data