Azure Databricks集群不重启无法查询Delta Lake最新插入记录问题
问题根因
该现象为Azure Databricks环境下Delta Lake的默认元数据缓存机制导致的版本读取滞后:为提升查询性能,Databricks默认会对Delta表的最新版本号、Schema等元数据做本地缓存,默认缓存有效期为2小时。缓存未过期时,读取Delta表不会重新拉取存储层的Delta Log校验最新版本,因此只能查询到缓存生效前的旧数据;指定版本号查询会跳过缓存直接拉取对应版本快照,重启集群会清空所有本地缓存,因此两种操作都能正常返回最新记录。
解决思路
- 单次查询前主动刷新元数据:读取目标表前先执行
spark.sql("REFRESH TABLE delta./mnt/xxxx"),强制清空该表的本地缓存后再执行读取操作,即可拿到最新数据 - 调整集群级缓存有效期:如果目标表更新频率较高,可在集群Spark配置中添加参数
spark.databricks.delta.lastVersionValidityDurationMs = 30000,将Delta表版本缓存有效期调整为30秒,缩短缓存滞后的影响时长 - 写入端主动失效缓存:如果写入操作也在同一Databricks集群内执行,写入完成后执行如下代码直接清空该表的元数据缓存,后续所有读取操作都会拉取最新版本:
from delta.tables import DeltaLog DeltaLog.forTable(spark, "/mnt/xxxx").invalidateCache()
- 完全禁用路径式Delta表缓存:如果业务对数据一致性要求远高于读取性能,可在集群Spark配置中添加参数
spark.databricks.delta.fsTable.cache.enabled = false,关闭所有路径访问的Delta表的元数据缓存,每次读取都会直接拉取最新Delta Log确认版本 - 已注册到Hive元数据的Delta表额外配置:如果目标表已经注册为Hive表,还需在集群Spark配置中添加参数
spark.sql.hive.metadataCacheTTL = 30s,缩短Hive元数据的缓存有效期。
内容的提问来源于stack exchange,提问作者Colin Olliver
相关产品推荐
相关产品推荐

