本文共 1170 字,大约阅读时间需要 3 分钟。
OrcFile是Hive 0.11版中引入的新存储格式,作为对之前的RCFile存储格式的优化。这项工作由HortonWorks团队完成,他们在代码实现上做了很多改进,相比RCFile,OrcFile的性能表现有了显著提升。
OrcFile的文件格式结构较为清晰,每个文件由一个或多个Stripe组成,每个Stripe的大小为250MB,这比RCFile的RowGroup概念从4MB提升了很多,有助于提升顺序读取的吞吐量。每个Stripe包含三部分:Index Data、Row Data和Stripe Footer。
Index Data:这是一个轻量级的索引结构,默认每隔10,000行创建一个索引。索引主要用于记录某行的字段在Row Data中的偏移量,同时还包含每个字段的最大值和最小值信息。
Row Data:存储具体的数据,与RCFile类似,OrcFile也会将部分行数据提取出来,并按列进行存储。与RCFile不同的是,OrcFile对每个列进行了编码,将其拆分为多个Stream进行存储,具体的编码方式将在后续文章中详细解析。
Stripe Footer:存储各个Stream的类型和长度信息。
每个文件尾部都有一个File Footer,用于存储每个Stripe的行数以及各个字段的数据类型信息。文件的最后还有一个PostScript,记录压缩类型和File Footer的长度信息。读取文件时,需要从文件尾部开始读取,解析PostScript获取File Footer的长度,然后逐步解析各个Stripe信息,从末尾向前读取。
相比RCFile,OrcFile在以下方面做了改进:
类型模型:OrcFile不像RCFile那样忽略字段的类型信息,而是将其存储为Byte Stream。
复杂字段支持:OrcFile能够有效存储复杂类型的字段,将其拆分为多个部分进行存储。
快速找到分割块:OrcFile通过特定的机制快速定位到分割块的位置。
默认列组大小:支持设置默认的列组大小。
文件分组:每个文件可以包含多个分组。
存储最小值、最大值、计数和求和:在每个Stripe中存储这些信息,有助于快速跳过不感兴趣的数据块。
版本化元数据:支持元数据的版本控制。
运行长度编码:对于整数类型,OrcFile采用了Run-Length编码技术。
字符串编码:对于字符串类型,OrcFile使用字典编码。
存储行数:每个Stripe会存储具体的行数。
跳过压缩块:可以直接跳过压缩过的块。
内部索引:存储了一个轻量级的内部索引。
通过以上改进,OrcFile在存储效率和读取性能方面都有了显著提升。代码实现清晰明了,我们团队也进行了测试,发现压缩效果比RCFile提升了不少。如果你对具体的编码格式感兴趣,欢迎关注后续的文章。
转载地址:http://zpefk.baihongyu.com/