浅谈数据仓库工具——Hive

avatar
@浙江数新网络有限公司

前言

Hadoop分布式文件系统(HDFS)因其高容错性、高吞吐量的特点,且适合部署在廉价的机器上,使其非常适合大批量数据的存储,但是如何快速地对HDFS上的文件进行统计分析操作呢?最初是靠写MapReduce编程进行分析,但是MR十分繁琐,而且对不熟悉Java的编程人员十分不友好。另外数据存储HDFS上是没有schema的概念的,这样就不能够使用SQL进行处理。在这种背景下,Hive产生了。Hive可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能。今天就给大家介绍下hive。

一、 Hive是什

最初,Hive是由Facebook开发,构建于hadoop集群之上的数据仓库应用,2008年Facebook将Hive项目贡献给Apache,成为开源项目之一。Hive 是基于 Hadoop 的一个数据仓库工具,Hive的数据存放在HDFS上,Hive表就是HDFS的一个文件目录,一个表名对应一个目录名,如果存在分区表的话,则分区值对应子目录名。Hive的本质,就是将 HQL 转化成 MapReduce 程序。底层执行支持MR/Spark/Tez形式。

二、 Hive的优缺点

优点:

  • 操作接口采用类SQL语法,简单易上手
  • 避免写MapReduce,减少开发人员学习成本
  • 内置大量的用户UDF来操作时间,字符串和其他数据挖掘工具,支持用户扩展UDF来完成内置函数无法完成的操作
  • 存储类型多样,支持纯文本文件,csv文件等等
  • 解决了传统关系型数据库在大数据处理上的瓶颈,适合大批量数据的处理
  • 良好的容错性,某节点出现问题SQL仍可完成执行

缺点:

  • HQL表达能力有限,一些复杂运算HQL不易表达
  • Hive 自动生成的 MapReduce 作业,通常情况下不够智能化
  • Hive自动生成的 MapReduce 作业,执行延迟较高
  • Hive调优比较困难,只能从SQL层面调优

三、 Hive架构

1.png

1. 客户端Client

  • Cli(hiveshell)

命令行接口,是最常用的一种用户接口,CLI 启动时会同时启动一个 Hive副本。在一个具备完整 Hive环境下的 Shell 终端中键入 hive 即可启动服务。不适合高并发的生产环境。

  • JDBC/ODBC

JDBC(Java Database Connectivity),是Java语言中用来规范客户端程序访问数据库的应用程序接口。

  • WebUI

HWI 是 Hive 的 web 方接口,提供了一种可以通过浏览器来访问 Hive 的服务(开发测试常用)。

2. 服务端组件

  • 元数据(Metastore)
  1. 元数据服务组件,这个组件用于存储 hive 的元数据,包括表名、表所属的数据库、表的拥有者、列/分区字段、表的类型、表的数据所在目录等内容。
  2. hive 的元数据存储在关系数据库里,支持 derby、mysql 两种关系型数据库。元数据对于 hive 十分重要,因此 hive 支持把 metastore 服务独立出来,安装到远程的服务器集群里,从而解耦 hive 服务和 metastore 服务,保证 hive 运行的健壮性。
  • Driver组件
  1. 解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL 语义是否有误。
  2. 编译器(Physical Plan):将AST编译生成逻辑执行计划。
  3. 优化器(Query Optimizer):对逻辑执行计划进行优化。
  4. 执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来说,一般常用的底层逻辑为 MR/TEZ/Spark。
  • 底层存储HDFS
  1. Hive使用HDFS进行存储,使用MapReduce进行计算

四、 Hive运行机制

运行原理:Hive 通过给用户提供的一系列交互接口来接收用户的指令(SQL),然后使用自己的 Driver,结合元数据 (MetaStore),将这些指令翻译成MapReduce,提交到 Hadoop 中执行,最后,将执行返回的结果输出到用户交互接口上。

图片

通俗来讲:

  1. 用户通过用户接口连接Hive,发布Hive SQL;
  2. Hive解析查询并制定查询计划;
  3. Hive将查询转换为MapReduce作业;
  4. Hive在hadoop上执行MapReduce作业;
  5. 将执行结果输出到用户交互接口上。

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

