Hive 介绍与核心知识点 -- 大数据技术栈 12

回顾:大数据平台技术栈 (ps: 可点击查看),今天就来说说其中的 Hive!

作者:高广超,多年一线互联网研发与架构设计经验,擅长设计与落地高可用、高性能、可扩展的互联网架构。目前从事大数据相关研发与架构工作。
https://www.jianshu.com/p/e9ec6e14fe52

Hive 简介


Facebook 为了解决海量日志数据的分析而开发了 Hive,后来开源给了 Apache 软件基金会。

官网定义:

The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL.

Hive 是一种用类 SQL 语句来协助读写、管理那些存储在分布式存储系统上大数据集的数据仓库软件。

Hive 的几个特点
  • Hive 最大的特点是通过类 SQL 来分析大数据,而避免了写 MapReduce 程序来分析数据,这样使得分析数据更容易。

  • 数据是存储在 HDFS 上的,Hive 本身并不提供数据的存储功能

  • Hive 是将数据映射成数据库和一张张的表,库和表的元数据信息一般存在关系型数据库上(比如 MySQL)。

  • 数据存储方面:它能够存储很大的数据集,并且对数据完整性、格式要求并不严格。

  • 数据处理方面:因为 Hive 语句最终会生成 MapReduce 任务去计算,所以不适用于实时计算的场景,它适用于离线分析。

Hive 架构

image.png

Hive 的底层存储

Hive 的数据是存储在 HDFS 上的。Hive 中的库和表可以看作是对 HDFS 上数据做的一个映射。所以 Hive 必须是运行在一个 Hadoop 集群上的。

Hive 语句的执行过程

Hive 中的执行器,是将最终要执行的 MapReduce 程序放到 YARN 上以一系列 Job 的方式去执行。

Hive 的元数据存储

Hive 的元数据是一般是存储在 MySQL 这种关系型数据库上的,Hive 和 MySQL 之间通过 MetaStore 服务交互。

Hive 重要概念

外部表和内部表

内部表(managed table)
  • 默认创建的是内部表(managed table),存储位置在hive.metastore.warehouse.dir设置,默认位置是/user/hive/warehouse

  • 导入数据的时候是将文件剪切(移动)到指定位置,即原有路径下文件不再存在

  • 删除表的时候,数据和元数据都将被删除

  • 默认创建的就是内部表create table xxx (xx xxx)

外部表(external table)
  • 外部表文件可以在外部系统上,只要有访问权限就可以

  • 外部表导入文件时不移动文件,仅仅是添加一个 metadata

  • 删除外部表时原数据不会被删除

  • 分辨外部表内部表可以使用DESCRIBE FORMATTED table_name命令查看

  • 创建外部表命令添加一个 external 即可,即create external table xxx (xxx)

  • 外部表指向的数据发生变化的时候会自动更新,不用特殊处理

分区表和桶表

分区(partioned)
  • 有些时候数据是有组织的,比方按日期 / 类型等分类,而查询数据的时候也经常只关心部分数据,比方说我只想查 2017 年 8 月 8 号,此时可以创建分区,查询具体某一天的数据时,不需要扫描全部目录,所以会明显优化性能

  • 一个 Hive 表在 HDFS 上是有一个对应的目录来存储数据,普通表的数据直接存储在这个目录下,而分区表数据存储时,是再划分子目录来存储的

  • 使用partioned by (xxx)来创建表的分区

分桶(clustered)
  • 分桶是相对分区进行更细粒度的划分。分桶将整个数据内容安装某列属性值得 hash 值进行区分,按照取模结果对数据分桶。如取模结果相同的数据记录存放到一个文件。

  • 桶表也是一种用于优化查询而设计的表类型。创建通表时,指定桶的个数、分桶的依据字段,hive 就可以自动将数据分桶存储。查询时只需要遍历一个桶里的数据,或者遍历部分桶,这样就提高了查询效率。

具体说明分桶

  • clustered by (user_id) sorted by(leads_id) into 10 buckets

  • clustered by 是指根据 user_id 的值进行哈希后模除分桶个数,根据得到的结果,确定这行数据分入哪个桶中,这样的分法,可以确保相同 user_id 的数据放入同一个桶中。

  • sorted by 是指定桶中的数据以哪个字段进行排序,排序的好处是,在 join 操作时能获得很高的效率。

  • into 10 buckets 是指定一共分 10 个桶。

  • 在 HDFS 上存储时,一个桶存入一个文件中,这样根据 user_id 进行查询时,可以快速确定数据存在于哪个桶中,而只遍历一个桶可以提供查询效率。

Hive 文件格式

hive 文件存储格式包括以下几类:

  1. TEXTFILE

  2. SEQUENCEFILE

  3. RCFILE

  4. ORCFILE(0.11 以后出现)

