我有一个 databricks 笔记本,正在将数据帧写入 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 bug 的一部分: https://issues.apache.org/jira/browse/HDFS-6962(在hadoop-3中解决,现在是spark 3+的一部分)。
Spark 在移动文件后尝试设置 ACL,但失败。首先,文件是在 tmp 目录中的其他位置创建的。 tmp-dir 权限默认由 adls-behaviour 继承。