Hive除了提供类似SQL语法外和传统数据库没有任何相似之处。下面介绍下Hive与传统数据库的对比。

  • 查询语言
  1. Hive提供类SQL语法HQL
  2. 关系型数据库用SQL
  • 数据存储
  1. Hive数据存储在HDFS上
  2. 关系型数据库将数据存储在块设备或本地文件系统中
  • 数据格式
  1. Hive没有定义专门的数据格式,可由用户自定义,在自定义的时候可以指定三个属性:列分隔符,行分隔符,以及读取文件数据的方法
  2. 关系型数据库在建立时会指定或默认有存储引擎,存储引擎定义了自己的数据格式,所以数据都会按照一定的组织存储
  • 数据更新
  1. Hive不支持对数据的改写和删除,数据在加载的时候就确定好了,只允许读
  2. 关系型数据库中的数据支持更新,可读可写
  • 执行方式
  1. Hive是将HQL转化为MapReduce执行
  2. 关系型数据库是excutor执行
  • 执行延迟
  1. Hive没有索引,在查询数据时需要扫描整张表(或分区),延迟较高,处理大批量数据才具有优势
  2. 关系型数据库处理小量数据执行延迟低
  • 索引
  1. Hive没有索引
  2. 关系型数据库有索引
  • 数据规模
  1. Hive存储数据量非常大
  2. 关系型数据库存储数据量比较小

六、 Hive与HBase的对比

上文了解到Hive是建立在hadoop之上的数据仓库管理工具,本身是不存储数据和处理数据的,其依赖于HDFS来存储数据,依赖于MapReducer来处理数据,提供类SQL语法来快速实现MR任务。而HBase是一个分布式、可扩展、支持海量数据存储的NOSQL数据库。主要适用于海量数据的实时数据处理。那么Hive与HBase之间有什么关系呢,下面我们一起来了解下。

1. 共同点

Hive与HBase都是架构在Hadoop之上,底层以HDFS作为存储。

2. 区别

  • Hive适用于离线数据的批处理;HBase适用于实时数据的处理
  • Hive本身不存储和计算数据,它完全依赖于HDFS存储和MapReduce处理数据(它完全依赖于HDFS来存储数据、依赖MapReduce来处理数据),Hive中的表是逻辑表;HBase是物理表,内部提供一个超大内存hash表,搜索引擎通过它来存储索引,方便查询
  • Hive不支持随机读写操作;HBase支持随机读写

3. Hive与HBase协作

在大数据架构中,Hive和HBase是协作关系。下面举一个常用的协作关系介绍下。

图片

图解:

  • 采集的数据存到HBase中,HBase支持随机写操作
  • Hive中创建一张外部表与HBase表关联,只需对Hive表进行查询,会自动从关联的HBase表中获取数据
  • Hive编写HQL语句,转换为MR任务处理数据
  • 将分析的结果存储到数据库中,如MySQL
  • Web端从数据库获取数据进行可视化展示

 

七、 Linux安装Hive

相信通过上面的介绍大家已经了解了Hive,那么下面来实际安装一下Hive吧。

1. 软件环境

Hadoop版本2.6.0

Hive 版本2.1.1

2. 准备工作

提前下载好Hive安装包,下载地址:archive.apache.org/dist/hive/

选择对应的hive2.1.1版本,下载 apache-hive-2.1.1-bin.tar.gz 包。

11.png

Hive是基于Hadoop的,在安装Hive之前,要保证Hadoop已安装成功,Hive只需要在Hadoop集群的一个节点上安装即可。默认情况下,Hive元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的测试。为了支持多用户多会话,则需要一个独立的元数据库,我们使用 MySQL 作为元数据库,安装Hive之前还需要安装MySQL。Hadoop与MySQL的安装自行百度即可。

3. 安装Hive

  • 上传安装包

安装包可使用rz命令进行上传,或使用第三方工具如xftp进行上传。先从本地上传Hive安装文件apache-hive-2.1.1-bin.tar.gz到/root/soft

  • 解压Hive

#解压Hive到指定路径

12.png #修改Hive目录名称,方便以后使用

13.png     

  • 配置环境变量

