先介绍下Orc的文件格式,截一张官方的图:

 

    可以看到每个Orc文件由1个或多个stripe组成,每个stripe250MB大小,这个Stripe实际相当于之前的rcfile里的RowGroup概念,不过大小由4MB->250MB,这样应该能提升顺序读的吞吐率。每个Stripe里有三部分组成,分别是Index Data,Row Data,Stripe Footer:

    1,Index Data:一个轻量级的index,默认是每隔1W行做一个索引。这里做的索引应该只是记录某行的各字段在Row Data中的offset,据说还包括每个Column的max和min值,具体没细看代码。

    2,Row Data:存的是具体的数据,和RCfile一样,先取部分行,然后对这些行按列进行存储。与RCfile不同的地方在于每个列进行了编码,分成多个Stream来存储,具体如何编码在下一篇解析里会讲。

    3,Stripe Footer:存的是各个Stream的类型,长度等信息。

    每个文件有一个File Footer,这里面存的是每个Stripe的行数,每个Column的数据类型信息等;每个文件的尾部是一个PostScript,这里面记录了整个文件的压缩类型以及FileFooter的长度信息等。在读取文件时,会seek到文件尾部读PostScript,从里面解析到File Footer长度,再读FileFooter,从里面解析到各个Stripe信息,再读各个Stripe,即从后往前读。

    接下来看下ORcfile相对于RCfile做了哪些改进,从Orc作者的ppt里截了张图:

分别解释下各行:

    Hive type model:RCfile在底层存储时不保存类型,都当做Byte流来存储

    Separtor complex columns:Orc将复杂类型拆开存储

    Splits Found Quickly:不很理解

    Default Column group size:不用解释了

    Files per a bucket:不很理解

    Store min,max,count,sum:存了这些便于快速地skip掉一个stripe

    Versioned metadata:不很理解

    Run-Length Data-coding:整数类型做Run-Length变长编码

    Store Strings in dictionary:String类型做字典编码

    Store Row Count:每个Stripe会存储行数

    Skip Compressed blocks:可以直接skip掉压缩过的block

    Store internal indexes:存储了一个轻量级的index

    整个Orc看下来,代码写的还是比较清晰明了的,而且我们也进行了测试,压缩效果比RCfile提升了不少。

 

posted on 2015-12-11 00:22  成都笨笨  阅读(743)  评论(0编辑  收藏  举报