Posted on 2013-08-14 23:12
whspecial 阅读(6705)
评论(0) 编辑 收藏 引用 所属分类:
hadoop
Orcfile(Optimized Row Columnar)是hive 0.11版里引入的新的存储格式,是对之前的RCFile存储格式的优化。写这个的哥们来自于HortonWorks,代码写的很不错,比之前的rcfile强多了(据说rcfile是个中科院的童鞋跑去facebook写的,看来中国的计算机教育水平还是有限啊。。。囧,跑题了)
先介绍下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提升了不少,有兴趣的朋友可以来看下,之后会写第二篇解析,主要是讲Orc用到的几种编码格式。