14.png

#添加以下内容

export HIVE_HOME=/usr/local/hive-2.1.1export PATH=HIVEHOME/bin:HIVE_HOME/bin:PATH

#需source使环境变量生效

21.png

  • 配置hive-env.sh

若文件不存在,先将hive.env.sh.template复制一份 22.png

#添加以下内容

23.png

  • 配置hive-site.xml

拷贝hive-site.xml.template文件

24.png

#hive-site.xml中有两个重要的配置如下,需自定义文件路径

111.png

注意:要把原来的默认的derby的连接配置,连接驱动,用户,密码改成mysql 的

#添加以下内容

图片

  • 将mysql的驱动包mysql-connector-java-8.0.20.jar上传到hive的lib目录下

  • 初始化数据库

先cd到hive目录下,执行命令

图片  

  • 启动hive

(注:启动之前要启动hdfs sbin/start-dfs.sh 和yarn sbin/start-yarn.sh )

 图片

#查询数据库

图片

到此为止,hive已经正式部署完成并且可以使用了。

八、 Hive基本操作

1. Hive SQL介绍

Hive SQL,严谨来说是 HiveQL,简称 HQL,是 Hive 提供的一个 SQL 语法。Hive的查询操作过程严格遵守 Hadoop MapReduce 的作业执行模型,Hive 将用户的Hive SQL 语句通过解释器转换为 MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。HQL与SQL基本一样,设计的目的就是使得不会编程MR的开发人员也可以使用大数据框架处理大批量数据。

与SQL用法上的区别:

  • HQL不支持行级别的增、删、改操作,数据在加载时就已经确定
  • 不支持事务

2. DDL操作

DDL(data definittion language),数据定义语言,主要是定义或改变表的结构、数据类型、表之间的链接和约束等初始化操作。

2.1  数据库DDL操作

注:[]中的内容可省略,db_hive为数据库名

  • 创建数据库

语法:CREATE DATABASE [IF NOT EXISTS] db_hive其中[if not exists]可以省略,若省略,当创建的数据库存在,就会报错

  • 显示所有数据库

语法:SHOW DATABASE

  • 查询数据库

语法:SHOW DATABASE LIKE 'db_hive'

  • 查看数据库信息

#显示数据库信息

语法:DESC DATABASE db_hive

#显示数据库详细信息

语法:DESC DATABASE db_hive

  • 切换数据库

语法:USE db_hive

  • 删除数据库(谨慎操作)

#删除空数据库语法:DROP DATABASE [IF EXISTS] db_hive#若数据库中存在表,可使用cascade强制删除数据库

语法:DROP DATABASE [IF EXISTS] db_hive CASCADE

2.2  数据表DDL操作

2.2.1  创建表操作
  • 建表标准语句:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

