大数据学习之Hive

1. Hive的简介

Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张

数据库表,并提供类 SQL 查询功能。

其本质是将 SQL 转换为 MapReduce/Spark 的任务进行运算,底层由 HDFS 来提供

数据的存储。

hive 的特点:

1. 可扩展 : Hive 可以自由的扩展集群的规模,一般情况下不需要重启服务。
2. 延展性 : Hive 支持用户自定义函数,用户可以根据自己的需求来实现自
己的函数。
3. 容错 : 良好的容错性,节点出现问题 SQL 仍可完成执行。

2. Hive表类型

2.1 Hive 数据类型

Hive 的基本数据类型有:

TINYINT,SAMLLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,
STRING,TIMESTAMP(V0.8.0+)和 BINARY(V0.8.0+)。

Hive 的集合类型有:STRUCT,MAP 和 ARRAY。

Hive 主要有四种数据模型(即表):内部表、外部表、分区表和桶表

2.2 内部表和外部表

2.2.1 内部表

内部表(Internal table)也称为被Hive拥有和管理的托管表(Managed table)。默认情况下创建的表就是内部表,Hive拥有该表的结构和文件。换句话说,Hive完全管理表(元数据和数据)的生命周期,类似于RDBMS中的表。

当删除内部表时,它会删除数据以及表的元数据

2.2.2 外部表

外部表(External table)中的数据不是Hive拥有或管理的,只管理表元数据的生命周期。要创建一个外部表,需要使用EXTERNAL语法关键字。

删除外部表只会删除元数据,而不会删除实际数据。在Hive外部仍然可以访问实际数据。

而且外部表更为方便的是可以搭配location语法指定数据的路径。

2.2.3 内部表、外部表差异

无论内部表还是外部表,Hive都在Hive Metastore中管理表定义及其分区信息。删除内部表会从Metastore中删除表元数据,还会从HDFS中删除其所有数据/文件。

删除外部表,只会从Metastore中删除表的元数据,并保持HDFS位置中的实际数据不变。

2.2.4 如何选择内部表、外部表

当需要通过Hive完全管理控制表的整个生命周期时,请使用内部表。

当文件已经存在或位于远程位置时,请使用外部表,因为即使删除表,文件也会被保留

2.3 分区表和分桶表

2.3.1 分区表

  • 分区表的概念、创建

当Hive表对应的数据量大、文件多时,为了避免查询时全表扫描数据,Hive支持根据用户指定的字段进行分区,分区的字段可以是日期、地域、种类等具有标识意义的字段。比如把一整年的数据根据月份划分12个月(12个分区),后续就可以查询指定月份分区的数据,尽可能避免了全表扫描查询

  • 静态分区

所谓静态分区指的是分区的字段值是由用户在加载数据的时候手动指定的。

语法如下:

load data [local] inpath ' ' into table tablename partition(分区字段='分区值'...);sql

Local表示数据是位于本地文件系统还是HDFS文件系统。

  • 动态分区

往hive分区表中插入加载数据时,如果需要创建的分区很多,则需要复制粘贴修改很多sql去执行,效率低。因为hive是批处理系统,所以hive提供了一个动态分区功能,其可以基于查询参数的位置去推断分区的名称,从而建立分区。

所谓动态分区指的是分区的字段值是基于查询结果自动推断出来的。核心语法就是insert+select。

启用hive动态分区,需要在hive会话中设置两个参数:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

第一个参数表示开启动态分区功能,第二个参数指定动态分区的模式。分为nonstick非严格模式和strict严格模式。strict严格模式要求至少有一个分区为静态分区。

  • 分区表的本质

分区的概念提供了一种将Hive表数据分离为多个文件/目录的方法。不同分区对应着不同的文件夹,同一分区的数据存储在同一个文件夹下。只需要根据分区值找到对应的文件夹,扫描本分区下的文件即可,避免全表数据扫描。

  • 分区表的使用

分区表的使用重点在于:

一、建表时根据业务场景设置合适的分区字段。比如日期、地域、类别等;
二、查询的时候尽量先使用where进行分区过滤,查询指定分区的数据,避免全表扫描。
  • 分区表的注意事项
