Hive-RCFile文件存储格式
在新建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文件存储格式的更多相关文章
- 大数据:Hive - ORC 文件存储格式
一.ORC File文件结构 ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache ...
- Hive - ORC 文件存储格式【转】
一.ORC File文件结构 ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache ...
- Hive(10)-文件存储格式
Hive支持的存储数据的格式主要有:TEXTFILE .SEQUENCEFILE.ORC.PARQUET 一. 列式存储和行式存储 左边为逻辑表,右边第一个为行式存储,第二个为列式存储 1. 行式存储 ...
- 【图解】Hive文件存储格式
摘自:https://blog.csdn.net/xueyao0201/article/details/79103973 引申阅读原理篇: 大数据:Hive - ORC 文件存储格式 大数据:Parq ...
- hive常见的存储格式
Hive常见文件存储格式 背景:列式存储和行式存储 首先来看一下一张表的存储格式: 字段A 字段B 字段C A1 B1 C1 A2 B2 C2 A3 B3 C3 A4 B4 C4 A5 B5 C5 行 ...
- Hive文件存储格式
hive文件存储格式 1.textfile textfile为默认格式 存储方式:行存储 磁盘开销大 数据解析开销大 压缩的text文件 hive无法进行合并和拆分 2.sequencef ...
- Hive文件存储格式和hive数据压缩
一.存储格式行存储和列存储 二.Hive文件存储格式 三.创建语句和压缩 一.存储格式行存储和列存储 行存储可以理解为一条记录存储一行,通过条件能够查询一整行数据. 列存储,以字段聚集存储,可以理解为 ...
- Hive性能调优(一)----文件存储格式及压缩方式选择
合理使用文件存储格式 建表时,尽量使用 orc.parquet 这些列式存储格式,因为列式存储的表,每一列的数据在物理上是存储在一起的,Hive查询时会只遍历需要列数据,大大减少处理的数据量. 采用合 ...
- hive从入门到放弃(六)——常用文件存储格式
hive 存储格式有很多,但常用的一般是 TextFile.ORC.Parquet 格式,在我们单位最多的也是这三种 hive 默认的文件存储格式是 TextFile. 除 TextFile 外的其他 ...
- Hive-ORC文件存储格式
ORC文件格式是从Hive-0.11版本开始的.关于ORC文件格式的官方文档,以及基于官方文档的翻译内容这里就不赘述了,有兴趣的可以仔细研究了解一下.本文接下来根据论文<Major Techni ...
随机推荐
- [ZJOI2008]瞭望塔
题目描述 致力于建设全国示范和谐小村庄的H村村长dadzhi,决定在村中建立一个瞭望塔,以此加强村中的治安. 我们将H村抽象为一维的轮廓.如下图所示 我们可以用一条山的上方轮廓折线(x1, y1), ...
- 【BZOJ1040】【ZJOI2008】骑士
Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...
- ●BZOJ 1185 [HNOI2007]最小矩形覆盖
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1185 题解: 计算几何,凸包,旋转卡壳 结论:矩形的某一条边在凸包的一条边所在的直线上. ( ...
- [cf453e]Little Pony and Lord Tirek
来自FallDream的博客,未经允许,请勿转载,谢谢. 更博客= = 有n个数,每个数字都有一个初始大小ai和最大值mi,然后每秒会增加ri,你需要回答m个发生时间依此增大的询问,每次询问区间和并且 ...
- getopt_long函数使用【转】
转自:https://blog.csdn.net/cashey1991/article/details/7942809 平时在写程序时常常需要对命令行参数进行处理,当命令行参数个数较多时,如果按照顺序 ...
- Entity Framework DBContext 增删改查深度解析
Entity Framework DBContext 增删改查深度解析 有一段时间没有更新博客了,赶上今天外面下雨,而且没人约球,打算把最近对Entity Framework DBContext使用的 ...
- C语言程序第二次作业
(一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...
- 底部导航栏实现一 Fragment-replace
[效果](这里下载的软件收费的试用有水印) [推荐]这里推荐一个图标网http://iconfont.cn/.以上图标来自此图标网 [项目结构] [步骤] ①创建布局文件,写底部导航栏 <?xm ...
- compress函数用法详解
compress函数: 主要用来删除字符串中的特定字符. 1.compress函数的基本形式compress(<source><, chars><, modifiers& ...
- truncated、delete和drop的异同点
相同点 truncate和不带where子句的delete, 以及drop都会删除表内的数据. 不同点: 1.truncate和 delete只删除数据不删除表的结构(定义) drop语句将删除表的结 ...