1. 介绍
在 MergeOnRead
存储类型时,对于记录的更新会写入log文件,对于log文件的格式,hudi进行了一些优化和规定,下面先分析了解log文件相关的类定义。
2. 分析
log日志文件相关类图结构如下图所示
其中 HoodieLogFormat
表示log日志格式的接口,其核心定义了 Reader
和 Writer
接口用来读写日志文件以及表示日志文件版本的 LogFormatVersion
类。
Reader
接口的核心代码如下
interface Reader extends Closeable, Iterator<HoodieLogBlock> { /** * @return the path to this {@link HoodieLogFormat} */ HoodieLogFile getLogFile(); /** * Read log file in reverse order and check if prev block is present * * @return */ public boolean hasPrev(); /** * Read log file in reverse order and return prev block if present * * @return * @throws IOException */ public HoodieLogBlock prev() throws IOException; }
可以看到其定义了获取当前读取的日志文件、是否有下一个 HoodieLogBlock
、读取下一个 HoodieLogBlock
三个接口方法,该接口有 HoodieLogFormatReader
和 HoodieLogFileReader
两种实现,用于从 HoodieLogFile
中读取 HoodieLogBlock
。
Writer
接口的核心代码如下
interface Writer extends Closeable { /** * @return the path to this {@link HoodieLogFormat} */ HoodieLogFile getLogFile(); /** * Append Block returns a new Writer if the log is rolled */ Writer appendBlock(HoodieLogBlock block) throws IOException, InterruptedException; long getCurrentSize() throws IOException; }
其定义了获取当前写入的日志文件、添加 HoodieLogBlock
和获取当前文件大小三个接口方法。该接口有 HoodieLogFormatWriter
一种实现,用于将 HoodieLogBlock
写入 HoodieLogFile
。
可以看到,对于 Reader
和 Writer
,都是以 HoodieLogBlock
为单位进行读写, HoodieLogBlock
定义了日志文件块,其包含四种实现,如表示数据的 HoodieAvroDataBlock
,表示命令控制的 HoodieCommandBlock
,表示被损坏的 HoodieCorruptBlock
以及表示删除的 HoodieDeleteBlock
。
而整个写 HoodieLogFile
的入口在 HoodieAppendHandle#doAppend
中,其会将记录以 HoodieLogBlock
数据块写入 HoodieLogFile
文件。下一篇将分析具体的实现逻辑。
3. 总结
本文主要分析归纳了用于读写log日志文件的相关类,并了解到对于log日志文件的读写是以 HoodieLogBlock
为单位进行的。