Hadoop分布式文件系统(HDFS)因其高容错性、高吞吐量的特点,且适合部署在廉价的机器上,使其非常适合大批量数据的存储,但是如何快速地对HDFS上的文件进行统计分析操作呢?最初是靠写MapReduce编程进行分析,但是MR十分繁琐,而且对不熟悉Java的编程人员十分不友好。另外数据存储HDFS上是没有schema的概念的,这样就不能够使用SQL进行处理。在这种背景下,Hive产生了。Hive可以将结构化的数据文件映射为一张数据库表,并提供简单的SQL查询功能。今天就给大家介绍下hive。
最初,Hive是由Facebook开发,构建于hadoop集群之上的数据仓库应用,2008年Facebook将Hive项目贡献给Apache,成为开源项目之一。
Hive 是基于 Hadoop 的一个数据仓库工具,Hive的数据存放在HDFS上,Hive表就是HDFS的一个文件目录,一个表名对应一个目录名,如果存在分区表的话,则分区值对应子目录名。Hive的本质,就是将 HQL 转化成 MapReduce 程序。底层执行支持MR/Spark/Tez形式。
优点:
操作接口采用类SQL语法,简单易上手
避免写MapReduce,减少开发人员学习成本
内置大量的用户UDF来操作时间,字符串和其他数据挖掘工具,支持用户扩展UDF来完成内置函数无法完成的操作
存储类型多样,支持纯文本文件,csv文件等等
解决了传统关系型数据库在大数据处理上的瓶颈,适合大批量数据的处理
良好的容错性,某节点出现问题SQL仍可完成执行
缺点:
HQL表达能力有限,一些复杂运算HQL不易表达
Hive 自动生成的 MapReduce 作业,通常情况下不够智能化
Hive自动生成的 MapReduce 作业,执行延迟较高
Hive调优比较困难,只能从SQL层面调优
Cli(hiveshell)
命令行接口,是最常用的一种用户接口,CLI 启动时会同时启动一个 Hive副本。在一个具备完整 Hive环境下的 Shell 终端中键入 hive 即可启动服务。不适合高并发的生产环境。
JDBC/ODBC
JDBC(Java Database Connectivity),是Java语言中用来规范客户端程序访问数据库的应用程序接口。
WebUI
HWI 是 Hive 的 web 方接口,提供了一种可以通过浏览器来访问 Hive 的服务(开发测试常用)。
元数据(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 通过给用户提供的一系列交互接口来接收用户的指令(SQL),然后使用自己的 Driver,结合元数据 (MetaStore),将这些指令翻译成MapReduce,提交到 Hadoop 中执行,最后,将执行返回的结果输出到用户交互接口上。
通俗来讲:
用户通过用户接口连接Hive,发布Hive SQL;
Hive解析查询并制定查询计划;
Hive将查询转换为MapReduce作业;
Hive在hadoop上执行MapReduce作业;
将执行结果输出到用户交互接口上。
Hive除了提供类似SQL语法外和传统数据库没有任何相似之处。下面介绍下Hive与传统数据库的对比。
查询语言
Hive提供类SQL语法HQL
关系型数据库用SQL
数据存储
Hive数据存储在HDFS上
关系型数据库将数据存储在块设备或本地文件系统中
数据格式
Hive没有定义专门的数据格式,可由用户自定义,在自定义的时候可以指定三个属性:列分隔符,行分隔符,以及读取文件数据的方法
关系型数据库在建立时会指定或默认有存储引擎,存储引擎定义了自己的数据格式,所以数据都会按照一定的组织存储
数据更新
Hive不支持对数据的改写和删除,数据在加载的时候就确定好了,只允许读
关系型数据库中的数据支持更新,可读可写
执行方式
Hive是将HQL转化为MapReduce执行
关系型数据库是excutor执行
执行延迟
Hive没有索引,在查询数据时需要扫描整张表(或分区),延迟较高,处理大批量数据才具有优势
关系型数据库处理小量数据执行延迟低
索引
Hive没有索引
关系型数据库有索引
数据规模
Hive存储数据量非常大
关系型数据库存储数据量比较小
上文了解到Hive是建立在hadoop之上的数据仓库管理工具,本身是不存储数据和处理数据的,其依赖于HDFS来存储数据,依赖于MapReducer来处理数据,提供类SQL语法来快速实现MR任务。而HBase是一个分布式、可扩展、支持海量数据存储的NOSQL数据库。主要适用于海量数据的实时数据处理。那么Hive与HBase之间有什么关系呢,下面我们一起来了解下。
Hive与HBase都是架构在Hadoop之上,底层以HDFS作为存储。
Hive适用于离线数据的批处理;HBase适用于实时数据的处理
Hive本身不存储和计算数据,它完全依赖于HDFS存储和MapReduce处理数据(它完全依赖于HDFS来存储数据、依赖MapReduce来处理数据),Hive中的表是逻辑表;HBase是物理表,内部提供一个超大内存hash表,搜索引擎通过它来存储索引,方便查询
Hive不支持随机读写操作;HBase支持随机读写
在大数据架构中,Hive和HBase是协作关系。下面举一个常用的协作关系介绍下。
图解:
采集的数据存到HBase中,HBase支持随机写操作
Hive中创建一张外部表与HBase表关联,只需对Hive表进行查询,会自动从关联的HBase表中获取数据
Hive编写HQL语句,转换为MR任务处理数据
将分析的结果存储到数据库中,如MySQL
Web端从数据库获取数据进行可视化展示
相信通过上面的介绍大家已经了解了Hive,那么下面来实际安装一下Hive吧。
Hadoop版本2.6.0
Hive 版本2.1.1
提前下载好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的安装自行百度即可。
上传安装包
安装包可使用rz命令进行上传,或使用第三方工具如xftp进行上传。
先从本地上传Hive安装文件apache-hive-2.1.1-bin.tar.gz到/root/soft
解压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 SQL,严谨来说是 HiveQL,简称 HQL,是 Hive 提供的一个 SQL 语法。Hive的查询操作过程严格遵守 Hadoop MapReduce 的作业执行模型,Hive 将用户的Hive SQL 语句通过解释器转换为 MapReduce 作业提交到Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。
HQL与SQL基本一样,设计的目的就是使得不会编程MR的开发人员也可以使用大数据框架处理大批量数据。
与SQL用法上的区别:
HQL不支持行级别的增、删、改操作,数据在加载时就已经确定
不支持事务
DDL(data definittion language),数据定义语言,主要是定义或改变表的结构、数据类型、表之间的链接和约束等初始化操作。
注:[]中的内容可省略,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.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.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.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 表迁移。
语法:TRUNCATE TABLE db_hive;
另一种方式:INSERT OVERWRITE TABLE db_hive select * from db_hive where 1=0;
注意:TRUNCATE 只能删除内部表,不能删除外部表的数据,删除数据需谨慎。
以上就是本期的全部内容了,欢迎关注我们了解更多精彩内容~