hudi表的数据一直在演变过程中,存储在文件系统中的数据文件也在不断增加和版本迭代,hudi提供了表级别的文件系统视图(filesystem view)来简单、直观地了解表中的数据分布情况、数据文件的状态和变化,以及数据的版本控制信息。文件系统视图提供了以下一些功能:
- 获取最新的base文件:整个表的、指定分区的、指定分区的文件组的(BaseFileOnlyViewWithLatestSlice)
- 获取指定分区所有base文件、获取指定分区某版本(fileId+instant)的base文件(BaseFileOnlyView)
- 获取最新分片信息:指定分区、指定文件组、指定分区未compact的、指定分区在某instant前的、指定分区在某instant范围的(SliceViewWithLatestSlice)
- 获取指定分区所有分片(SliceView)
- 获取指定分区所有分组、获取timeline、获取正compact的信息、获取正clustering的文件组、获取replacecommit产生的文件组(TableFileSystemView)
当然,文件系统视图持续进行着自我更新、重置,以保持最新视图。
类图
- TableFileSystemView,BaseFileOnlyView,BaseFileOnlyViewWithLatestSlice,SliceView,SliceViewWithLatestSlice几个接口定义了对外提供的功能
- SyncableFileSystemView定义视图的关闭、重置、同步接口
- AbstractTableFileSystemView是一个抽象类,实现了视图的初始化、加锁对视图进行重置和同步、及其它一些基础的公共功能。
存储机制
文件系统视图可以使用以下存储机制
- 全内存:HoodieTableFileSystemView,相关的视图数据存储在HashMap中
- 固定内存+磁盘:SpillableMapBasedFileSystemView继承了HoodieTableFileSystemView,相关的视图数据存储在ExternalSpillableMap中
- RocksDB:RocksDbBasedFileSystemView,使用了内置的Rocks DB,默认的数据库文件位置在/tmp/hoodie_timeline_rocksdb下,虽然用了db进行视图数据的存储,但是在作业重启后,存储数据依然会丢失。
远程文件系统视图
文件系统视图可以通过Timeline Server提供远程管理服务,客户端可以使用代理对象(RemoteHoodieTableFileSystemView)来连接并获取远程的视图,使用远程文件系统视图时有两种方式
- REMOTE_FIRST:如果在查询远程的文件系统视图出现问题时,将自动切换到本地的备用文件系统
- REMOTE_ONLY:如果在查询远程的文件系统视图出现问题时,客户端将会抛出异常
其它
- 增量同步:IncrementalTimelineSyncFileSystemView,基于timeline实现增量同步文件系统视图,通过hoodie.filesystem.view.incr.timeline.sync.enable控制开关。
- 元数据文件系统视图:HoodieMetadataFileSystemView,当开启了元数据表,则会使用元数据文件系统视图来加速视图查询性能。