无需外部目录在ADLS/S3写入Apache Iceberg表的相关疑问
背景
正在进行Apache Iceberg的POC,目标是在ADLS/S3这类云对象存储上创建Iceberg表,希望将current metadata pointer(即version-hint.text文件)与元数据、清单列表、Parquet数据文件等一同存储在对象存储中。当前要求每10分钟至少从Databricks向表写入一次数据,未来写入频率可能提升,写入的数据需要被Databricks和Dremio读取。
针对该场景,有以下两个核心疑问:
1. 在ADLS/S3中使用version-hint.text作为当前元数据指针是否安全?会丢失Iceberg的特性吗?
结论:生产环境下不安全,不建议使用,会破坏Iceberg的核心特性
version-hint.text是专为Hadoop表(适配HDFS这类分布式文件系统)设计的,仅适合本地文件系统测试场景。S3/ADLS这类对象存储的写操作不具备强原子性,在并发写入的场景中,更新version-hint.text时可能出现读写不一致的问题:比如写入端还没完成文件更新,读取端就读取到了不完整的版本号,导致读取到旧的甚至无效的元数据快照。
这种情况会直接破坏Iceberg的快照一致性、ACID等核心特性,无法保证多读写端(比如Databricks和Dremio)看到的是同一版本的表元数据。生产环境必须使用支持原子元数据指针更新的Catalog(如Hive MetaStore、AWS Glue、Nessie),这类Catalog能保证元数据指针切换的原子性,维持Iceberg的特性。
2. version-hint.text文件是否可选?
结论:是可选的,但会带来性能损耗
当不存在version-hint.text时,Iceberg会遍历元数据目录下所有的元数据文件,按版本号从高到低查找最新的可用快照。但这种遍历方式在写入频率较高(尤其是未来写入频率提升后)的场景下,会产生明显的性能问题:每次读写操作都需要扫描大量元数据文件,增加延迟。
如果只是测试场景可以接受,但对于有定时写入、多引擎读取需求的POC及后续生产环境,依赖遍历查找最新快照会成为性能瓶颈。
内容的提问来源于stack exchange,提问作者ns15

