Azure Databricks 创建的 Azure ADLS Gen2 文件不继承 ACL

Azure ADLS Gen2 file created by Azure Databricks doesn't inherit ACL

我有一个正在将数据帧写入 ADLS Gen2 存储中的文件的数据块笔记本。

它创建一个临时文件夹,输出文件,然后将该文件复制到一个永久文件夹。由于某种原因,该文件没有正确继承 ACL。它创建的文件夹具有正确的 ACL。

笔记本代码:

#Get data into dataframe
df_export = spark.sql(SQL)

# OUTPUT file to temp directory coalesce(1) creates a single output data file
(df_export.coalesce(1).write.format("parquet")
.mode("overwrite")
.save(TempFolder))

#get the parquet file name.  It's always the last in the folder as the other files are created starting with _
file = dbutils.fs.ls(TempFolder)[-1][0]

#create permanent copy
dbutils.fs.cp(file,FullPath)

创建的临时文件夹显示相关帐户的以下内容。

文件显示以下内容。

还有面具。我不太熟悉面具,所以不确定这有什么不同。

文件夹的掩码权限显示

在文件中显示为

有谁知道为什么这不会从父文件夹继承 ACL?

我已收到 Microsoft 支持部门的回复,为我解决了这个问题。

原因:Databricks 存储的文件将服务主体作为具有权限 -rw-r--r-- 的文件的所有者,因此强制 ADLS 中其余批处理用户的有效权限从 rwx(目录权限)到r-- 这反过来会导致作业失败

解决方案:要解决此问题,我们需要将 Databricks 端的默认掩码 (022) 更改为自定义掩码 (000)。您可以在集群配置下的 Spark 配置设置中设置以下内容:spark.hadoop.fs.permissions.umask-mode 000

哇,太棒了!我正在寻找解决方案。直通身份验证现在可能是一个合适的解决方案。

我觉得这是这个古老的 hadoop 错误的一部分: https://issues.apache.org/jira/browse/HDFS-6962(在 hadoop-3 中解决,现在是 spark 3+ 的一部分)。

Spark 尝试在移动文件后设置 ACL,但失败了。首先,文件是在 tmp 目录中的其他地方创建的。 tmp-dir 权限默认继承 adls-behaviour。