1. 介绍

在 ​MergeOnRead​存储类型时,对于记录的更新会写入log文件,对于log文件的格式,hudi进行了一些优化和规定,下面先分析了解log文件相关的类定义。

2. 分析

log日志文件相关类图结构如下图所示

Hudi Log日志文件格式分析(一)_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​为单位进行的。

Hudi Log日志文件格式分析(一)_文件大小_02