浅谈数据仓库工具——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 中执行,最后,将执行返回的结果输出到用户交互接口上。

通俗来讲:

  1. 用户通过用户接口连接Hive,发布Hive SQL;

  2. Hive解析查询并制定查询计划;

  3. Hive将查询转换为MapReduce作业;

  4. Hive在hadoop上执行MapReduce作业;

  5. 将执行结果输出到用户交互接口上。

五、 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 只能删除内部表,不能删除外部表的数据,删除数据需谨慎。

以上就是本期的全部内容了,欢迎关注我们了解更多精彩内容~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值