浅谈数据仓库工具——Hive
前言
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. 客户端 Client
Cli(hiveshell)
命令行接口,是最常用的一种用户接口,CLI 启动时会同时启动一个 Hive 副本。在一个具备完整 Hive 环境下的 Shell 终端中键入 hive 即可启动服务。不适合高并发的生产环境。
JDBC/ODBC
JDBC(Java Database Connectivity),是 Java 语言中用来规范客户端程序访问数据库的应用程序接口。
WebUI
HWI 是 Hive 的 web 方接口,提供了一种可以通过浏览器来访问 Hive 的服务(开发测试常用)。
2. 服务端组件
元数据(Metastore)
元数据服务组件,这个组件用于存储 hive 的元数据,包括表名、表所属的数据库、表的拥有者、列/分区字段、表的类型、表的数据所在目录等内容。
hive 的元数据存储在关系数据库里,支持 derby、mysql 两种关系型数据库。元数据对于 hive 十分重要,因此 hive 支持把 metastore 服务独立出来,安装到远程的服务器集群里,从而解耦 hive 服务和 metastore 服务,保证 hive 运行的健壮性。
Driver 组件
解析器(SQL Parser):将 SQL 字符串转换成抽象语法树 AST,这一步一般都用第三方工具库完成,比如 antlr;对 AST 进行语法分析,比如表是否存在、字段是否存在、SQL 语义是否有误。
编译器(Physical Plan):将 AST 编译生成逻辑执行计划。
优化器(Query Optimizer):对逻辑执行计划进行优化。
执行器(Execution):把逻辑执行计划转换成可以运行的物理计划。对于 Hive 来说,一般常用的底层逻辑为 MR/TEZ/Spark。
底层存储 HDFS
Hive 使用 HDFS 进行存储,使用 MapReduce 进行计算
四、 Hive 运行机制
运行原理:Hive 通过给用户提供的一系列交互接口来接收用户的指令(SQL),然后使用自己的 Driver,结合元数据 (MetaStore),将这些指令翻译成 MapReduce,提交到 Hadoop 中执行,最后,将执行返回的结果输出到用户交互接口上。
通俗来讲:
用户通过用户接口连接 Hive,发布 Hive SQL;
Hive 解析查询并制定查询计划;
Hive 将查询转换为 MapReduce 作业;
Hive 在 hadoop 上执行 MapReduce 作业;
将执行结果输出到用户交互接口上。
五、 Hive 与关系型数据库的对比
Hive 除了提供类似 SQL 语法外和传统数据库没有任何相似之处。下面介绍下 Hive 与传统数据库的对比。
查询语言
Hive 提供类 SQL 语法 HQL
关系型数据库用 SQL
数据存储
Hive 数据存储在 HDFS 上
关系型数据库将数据存储在块设备或本地文件系统中
数据格式
Hive 没有定义专门的数据格式,可由用户自定义,在自定义的时候可以指定三个属性:列分隔符,行分隔符,以及读取文件数据的方法
关系型数据库在建立时会指定或默认有存储引擎,存储引擎定义了自己的数据格式,所以数据都会按照一定的组织存储
数据更新
Hive 不支持对数据的改写和删除,数据在加载的时候就确定好了,只允许读
关系型数据库中的数据支持更新,可读可写
执行方式
Hive 是将 HQL 转化为 MapReduce 执行
关系型数据库是 excutor 执行
执行延迟
Hive 没有索引,在查询数据时需要扫描整张表(或分区),延迟较高,处理大批量数据才具有优势
关系型数据库处理小量数据执行延迟低
索引
Hive 没有索引
关系型数据库有索引
数据规模
Hive 存储数据量非常大
关系型数据库存储数据量比较小
六、 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 安装包,下载地址:https://archive.apache.org/dist/hive/
选择对应的 hive2.1.1 版本,下载 apache-hive-2.1.1-bin.tar.gz 包。
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 到指定路径
#修改 Hive 目录名称,方便以后使用
配置环境变量
#添加以下内容
export HIVE_HOME=/usr/local/hive-2.1.1
export PATH=$HIVE_HOME/bin:$PATH
#需 source 使环境变量生效
配置 hive-env.sh
若文件不存在,先将 hive.env.sh.template 复制一份
#添加以下内容
配置 hive-site.xml
拷贝 hive-site.xml.template 文件
#hive-site.xml 中有两个重要的配置如下,需自定义文件路径
注意:要把原来的默认的 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]
#解释说明
CREATE TABLE 指创建一张表
EXTERNAL 指创建一个外部表
COMMENT 为表或列添加注释信息
PARTITIONED BY 指创建分区表
CLUSTERED BY 指创建分桶表
SORTED BY 设置按照某字段排序
ROW FORMAT 指定每行字段的分隔符,例如‘,’、‘\t’等分隔符
STORED AS 指定存储文件类型,常用文件类型:TEXTFILE(文本)、ORCFILE(列式存储格式文件)
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,…)];
#解释说明
LOAD DATA:表示加载数据
LOCAL:表示从本地加载数据到 hive 表;若省略则表示从 HDFS 加载数据到 hive
INPATH:表示加载数据的路径,后跟数据路径
OVERWRITE:表示覆盖表中数据,省略则表示追加数据
INTO TABLE:表示加载到哪张表
tb_name:具体表名
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;
#解释说明
INSERT INTO:以追加方式插入数据
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 只能删除内部表,不能删除外部表的数据,删除数据需谨慎。
本期内容就到这里了,如果喜欢就点个关注吧,微信公众号搜索“数 新 网 络 科 技 号”可查看更多精彩内容~
版权声明: 本文为 InfoQ 作者【数新网络官方账号】的原创文章。
原文链接:【http://xie.infoq.cn/article/5cc02c6d1ff1768e78b941e75】。文章转载请联系作者。
评论