1. 分区表不是建表的必要语法规则,是一种 优化手段表,可选;
2. 分区 字段不能是表中已有的字段,不能重复;
3. 分区字段是 虚拟字段,其数据并不存储在底层的文件中;
4. 分区字段值的确定来自于用户价值数据手动指定( 静态分区)或者根据查询结果位置自动推断( 动态分区
5. Hive 支持多重分区,也就是说在分区的基础上继续分区,划分更加细粒度

2.3.2 分桶表

  • 分桶表的概念

桶表也叫做桶表,源自建表语法中bucket单词。是一种用于优化查询而设计的表类型。该功能可以让数据分解为若干个部分易于管理。

在分桶时,我们要指定根据哪个字段将数据分为几桶(几个部分)。默认规则是:Bucket number = hash_function(bucketing_column) mod num_buckets。

可以发现桶编号相同的数据会被分到同一个桶当中。hash_function取决于分桶字段bucketing_column的类型:

如果是int类型,hash_function(int) == int;

如果是其他类型,比如bigint,string或者复杂数据类型,hash_function比较棘手,将是从该类型派生的某个数字,比如hashcode值。

  • 分桶表的语法
--分桶表建表语句
CREATE [EXTERNAL] TABLE [db_name.]table_name
[(col_name data_type, ...)]
CLUSTERED BY (col_name)
INTO N BUCKETS;

其中CLUSTERED BY (col_name)表示根据哪个字段进行分;

INTO N BUCKETS表示分为几桶(也就是几个部分)。

需要注意的是,分桶的字段必须是表中已经存在的字段。

  • 分桶表的使用好处

和非分桶表相比,分桶表的使用好处有以下几点:

1.基于分桶字段查询时,减少全表扫描
2.JOIN时可以提高MR程序效率,减少笛卡尔积数量
对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了分桶操作。那么将保存相同列值的桶进行JOIN操作就可以,可以大大较少JOIN的数据量。
3.分桶表数据进行抽样
当数据量特别大时,对全体数据进行处理存在困难时,抽样就显得尤其重要了。抽样可以从被抽取的数据中估计和推断出整体的特性,是科学实验、质量检验、社会调查普遍采用的一种经济有效的工作和研究方法。

2.3.3 Hive 视图

在 Hive 中,视图是逻辑数据结构,可以通过隐藏复杂数据操作(Joins, 子查询, 过滤,数据扁平化)来于简化查询操作。

与关系数据库不同的是,Hive 视图并不存储数据或者实例化。一旦创建 HIve 视图,它的 schema 也会立刻确定下来。对底层表后续的更改(如 增加新列)并不会影响视图的 schema。如果底层表被删除或者改变,之后对视图的查询将会failed。基于以上 Hive view 的特性,我们在 ETL 和数据仓库中对于经常变化的表应慎重使用视图

3. Hive的计算引擎

目前 Hive 支持 MapReduce、Tez 和 Spark 三种计算引擎

3.1 MR 计算引擎

  • MR 运行的完整过程:

Map 在读取数据时,先将数据拆分成若干数据,并读取到 Map 方法中被处理。数据在输出的时候,被分成若干分区并写入内存缓存(buffer)中,内存缓存被数据填充到一定程度会溢出到磁盘并排序,当 Map 执行完后会将一个机器上输出的临时文件进行归并存入到 HDFS 中。

当 Reduce 启动时,会启动一个线程去读取 Map 输出的数据,并写入到启动 Reduce机器的内存中,在数据溢出到磁盘时会对数据进行再次排序。当读取数据完成后会将临时文件进行合并,作为Reduce 函数的数据源。

3.2 Tez 计算引擎

Apache Tez 是进行大规模数据处理且支持 DAG 作业的计算框架,它直接源于MapReduce 框架,除了能够支持 MapReduce 特性,还支持新的作业形式,并允许不同类型的作业能够在一个集群中运行。

Tez 将原有的 Map 和 Reduce 两个操作简化为一个概念——Vertex,并将原有的计算处理节点拆分成多个组成部分:Vertex Input、Vertex Output、Sorting、Shuffling 和 Merging。计算节点之间的数据通信被统称为 Edge,这些分解后的元操作可以任意灵活组合,产生新的操作,这些操作经过一些控制程序组装后,可形成一个大的 DAG 作业。通过允许 Apache Hive 运行复杂的 DAG 任务,Tez 可以用来处理数据,之前需要多个 MR jobs,现在一个 Tez 任务中。

3.3 Tez 和 MapReduce 作业的比较

Tez 绕过了 MapReduce 很多不必要的中间的数据存储和读取的过程,直接在一个作业中表达了 MapReduce 需要多个作业共同协作才能完成的事情。

Tez 和 MapReduce 一样都运行使用 YARN 作为资源调度和管理。但与MapReduce on YARN 不同,Tez on YARN 并不是将作业提交到ResourceManager,而是提交到 AMPoolServer 的服务上,AMPoolServer存放着若干已经预先启动 ApplicationMaster 的服务。

当用户提交一个作业上来后,AMPoolServer 从中选择一个ApplicationMaster 用于管理用户提交上来的作业,这样既可以节省ResourceManager 创建 ApplicationMaster 的时间,而又能够重用每个ApplicationMaster 的资源,节省了资源释放和创建时间。

3.4 Tez 相比于 MapReduce 有几点重大改进

当查询需要有多个 reduce 逻辑时,Hive 的 MapReduce 引擎会将计划分解,每个 Redcue 提交一个 MR 作业。这个链中的所有 MR 作业都需要逐个调度,每个作业都必须从 HDFS 中重新读取上一个作业的输出并重新洗牌。而在Tez 中,几个 reduce 接收器可以直接连接,数据可以流水线传输,而不需要临时 HDFS 文件,这种模式称为 MRR(Map-reduce-reduce*)。

Tez 还允许一次发送整个查询计划,实现应用程序动态规划,从而使框架能够更智能地分配资源,并通过各个阶段流水线传输数据。对于更复杂的查询来说,这是一个巨大的改进,因为它消除了 IO/sync 障碍和各个阶段之间的调度开销。

在 MapReduce 计算引擎中,无论数据大小,在洗牌阶段都以相同的方式执行,将数据序列化到磁盘,再由下游的程序去拉取,并反序列化。Tez 可以允许小数据集完全在内存中处理,而 MapReduce 中没有这样的优化。仓库查询经常需要在处理完大量的数据后对小型数据集进行排序或聚合,Tez 的优化也能极大地提升效率。

3.5 Spark 计算引擎

Apache Spark 是专为大规模数据处理而设计的快速、通用支持 DAG(有向无环图)作业的计算引擎,类似于 Hadoop MapReduce 的通用并行框架,可用来构建大型的、低延迟的数据分析应用程序。

Spark 是用于大规模数据处理的统一分析引擎,基于内存计算,提高了在大数据环境下数据处理的实时性,同时保证了高容错性高可伸缩性,允许用户将 Spark部署在大量硬件之上,形成集群。

4. Hive数据压缩

4.1 优缺点

  • 优点:

减少存储磁盘空间,降低单节点的磁盘IO。
由于压缩后的数据占用的带宽更少,因此可以加快数据在Hadoop集群流动的速度,减少网络传输带宽。
  • 缺点:

需要花费额外的时间/CPU做压缩和解压缩计算。

4.2 压缩分析

首先说明mapreduce哪些过程可以设置压缩:需要分析处理的数据在进入map前可以压缩,然后解压处理,map处理完成后的输出可以压缩,这样可以减少网络I/O(reduce通常和map不在同一节点上),reduce拷贝压缩的数据后进行解压,处理完成后可以压缩存储在hdfs上,以减少磁盘占用量。

4.3 Hadoop中支持的压缩算法

压缩格式

压缩格式所在的类

Zlib

org.apache.hadoop.io.compress.DefaultCodec

Gzip

org.apache.hadoop.io.compress.GzipCodec

Bzip2

org.apache.hadoop.io.compress.BZip2Codec

Lzo

com.hadoop.compression.lzo.LzoCodec

Lz4

org.apache.hadoop.io.compress.Lz4Codec

Snappy

org.apache.hadoop.io.compress.SnappyCodec

4.4 Hive的压缩设置

  • 开启hive中间传输数据压缩功能

1)开启hive中间传输数据压缩功能

