大数据-数据仓库-Hive应用

一、关于Hive

1.1 什么是Hive

Hive是构建在Hadoop之上的数据仓库软件。它提供类似sql的查询语句HiveQL对数据进行分析处理,Hive将HiveQL语句转换成一系列MapReduce作业并执行。
目前,Hive除了支持MapReduce计算引擎,还支持Spark和Tez这两种分布式计算引擎,常用于离线批处理。
http://hive.apache.org/

1.2 什么是数据仓库

数据仓库(Data Warehouse),是一个面向主题、集成的、随时间变化的,但信息本身相对稳定的数据集合,用于对管理决策过程的支持。

大数据-数据仓库-Hive应用_第1张图片
https://www.jianshu.com/p/0b6414f92442

1.3 Hive的特点
  1. 可通过类SQL来分析大数据,避免了写MapReduce程序来分析数据;
  2. 数据存储在HDFS上,Hive本身不提供数据的存储功能;
  3. Hive将数据映射成数据库和一张张表,库和表的元数据信息一般存在关系型数据库上(如MySQL);
  4. 数据存储方面:可以存储很大的数据集,对数据完整性、格式要求并不严格;
  5. 数据处理方面:不适用于实时计算的场景,适用于离线分析。

二、Hive的体系结构

Hive的元数据:包括表的名字、列、分区、属性(内/外部表)以及表数据所在目录等。将元数据存储在数据库中(metastore),支持mysql、derby、oracle等数据库。
解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后由MapReduce调用生成。
大数据-数据仓库-Hive应用_第2张图片

三、Hive重要概念

3.1 外部表和内部表
内部表(managed table)
  • 默认创建的是内部表,即 create table xxx (xx xxx),存储位置在 hive.metastore.warehouse.dir 设置,默认位置为 /user/hive/warehouse
  • 导入数据的时候是将文件剪切到指定位置,即原有路径下文件将不再存在
  • 删除表时,数据和元数据都将被删除
外部表(external table)
  • 外部表可以在外部系统上,只要有访问权限即可
  • 外部表导入文件时不移动文件,仅仅是添加一个metadata
  • 删除外部表时元数据不会被删除
  • 分辨外部表、内部表可以用 DESCRIBE FORMATTED table_name 命令查看
  • 创建外部表命令添加一个external即可,即 create external table xxx (xxx)
  • 外部表指向的数据发生变化时会自动更新,不用特殊处理
3.2 分区表和桶表
分区(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进行查询时,可以快速确定数据存在于哪个桶中,而只遍历一个桶可以提高查询效率
3.3 Hive文件格式
Hive文件存储格式包括以下几类:
  • TEXTFILE
  • SEQUENCEFILE
  • RCFILE
  • ORCFILE( 0.11以后出现)

其中,TEXTFILE为默认格式,导入数据时会直接将数据文件copy到hdfs上不进行处理;
其他三种格式的表不能直接从本地文件导入数据,数据要先导入到 TEXTFILE 格式的表中,然后再从表中用 insert 导入 SequenceFile,RCFile,ORCFile 表中。

3.4 列式存储和行式存储
Hive文件存储格式包括以下几类:

先来看一张表的存储格式:
大数据-数据仓库-Hive应用_第3张图片

行式存储:

在这里插入图片描述
优点:

  • 相关数据保存在一起,较符合面向对象的思维,一行数据就是一条记录
  • 便于进行insert/update操作

缺点:

  • 如果查询只涉及某几个列,他会把整行数据都读取处理,不能跳过不必要的列读取,在数据量较大时影响性能
  • 每行中,列的数据类型不一致,导致不容易获得一个较高的压缩比,即空间利用率不高
  • 不是所有的列都适合作为索引
列式存储:

在这里插入图片描述
优点:

  • 查询时,只有涉及到的列才会被查询,不需遍历所有的列
  • 压缩率较高,节省存储空间及计算内存
  • 任何列均可作为索引

缺点:

  • insert/update 较麻烦
  • 不适合小量数据的扫描提取

四、Hive写入数据方式

  1. 从本地文件系统中导入数据到Hive表
load data local inpath 'xxx.txt' into table xxx
  1. 从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';
  1. 从别的表中查询出相应的数据并导入到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';
  1. 在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中
create table test4 as select id, name, tel from xxx

五、Hive与关系型数据库对比

HQL SQL
数据存储 HDFS、Hbase Local FS
数据格式 用户自定义 系统决定
数据更新 不支持(将之前的数据覆盖) 支持
索引 有(0.8版之后增加)
执行 MapReduce Executor
执行延迟
可扩展性 高(UDF、UDAF、UDTF)
数据规模 大(数据量大于TB)
数据检查 读时模式 写时模式

Hive在0.8之后增加的索引为位图索引,而传统SQL有复杂的索引。

UDF(User-Defined-Function) 一进一出;

UDAF(User- Defined Aggregation Funcation) 聚集函数,多进一出;

UDTF(User-Defined Table-Generating Functions) 一进多出,如lateral view explore()。

六、Hive优化

1、在大数据场景下不担心数据体量问题,需要注意的是数据倾斜。而避免数据倾斜,关键在于找到可能导致数据倾斜的函数,在数据量较大时,需慎用 count(distinct) 等;
2、设置合理的map reduce 的task数量。

参考资料:

https://zhuanlan.zhihu.com/p/46210633
https://zhuanlan.zhihu.com/p/82859179
https://zhuanlan.zhihu.com/p/46210633
https://www.jianshu.com/p/b3e618c8af86
偏技术:
https://blog.csdn.net/youyou1543724847/article/details/83446908

你可能感兴趣的:(大数据-数据仓库-Hive应用)