在新建Hive表时,可以使用stored as rcfile来指定hive文件的存储方式为RCFile。

一、RCFile文件结构

  下图是一个RCFile的文件结构形式。

  

  从上图可以看出:

1)一张表可以包含多个HDFS block。

2)在每个block中,RCFile以行组(row group,类似于ORC中的stripe)为单位存储其中的数据。所谓行组是指在关系型数据块中,若干条记录组成的一个group。对于一张表来说,row group的大小是固定的。通过HDFS的block大小和row group的大小,能够确定一个block上可以容纳多少个row group。

3)row group又由三个部分组成,包括一个用于在block中分隔两个row group的16字节的标志区,一个存储row group元数据信息的header,以及实际数据区。表中的实际数据以列为单位进行存储。

二、RCFile压缩方式

  在存储RCFile时,会对每个row group的metadata header区和data区进行压缩。

  在metadata header区中,记录了该row group中有多少记录,每个column总共有多少字节数,以及每个column中每一个field的字节数等信息。对metadata header区,使用RLE(Run Length Encoding)算法来压缩数据。需要读取指定column的记录时,可以根据这个metadata中记录的字节数等信息,很快定位到对应的数据。

  对data区的数据压缩时,RCFile文件格式并不会将整个区域一起进行压缩,而是以列为单位进行Gzip压缩,这样的处理方式使得需要读取某些指定列的数据时,其他无关的列不需要进行读取。

  

三、RCFile的数据写入方式

  由于目前HDFS只支持在文件末尾追加内容,无法随意修改hdfs文件中的数据。所以在使用RCFile文件的hive表中也只能在文件末尾写入新的记录。在向RCFile写入数据时,

(1)为了避免频繁的写入操作,RCFile会为每一个column在内存中维持一个对应的column holder。当有记录插入到hive表中时,会把这一条记录的每个字段拆散存入到对应的column holder的末尾。伴随着这个操作的同时,会在metadata header中记录此次操作的相关信息。

(2)上面的column holder当然是不能无限大的,为此RCFile设定了两个参数,当满足任何一个时,就会把column holder中的数据flush到磁盘上。这两个参数一个是写入记录数,另一个是column holder使用的内存大小。

(3)记录写入完毕后,RCFile首先会将metadata header进行压缩。然后把每一个column单独进行压缩,最后将压缩好的数据flush到同一个row group中。

四、RCFile的数据读取和解压缩方式

  当需要从一个row group读取数据时,RCFile并不会将整个row group中的数据都读入到内存中,需要读入的数据只包括metadata header,以及在语句中指定的那些column。

  这两部分数据读入到内存中后,首先会将metadata header进行解压缩,并一直保存在内存中。接下来对加载到内存中的column数据,在RCFile中有一个lazy decompression的概念,这个的意思是说,column数据并不会在加载到内存中后马上进行解压缩,而是后续处理中的确需要读取这个column数据时解压缩过程才会执行。比如有一个sql语句,select a,b,c from table where a > 5;首先会对字段a解压缩,如果判断所有记录中没有a > 5的记录,那么字段b和字段c都不必要进行解压缩了。

  

五、RCFile的相关参数

参数 默认值 描述
hive.io.rcfile.record.buffer.size 4194304 设置row group的大小
hive.io.rcfile.record.interval 2147483647 row group中最大记录数

  row group默认大小为4MB主要是因为row group不能太大,也不能太小。在Gzip压缩算法中,增大row group的大小能够提升压缩的性能。但是当row group的大小达到某个阈值时,继续增大row group并不能带来压缩性能的提升。并且,以上面的sql语句为例如果一个row group越大,其中保存的记录也就越多,这样该row group中出现a >5的记录的概率就越大,那么就越难使用到lazy decompression这一特性带来的性能提升。并且row group越大,消耗的内存也就越多。

  这个大小限制在ORC文件格式中得到了改善。

  

