暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Hudi Log日志文件格式分析(一)

ApacheHudi 2021-04-20
1095

1. 介绍

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

2. 分析

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


其中 HoodieLogFormat
表示log日志格式的接口,其核心定义了 Reader
Writer
接口用来读写日志文件以及表示日志文件版本的 LogFormatVersion
类。

Reader
接口的核心代码如下

  1. interface Reader extends Closeable, Iterator<HoodieLogBlock> {


  2. /**

  3. * @return the path to this {@link HoodieLogFormat}

  4. */

  5. HoodieLogFile getLogFile();


  6. /**

  7. * Read log file in reverse order and check if prev block is present

  8. *

  9. * @return

  10. */

  11. public boolean hasPrev();


  12. /**

  13. * Read log file in reverse order and return prev block if present

  14. *

  15. * @return

  16. * @throws IOException

  17. */

  18. public HoodieLogBlock prev() throws IOException;

  19. }

可以看到其定义了获取当前读取的日志文件、是否有下一个 HoodieLogBlock
、读取下一个 HoodieLogBlock
三个接口方法,该接口有 HoodieLogFormatReader
HoodieLogFileReader
两种实现,用于从 HoodieLogFile
中读取 HoodieLogBlock

Writer
接口的核心代码如下

  1. interface Writer extends Closeable {


  2. /**

  3. * @return the path to this {@link HoodieLogFormat}

  4. */

  5. HoodieLogFile getLogFile();


  6. /**

  7. * Append Block returns a new Writer if the log is rolled

  8. */

  9. Writer appendBlock(HoodieLogBlock block) throws IOException, InterruptedException;


  10. long getCurrentSize() throws IOException;

  11. }

其定义了获取当前写入的日志文件、添加 HoodieLogBlock
和获取当前文件大小三个接口方法。该接口有 HoodieLogFormatWriter
一种实现,用于将 HoodieLogBlock
写入 HoodieLogFile

可以看到,对于 Reader
Writer
,都是以 HoodieLogBlock
为单位进行读写, HoodieLogBlock
定义了日志文件块,其包含四种实现,如表示数据的 HoodieAvroDataBlock
,表示命令控制的 HoodieCommandBlock
,表示被损坏的 HoodieCorruptBlock
以及表示删除的 HoodieDeleteBlock

而整个写 HoodieLogFile
的入口在 HoodieAppendHandle#doAppend
中,其会将记录以 HoodieLogBlock
数据块写入 HoodieLogFile
文件。下一篇将分析具体的实现逻辑。

3. 总结

本文主要分析归纳了用于读写log日志文件的相关类,并了解到对于log日志文件的读写是以 HoodieLogBlock
为单位进行的。


文章转载自ApacheHudi,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论