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为单位进行的。