Hive-RCFile文件存储格式的更多相关文章

  1. 大数据:Hive - ORC 文件存储格式

    一.ORC File文件结构 ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache ...

  2. Hive - ORC 文件存储格式【转】

    一.ORC File文件结构 ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache ...

  3. Hive(10)-文件存储格式

    Hive支持的存储数据的格式主要有:TEXTFILE .SEQUENCEFILE.ORC.PARQUET 一. 列式存储和行式存储 左边为逻辑表,右边第一个为行式存储,第二个为列式存储 1. 行式存储 ...

  4. 【图解】Hive文件存储格式

    摘自:https://blog.csdn.net/xueyao0201/article/details/79103973 引申阅读原理篇: 大数据:Hive - ORC 文件存储格式 大数据:Parq ...

  5. hive常见的存储格式

    Hive常见文件存储格式 背景:列式存储和行式存储 首先来看一下一张表的存储格式: 字段A 字段B 字段C A1 B1 C1 A2 B2 C2 A3 B3 C3 A4 B4 C4 A5 B5 C5 行 ...

  6. Hive文件存储格式

    hive文件存储格式 1.textfile textfile为默认格式   存储方式:行存储   磁盘开销大 数据解析开销大   压缩的text文件 hive无法进行合并和拆分 2.sequencef ...

  7. Hive文件存储格式和hive数据压缩

    一.存储格式行存储和列存储 二.Hive文件存储格式 三.创建语句和压缩 一.存储格式行存储和列存储 行存储可以理解为一条记录存储一行,通过条件能够查询一整行数据. 列存储,以字段聚集存储,可以理解为 ...

  8. Hive性能调优(一)----文件存储格式及压缩方式选择

    合理使用文件存储格式 建表时,尽量使用 orc.parquet 这些列式存储格式,因为列式存储的表,每一列的数据在物理上是存储在一起的,Hive查询时会只遍历需要列数据,大大减少处理的数据量. 采用合 ...

  9. hive从入门到放弃(六)——常用文件存储格式

    hive 存储格式有很多,但常用的一般是 TextFile.ORC.Parquet 格式,在我们单位最多的也是这三种 hive 默认的文件存储格式是 TextFile. 除 TextFile 外的其他 ...

  10. Hive-ORC文件存储格式

    ORC文件格式是从Hive-0.11版本开始的.关于ORC文件格式的官方文档,以及基于官方文档的翻译内容这里就不赘述了,有兴趣的可以仔细研究了解一下.本文接下来根据论文<Major Techni ...

随机推荐

  1. [HNOI 2010]chorus 合唱队

    Description 题库链接 对于一个包含 \(N\) 个整数的数列 \(A\) ,我们可以把它的所有元素加入一个双头队列 \(B\) . 首先 \(A_1\) 作为队列的唯一元素,然后依次加入 ...

  2. [TJOI 2013]拯救小矮人

    Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...

  3. HDU5339——Untitled

    Problem Description There is an integer a and n integers b1,…,bn. After selecting some numbers from  ...

  4. 棋盘 chess

    Description 给出一张 n × n 的棋盘,格子有黑有白.现在要在棋盘上放棋子,要求: • 黑格子上不能有棋子 • 每行每列至多只有一枚棋子 你的任务是求出有多少种合法的摆放方案.答案模 1 ...

  5. FJOI2017 RP++

    嗯如果算得没错大概十二小时之后就是省选二试了 这次考试貌似就在我们学校 虽然机子挺旧的基本没用过 平时训练都是在专门的机房 其实貌似压力不是很大  因为一试跪了TAT  那时候还是图样 T3按照惯例是 ...

  6. [bzoj1041][HAOI2008]圆上的整点

    我能想得出怎么做才奇怪好吗 题解:http://blog.csdn.net/csyzcyj/article/details/10044629 #include<iostream> #inc ...

  7. 容器化分布式日志组件ExceptionLess的Angular前端UI

    写在前面 随着微服务架构的流行,日志也需要由专门的分布式日志组件来完成这个工作,我们项目使用的是 ExceptionLess 这个组件,它是前后端分离的:这篇文章我们就来实践容器化 Exception ...

  8. vue-cli2.9.1如何自动打开浏览器及实现手机调试

    在vue-cli2.9.1以前我们运行 "npm run dev" 程序会自动打开浏览器进行调试,而且在手机浏览器输入 "IP地址:8080" 能实现在手机端的 ...

  9. a标签href无值 onclick事件跳转

    <a href='#'  onclick='gomore()'>更多>></a>  单击无反应 <a href='javascript:void(0)'  o ...

  10. 线性表 linear_list 顺序存储结构

    可以把线性表看作一串珠子 序列:指其中的元素是有序的 注意last和length变量的内在关系 注意:将元素所占的空间和表长合并为C语言的一个结构类型 静态分配的方式,分配给一个固定大小的存储空间之后 ...