问题
你有一个网络问题(或类似的),一个写操作是在进步。你重新运行工作,但部分未提交的文件在运行造成不必要的数据重复失败。
导致
砖提交协议的工作原理:
- DBIO提交协议(AWS|Azure|GCP)事务。文件只提交一个事务成功完成后。如果工作失败的事务,_started_ < id >和其他部分写数据文件存储。
- 重新运行工作时,一个新的_started_ < id >创建文件。一旦交易成功完成一个新的_committed_ < id >文件生成。这_committed_ < id >文件是一个JSON文件,其中包含所有的拼花由上游要读取的文件名。
- 如果你读的文件夹使用Apache火花没有重复,因为它只有读取里面的文件_committed_ < id >。
- 删除未提交的数据文件的目标路径,DBIO运行真空在每一份工作。默认情况下,未提交的文件超过48小时(2天)移除。
当问题发生时:
- 在两天内如果你读文件夹失败的工作,使用另一个工具(不使用DBIO或火花)或读取文件夹通配符(spark.read.load (' / path / *)),读取所有文件,包括未提交的文件。这导致数据重复。
解决方案
理想的解决方案是只使用火花或DBIO访问文件存储。
如果你必须保存访问其他工具,您应该更新的价值spark.databricks.io.directoryCommit.vacuum.dataHorizonHours在集群的火花配置(AWS|Azure|GCP)。
你也可以更新这个属性在一个笔记本:
spark.conf.set (“spark.databricks.io.directoryCommit.vacuum.dataHorizonHours”、“<时间>”)
这个属性决定了哪些文件时自动删除真空运行结束时,每一份工作。删除任何文件超过指定的时间。
默认值是48小时(2天)。你可以减少一小时,这取决于您的具体需求。如果你将值设置为一个小时,自动的真空删除所有未提交的文件超过一个小时的每一份工作。
或者,您可以手动运行真空后重新运行失败的工作保留时间价值足够低的部分未提交的文件. .
看到真空文档:https://docs.www.neidfyre.com/spark/latest/spark-sql/language-manual/delta-vacuum.html