在新建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. 《C++ Primer》学习笔记:向vector对象添加元素蕴含的编程假定

    练习<C++ Primer>中的3.14节时,当敲入: #include <iostream> #include <string> using namespace ...

  2. tmux 终端复用详解

    tmux是什么 我们在linux服务器上的工作一般都是通过一个远程的终端连接软件连接到远端系统进行操作,例如使用xshell或者SecureCRT工具通过ssh进行远程连接.在使用过程中,如果要做比较 ...

  3. 【转载自netfocus博客】聚合(根)、实体、值对象精炼思考总结

    1.内容摘要 最近在看DDD领域驱动设计,看到实体(Entity),值对象 (Value Object),以及聚合根(Aggregate Root) 时.对他们的关系有些模糊,不清楚.于是去找了找资料 ...

  4. [Awson原创]洪水(flood)

    Description Awson是某国际学校信竞组的一只菜鸡.今年,该市发生了千年难遇的洪水.被监禁在学校的Awson不甘怠堕,想将自己投入到公益服务事业中去.这天,他偷了H老师的小电驴,偷偷地溜出 ...

  5. ●codeforces 528D Fuzzy Search

    题链: http://codeforces.com/problemset/problem/528/D 题解: FFT 先解释一下题意: 给出两个字符串(只含'A','T','C','G'四种字符),一 ...

  6. hdu 4267 线段树间隔更新

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  7. SPOJ Query on a tree V

    You are given a tree (an acyclic undirected connected graph) with N nodes. The tree nodes are number ...

  8. 【Python3.6+Django2.0+Xadmin2.0系列教程之三(入门篇-下)】学生信息管理系统

    上一篇我们已经初步的构建起了一个学生管理系统的模型,现在接着来继续完善它吧. 1.上传图片/文件等资源 有时候需要添加一些附件,例如,新生刚入学,大家相互之间还不熟悉,希望能通过照片来加深印象,并且方 ...

  9. Python Django的分页,Form验证,中间件

    本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ...

  10. CSS(一)解析浮动塌陷与清除浮动

    清除浮动方法 1.对父级设置适合CSS高度,父级元素撑开并且包含子元素. <p>固定高度</p> <div style="height: 50px;" ...