其中 TEXTFILE 为默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到 hdfs 上不进行处理;SEQUENCEFILE,RCFILE,ORCFILE 格式的表不能直接从本地文件导入数据,数据要先导入到 textfile 格式的表中, 然后再从表中用 insert 导入 SequenceFile,RCFile,ORCFile 表中。

列式存储和行式存储

首先我们看一下一张表的存储格式

image.png

行式存储

image.png

列式存储

image.png

列式存储和行式存储的比较

行式存储

优点:

  • 相关的数据是保存在一起,比较符合面向对象的思维,因为一行数据就是一条记录

  • 这种存储格式比较方便进行 INSERT/UPDATE 操作

缺点:

  • 如果查询只涉及某几个列,它会把整行数据都读取出来,不能跳过不必要的列读取。当然数据比较少,一般没啥问题,如果数据量比较大就比较影响性能

  • 由于每一行中,列的数据类型不一致,导致不容易获得一个极高的压缩比,也就是空间利用率不高

  • 不是所有的列都适合作为索引

列式存储

优点:

  • 查询时,只有涉及到的列才会被查询,不会把所有列都查询出来,即可以跳过不必要的列查询

  • 高效的压缩率,不仅节省储存空间也节省计算内存和 CPU

  • 任何列都可以作为索引

缺点:

  • INSERT/UPDATE 很麻烦或者不方便

  • 不适合扫描小量的数据

TEXTFILE

默认格式,数据不做压缩,磁盘开销大,数据解析开销大。

可结合 Gzip、Bzip2 使用 (系统自动检查,执行查询时自动解压),但使用这种方式,hive 不会对数据进行切分,从而无法对数据进行并行操作。

SEQUENCEFILE

SequenceFile 是 Hadoop API 提供的一种二进制文件支持,其具有使用方便、可分割、可压缩的特点。

SequenceFile 支持三种压缩选择:NONE,RECORD,BLOCK。Record 压缩率低,一般建议使用 BLOCK 压缩。

RCFILE

RCFILE 是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个 record 在一个块上,避免读一个记录需要读取多个 block。其次,块数据列式存储,有利于数据压缩和快速的列存取。

  • RCFile 保证同一的数据位于同一节点,因此元组重构代价较低 (需要将分散的数据重新组织, 比如一列数据散落在不同集群,查询的时候,需要将各个节点的数据重新组织;但是如果数据都在一个机器上,那就没有必要重新组织)

  • RCFile 通过列进行数据压缩,因为同一列都是相同的数据类型,所以压缩比比较好

  • RCFile 可以跳过不必要的列读取

从以上几点也可以看出它是兼顾了行式和列式存储的部分优点。

ORC File

ORCFile 存储格式,就是 Optimized RC File 的缩写。意指优化的 RCFile 存储格式。

ORC File 和 RC File 比较

  • 每一个任务只输出单个文件,这样可以减少 NameNode 的负载

  • 支持各种复杂的数据类型,比如 datetime,decimal, 以及复杂的 struct,List,map 等

  • 在文件中存储了轻量级的索引数据

  • 基于数据类型的块模式压缩:比如 Integer 类型使用 RLE(RunLength Encoding) 算法,而字符串使用字典编码 (DictionaryEncoding)

  • 使用单独的 RecordReader 并行读相同的文件

  • 无需扫描标记就能分割文件

  • 绑定读写所需要的内存

  • 元数据存储使用 PB, 允许添加和删除字段

Hive ROW FORMAT

Serde 是 Serializer/Deserializer 的简写。hive 使用 Serde 进行行对象的序列与反序列化。

你可以创建表时使用用户自定义的 Serde 或者 native Serde,如果 ROW FORMAT 没有指定或者指定了 ROW FORMAT DELIMITED 就会使用 native Serde。

hive 已经实现了许多自定义的 Serde,之前我们在介绍 stored 时也涉及到:

  • Avro (Hive 0.9.1 and later)

  • ORC (Hive 0.11 and later)

  • RegEx

  • Thrift

  • Parquet (Hive 0.13 and later)

  • CSV (Hive 0.14 and later)

  • JsonSerDe (Hive 0.12 and later)

Hive 写入数据的方式

和我们熟悉的关系型数据库不一样,Hive 现在还不支持在 insert 语句里面直接给出一组记录的文字形式,也就是说,Hive 并不支持 INSERT INTO …. VALUES 形式的语句。

从本地文件系统中导入数据到 Hive 表

load data local inpath ‘xxx.txt’ into table xxx;

从 HDFS 上导入数据到 Hive 表

load data inpath ‘/home/xxx/add.txt’ into table xxx

alter table db.access_log add partition (dt=‘18-09-18’) location ‘hdfs://ns/hive/warehouse/access_log/dt=18-09-18’;

从别的表中查询出相应的数据并导入到 Hive 表中

insert overwrite table db.log_v2 partition(dt=‘18-09-26’) select uid,model,key,value,time from db.log where dt=‘18-09-26’;

在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中

create table test4 as select id, name, tel from xxx;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值