1.Hive存储格式
Hive中的数据分为真实数据与元数据,一般来说Hive的存储格式是指真实数据的存储格式。
Hive常用的存储格式包括以下四种:TEXTFILE,SEQUENCEFILE,RCFILE和ORCFILE。
1.TEXTFILE
常见的txt、csv、tsv 等文件都属于 TEXTFILE。Hive 默认存储格式为TEXTFILE
即创建表时如果不单独指定存储格式,则认为存储格式为 TEXTFILE。存储格式为按行
存储,内容为普通的文本格式,一般可以使用 cat 命令直接查看。TEXTFILE 格式的数
据文件无须任何处理即可导入 Hive,文件每一行为一条记录,记录可用任意分隔符进行
列分割,记录之间须以行结束符分割。Hive将TEXTFILE 映射为表的过程中,将会逐个
字符地判断是否为列分隔符或行分隔符。
TEXTFILE 支持使用 Gzip 压缩,但 Gzip 压缩后的文件将不再支持 MapReduce 分
机制,这意味着压缩后的文件不论有多少个HDFS 块都只能被一个 Map 任务处理,即失
去了使用集群并行处理的优势。
2.SEQUENCEFILE
SEQUENCEFILE 是 Hadoop 提供的一种由“二进制序列化过的 Key/Value 字节流”
组成的文本存储文件格式。其由于内容为二进制字节,所以无法通过 cat 命令查看原始
字符,这可以抽象地理解为,在 SEQUENCEFILE 中每条记录均以键值对的方式进行存
储,仅支持追加。与TEXTFILE 类似,SEQUENCEFILE 同样按行存储。
Hive无法直接导入SEQUENCEFILE格式的数据文件。数据须首先导入至TEXTFILE
格式的表中,然后再从TEXTFILE 格式的表中采用插入方式导入至 SEQUENCEFILE格
式的表。
SEQUENCEFILE是可分割的文件格式,支持3种压缩选项
(1)NONE:不压缩。 (2) RECORD(默认选项): 记录级压缩,压缩率低
(3) BLOCK: 块级压缩,压缩率高。
3.RCFILE
RCFILE(Record-Columnar File) 是 Facebook 开发的一种专门面向列的数据存储
格式,不同于 TEXTFILE 和 SEQUENCEFILE,RCFILE 是基于行列混合存储思想的
设计。
RCFILE 遵循“先水平划分,再垂直划分”的设计理念:首先把 Hive 表水平切分成
多个行组,保证同一行的数据位于同一节点,其次在行组内按照“列”垂直切分,实现
列与列的数据在磁盘上呈现为连续的存储块。使用 RCFILE 的优势是既保证了每条记录
所有列在同一个 HDFS 块,也可以做到当查询仅针对表中的少数几列时,可跳过不必要
的列进行数据读取。
RCFILE 是可分割的文件格式,即在每个行组中,元数据头部 (Metadata Header)
和表格数据段会被分别压缩。对于元数据头部而言,RCFILE 会使用行程长度编码(Run
Length Encoding,RLE) 算法压缩数据,而对于表格数据段而言,其每个列会通过 Gzip
压缩算法独立压缩。
4.ORCFILE
ORCFILE(Optimized Row-Columnar File)是对 RCFILE的优化,可以提供一种高
效的方法来存储 Hive 数据。ORCFILE 的特点是:支持压缩比很高的压缩算法,文件可
切分,提供多种索引,支持复杂的数据结构。
2.Hive数据单元
Hive 所有真实数据都存储在 HDFS 中,这样更有利于对数据做分布式计算。为了有效地对真实数据进行管理,根据粒度大小,Hive 将真实数据划分为如下数据单元。
1.数据库
数据库(Databases)类似于 RDBMS 中的数据库,在HDFS 中表现为 hive.metastore
warehouse.dir 目录下的一个文件夹,其本质是用于避免表、视图、分区、列等命名冲突
的命名空间。
2.表
表(Tables)由列构成,在表上可以进行过滤、映射、连接和联合操作。表在HDFS
中表现为所属数据库目录下的子目录,具体又分内部表和外部表。内部表类似于 RDBMS
中的表,由 Hive 管理。外部表指向已经存在 HDFS 中的数据,与内部表元数据组织是
同的,但其数据存放位置是任意的。外部表的真实数据不被 Hive 管理,即当删除一张
部表时,元数据以及 HDFS 上的真实数据均被删除,而删除外部表则只会删除元数据而
不会删除真实数据。
3.分区
每个表都可以按指定的键分为多个分区(Partitions)。分区的作用是提高查询的效率
其在 HDFS 中表现为表目录下的子目录。
4.分桶
根据表中某一列的哈希值可将数据划分为多个分桶(Bukets),在 HDFS 中分桶表
现为同一个目录下根据哈希散列之后的多个文件。
可以看到,Hive 中的数据单元划分与 RDBMS 的物理模型非常类似。但在 Hive 数
据单元划分过程中还必须注意以下几点。
Hive 表没有主键。
Hive表(0.14版本前)不支持行级操作,新版本中行级操作效率也比较低。
Hive 表不支持批量 update 操作,但可以先删除、再添加。
Hive 分区和分桶可以极大提升数据查询效率。
3 Hive 存储模型
按照数据单元的划分结果,Hive 数据在 HDFS 的典型存储结构中表现为以下形式:
/数据仓库地址/数据库名称/表名称/数据文件 (或分桶数据文件)。
/数据仓库地址/数据库名称/表名称/分区键/数据文件(或分桶数据文件)。
在 Hive 中,数据按分布的均匀情况可以分为正常的数据和倾斜的数据。数据倾斜就
是由于数据分布不均匀、数据大量集中到一点上造成的数据热点问题。分区是按照指定
的 key 值来划分的,当大量相同的 key 值被分配到一个分区里时就会产生数据倾斜。
4.总结
Hive是Hadoop上处理结构化数据的数据仓库基础工具,用来处理存储在Hadoop上的海量数据。
Hive使用HQL替代MapReduce,使传统数据库开发人员更容易使用Hadoop。
Hive依赖Hadoop的HDFS和YARN。
Hive与RDBMS用法相似,但应用场景有显著区别。
Hive架构主要包括
1.CLI、HiveServer2、HMlDriver, Metastore
2.Hive数据存储模型与RDBMS类似,分区和分桶是Hive为了提升查询性能而特有的概念
3.Hive元数据释对真实数据的描述,通常单独储存在MySQL中Hive除了两种命令行开发工具(CLI和Beeline) 之外还有许多第三方工具(HUE、 Ambari, zeppelin)。