set hive.exec.compress.intermediate=true;

2)开启mapreduce中map输出压缩功能

set mapreduce.map.output.compress=true;

3)设置mapreduce中map输出数据的压缩方式

set mapreduce.map.output.compress.codec=org.apache.hadoop.io.compress.SnappyCodec;
  • 开启Reduce输出阶段压缩

1)开启hive最终输出数据压缩功能

set hive.exec.compress.output=true;

2)开启mapreduce最终输出数据压缩

set mapreduce.output.fileoutputformat.compress=true;

3)设置mapreduce最终数据输出压缩方式

set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;

4)设置mapreduce最终数据输出压缩为块压缩

set mapreduce.output.fileoutputformat.compress.type=BLOCK;

5. Hive数据存储格式

Hive 支持的存储数的格式主要有:TEXTFILE(行式存储) 、SEQUENCEFILE(行式存储)、ORC(列式存储)、PARQUET(列式存储)。

5.1 列式存储和行式存储

逻辑表中的数据,最终需要落到磁盘上,以文件的形式存储,有两种常见的存储形式。行式存储和列式存储。

5.1.1 行式存储

  • 优点:

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

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

  • 缺点:

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

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

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

5.1.2 列式存储

  • 优点:

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

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

任何列都可以作为索引;

  • 缺点:

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

不适合扫描小量的数据

5.2 TEXTFILE格式

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

5.3 ORC格式

ORC的全称是(Optimized Row Columnar),ORC文件格式是一种Hadoop生态圈中的列式存储格式,它的产生早在2013年初,最初产生自Apache Hive,用于降低Hadoop数据存储空间和加速Hive查询速度。它并不是一个单纯的列式存储格式,仍然是首先根据行组分割整个表,在每一个行组内进行按列存储。

优点如下:

1. ORC是列式存储,有多种文件压缩方式,并且有着很高的压缩比。
2. 文件是可切分(Split)的。因此,在Hive中使用ORC作为表的文件存储格式,不仅节省HDFS存储资源,查询任务的输入数据量减少,使用的MapTask也就减少了。
3. ORC可以支持复杂的数据结构(比如Map等)。
4. ORC文件也是以二进制方式存储的,所以是不可以直接读取,ORC文件也是自解析的。

5.4 PARQUET格式

Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目。

Parquet文件是以二进制方式存储的,所以是不可以直接读取的,文件中包括该文件的数据和元数据,因此Parquet格式文件是自解析的。

通常情况下,在存储Parquet数据的时候会按照Block大小设置行组的大小,由于一般情况下每一个Mapper任务处理数据的最小单位是一个Block,这样可以把每一个行组由一个Mapper任务处理,增大任务执行并行度。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值