[(col_name data_type [COMMENT col_comment], ...)][COMMENT table_comment][PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 分区[CLUSTERED BY (col_name, col_name, ...) 分桶[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS][ROW FORMAT row_format]  row format delimited fields terminated by “分隔符”[STORED AS file_format][LOCATION hdfs_path]

#解释说明

  1. CREATE TABLE 指创建一张表
  2. EXTERNAL 指创建一个外部表
  3. COMMENT 为表或列添加注释信息
  4. PARTITIONED BY 指创建分区表
  5. CLUSTERED BY 指创建分桶表
  6. SORTED BY 设置按照某字段排序
  7. ROW FORMAT 指定每行字段的分隔符,例如‘,’、‘\t’等分隔符
  8. STORED AS 指定存储文件类型,常用文件类型:TEXTFILE(文本)、ORCFILE(列式存储格式文件)
  9. LOCATION 指定表在HDFS上的存储位置
  • 查询建表

通过AS 查询语句完成建表:将子查询的结果存入新表里。语法:CREATE TABLE IF NOT EXISTS db_hive AS SELECT id, name FROM hive;

2.2.2  修改表操作
  • 表重命名

语句:ALTER TABLE db_hive RENAME TO db_hive2;

  • 添加列

语句:ALTER TABLE db_hive2 ADD COLUMNS(db_id int);

  • 修改列

#修改列名,列属性

语句:ALTER TABLE db_hive2 CHANGE db_id c_db_id string;

#替换列

语句:ALTER TABLE db_hive2 RELACE COLUMNS(id int,name string);

2.2.3  删除表操作

#删除无分区表

语句:DROP TABLE db_hive2;

#删除表分区

语句:ALTER TABLE db_hive2 DROP PARTITION(dt=’20220426’);

2.2.4  内/外部表
  • 内部表

又称管理表(MANAGED_TABLE),创建表默认是内部表,删除表时元数据和hdfs内数据均会被删除。

  • 外部表

用 EXTERNAL 关键字修饰的表为外部表。与内部表不同,删除外部表时仅删除元数据,真正的数据不会被删除。

  • 内外转换

#内部表 -> 外部表语法:ALTER TABLE db_hive SET TBLPROPERTIES('EXTERNAL'='TRUE');

#外部表 -> 内部表

语法:ALTER TABLE db_hive SET TBLPROPERTIES('EXTERNAL'='FALSE');

  • 使用场景

内部表由于删除表的时候会同步删除HDFS的数据文件,所以确定如果一个表仅仅是你独占使用,例如数据分析时的中间表,就可以创建内部表;

在实际生产环境中,涉及到共享数据一定要使用外部表,防止误操作导致的数据丢失。

3. DML操作

DML(data manipulation language):数据操作语言,主要是对数据库的数据进行增删改查操作。

3.1  数据导入

3.1.1  Load方式

语法:LOAD DATA [LOCAL] INPATH 'data path' [OVERWRITE] INTO TABLE tb_name [PARTITION (partcol1=val1,…)];

#解释说明

  1. LOAD DATA:表示加载数据
  2. LOCAL:表示从本地加载数据到hive表;若省略则表示从HDFS加载数据到hive
  3. INPATH:表示加载数据的路径,后跟数据路径
  4. OVERWRITE:表示覆盖表中数据,省略则表示追加数据
  5. INTO TABLE:表示加载到哪张表
  6. tb_name:具体表名
  7. PARTITION:表示上传到指定分区
3.1.2  Insert方式

#insert直接插入数据语法:INSERT INTO TABLE tb_name [PARTITION(month=’2022-04’)] VALUES(1,’y’);

#依据查询结果插入

语法:

  • INSERT INTO TABLE tb_name SELECT id,name FROM db_hive;
  • INSERT OVERWRITE TABLE tb_name SELECT id,name FROM db_hive;

#解释说明

  1. INSERT INTO:以追加方式插入数据
  2. INSERT OVERWRITE:会直接覆盖表中原有数据
3.1.3  As Select方式

#建表时根据查询结果创建表

语法:CREATE TABLE IF NOT EXISTS db_hive AS SELECT id,name FROM db_hive;

3.1.4  Import方式

语法:IMPORT TABLE db_hive FROM '/user/hive/warehouse/export/db_hive;注意:IMPORT一般结合EXPORT使用

3.2. 数据导入

3.2.1  Insert方式导出
  • 查询结果导出到本地

语法:INSERT OVERWRITE LOCAL DIRECTORY '/opt/hive/data/export/db_hive SELECT * FROM db_hive;

  • 查询结果格式化导出到本地

语法:INSERT OVERWRITE LOCAL DIRECTORY '/opt/hive/data/export/db_hive ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' SELECT * FROM db_hive;

  • 查询结果导出到HDFS上

语法:INSERT OVERWRITE DIRECTORY '/user/data/export/db_hive ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' SELECT * FROM db_hive;

3.2.2  Export方式导出

语法:EXPORT TABLE db_hive TO '/user/hive/warehouse/export/db_hive;EXPORT 和 IMPORT 主要用于两个 Hadoop 平台集群之间 Hive 表迁移。

3.3  数据清除

语法:TRUNCATE TABLE db_hive;

另一种方式:INSERT OVERWRITE TABLE db_hive select * from db_hive where 1=0;

注意:TRUNCATE 只能删除内部表,不能删除外部表的数据,删除数据需谨慎。

本期内容就到这里了,如果喜欢就点个关注吧,微信公众号搜索“数 新 网 络 科 技 号”可查看更多精彩内容~