spark覆盖保存模式是原子模式吗?

o75abkj4  于 2023-03-30  发布在  Apache
关注(0)|答案(3)|浏览(196)

使用spark overwrite模式写dataset会删除分区中的旧文件并写入新数据。这个过程是原子的吗?如果作业在覆盖数据时失败,spark会恢复分区中的旧文件吗?

oaxa6hgo

oaxa6hgo1#

根据this在databricks中的帖子不是(emphasys我的):
有时候,以原子方式覆盖一组现有文件是很有用的。现在,Spark通过首先删除数据集,然后执行产生新数据的作业来实现覆盖。这会中断所有当前读取器,并且不是容错的。使用事务提交,可以通过在提交时将文件标记为已删除,以原子方式“逻辑删除”文件
但它们也提供了实现原子覆盖的替代方案

rsaldnfx

rsaldnfx2#

覆盖操作是原子性的,因为它首先删除旧数据集,然后生成新数据,但是如果作业或任何任务失败,您可以释放数据。此外,如果其他作业正在阅读数据集,也会失败,因为文件已被删除。使用跨国提交,可以通过在提交时将文件标记为已删除,以原子方式“逻辑删除”文件。
原子覆盖可以通过设置“spark.databricks.io.directoryCommit.enableLogicalDelete true”来切换|假”

c90pui9n

c90pui9n3#

问题/答案取决于你想写的格式。
想象两种格式:

“Delta”:如果你使用delta格式,那么计算是原子的。这意味着它在内部计算,如果成功,写入数据并在delta meta表中暂存提交。此外,在暂存数据之后,旧的snappy压缩文件仍然位于文件夹中。基于默认的保留时间30天,我认为数据仍然存在用于回滚/修复目的。基于真空,此保留时间可能会有所不同。
“ parquet ”:对于Parquet文件,它会删除和写入。所以这里没有原子操作,数据可能会损坏或丢失。
“用例”:假设你正在写数据,你发现你正在用一个节点覆盖一个非常大的数据集。这需要很长的时间。对于delta,你可以在不破坏数据的情况下取消它。对于Parquet,当你之前没有备份数据时,保持进程运行。

相关问题