我们有多个 Databricks PySpark 作业,将 parquet 文件写入 Azure Blob 存储中的同一容器中。最近,我们有时会得到一个内容为 0 字节的输出文件,即使源数据在那里并且在重新运行时它会被正确保存。
我们怀疑该进程首先将输出保存到 _$azuretmpfolder$ 文件夹(该文件夹是在容器的顶部结构中自动创建的),并且当两个作业尝试同时执行此操作时,它会损坏其中一个输出文件。 (https://medium.com/@minfuyang/the-write-process-of-spark-azure-blob-writer-90b1bd373449中提到了类似的内容,但没有官方文档。)
如果我们的怀疑是正确的,有没有办法配置临时文件夹(以便每个作业使用不同的文件夹)?或者有谁遇到过类似的问题并找到解决方案吗?
所用代码片段:
(
spark_df.coalesce(1)
.write.mode("overwrite")
.option("header", "true")
.format("parquet")
.save(output_blob_folder)
)
我们通过分离 PySpark 作业解决了问题(以便它们不会并行运行)。从那时起,没有出现零字节的文件。这证实了我们对某些不需要的交互的怀疑,但我们仍然缺少解释(如果是由 _$azuretmpfolder$ 文件夹引起的)或正确的解决方案。