集群 Spark 在未授予 Notebook 数据访问权限的情况下无法通过 Notebook 写入 _delta_log?

问题描述 投票:0回答:1

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 的数据访问来处理写入。寻求解决此问题的见解或建议。任何指导将不胜感激。

java scala apache-spark pyspark jupyter-notebook
1个回答
0
投票

在 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
© www.soinside.com 2019 - 2024. All rights reserved.