前言:
💞💞大家好,我是书生♡,本篇文章主要分享的是大数据开发中hive的相关技术,什么是Hive?怎么使用Hive?怎么安装部署?希望大家看完这篇文章会有所帮助。也希望大家能够多多关注博主。博主会持续更新更多的优质好文!!!
💞💞前路漫漫,希望大家坚持下去,不忘初心,成为一名优秀的程序员
个人主页⭐: 书生♡
gitee主页🙋♂:闲客
专栏主页💞:大数据开发
博客领域💥:大数据开发,java编程,前端,算法,Python
写作风格💞:超前知识点,干货,思路讲解,通俗易懂
支持博主💖:关注⭐,点赞、收藏⭐、留言💬
目录
- 1. Apache Hive 概述
- 1.1 什么是Hive
- 1.2 元数据和行数据
- 1.3 Hive的优点(了解)
- 2. Hive架构原理
- 2.1 用户接口
- 2.2 HiveDriver hive驱动
- 2.3 Metastore元数据存储
- 2.4 执行计算任务
- 3. Hive的部署
- 3.1 HIve的三种安装模式
- 3.1.1 内嵌模式
- 3.1.2 本地模式
- 3.1.3 远程模式
- 3.1.4 区分三种模式
- 3.2 Hive的部署安装
- 4. Hive的客户端
- 4.1 本地模式使用
- 4.2 远程模式使用
- 5. Datagrip使用(连接Hive)
- 6. Hive的数据库操作
- 6.1 数据库的创建
- 6.2 切换数据库
- 6.3 删除数据库
- 6.4 查看数据库信息/建库语句
- 7. hive的数据表操作
- 7.1 建表语法
- 7.2 表的创建
- 7.3 表数据的写入
- 8.hive基础语法
- 8.1数字字段类型
- 8.2 分隔符指定
- 9 表的删除,修改,分类
- 9.1 表的修改
- 9.2 表的删除
- 9.3 表的分类
- 10. 表数据的写入
- 10.1 方式一 将数据文件上传到对应的表目录下
- 10.0.1 使用hdfs页面进行上传
- 10.1.2 使用hivesql的load语句上传
- 10.2 方式2 使用insert指定数据导入
- 10.3将表数据导出到服务器
1. Apache Hive 概述
1.1 什么是Hive
什么是Hive?
Hive是基于Hadoop的一个数据仓库工具,用于进行数据提取、转换和加载(ETL)。它可以将结构化的数据文件映射为一张数据库表,并提供类似SQL的查询语言(HiveQL),使用户能够使用SQL语句来查询、汇总和整理大规模的数据集。Hive的核心功能包括数据存储、数据查询、数据处理、数据转换以及数据安全控制等。
简单的定义就是:
Hive是一个SQL转化转化工具,将SQL的计算转为MapReduce的计算,让开发人员更加方便进行大数据开发
1.2 元数据和行数据
什么是元数据?什么是行数据?
一张表的数据构成:元数据
- 表名
- 字段名
- 字段类型
- 字段约束
表的行数据:表中每一行的数据
在mysql,oracle等数据库中,表的元数据和行数是数据库统一管理
在Hive中:
在hive中表的元数据和行数据由metastore和hdfs共同管理
- 表的元数据由metastore管理存储
- 行数据由hdfs管理存储
1.3 Hive的优点(了解)
1.使用Hadoop MapReduce直接处理数据所面临的问题
- 人员学习成本太高 需要掌握java、Python等编程语言
- MapReduce实现复杂查询逻辑开发难度太大
- 使用Hive处理数据的好处
- 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)
- 底层执行MapReduce,可以完成分布式海量数据的SQL处理
2. Hive架构原理
Apache Hive其2大主要组件就是:SQL解析器以及元数据存储
2.1 用户接口
Hive为我们提供了3个接口,或者是说3种客户端模式:
- CLI(command line interface)为shell命令行
- Hive中的Thrift服务器允许外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议。(最常用的)
- Hive Web interface是通过浏览器访问Hive。(一般不用)
Hive提供了 Hive Shell、 ThriftServer等服务进程向用户提供操作接口
2.2 HiveDriver hive驱动
Driver:包括解析器、计划编译器、优化器、执行器
- 解析sql语句
- 指定计划
- 优化计划
- 执行命令
这部分主要是依赖封装在Hive所依赖的Jar文件即Java代码
2.3 Metastore元数据存储
- 元数据包含:用Hive创建的database、table、表的字段等元信息。
- 元数据存储:存在关系型数据库中,如:hive内置的Derby数据库或者第三方MySQL数据库等。
Metastore:即元数据存储服务,作用是:客户端连接metastore服务,metastore再去连接MySQL等数据库来存取元数据。
有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL等数据库的用户名和密码,只需要连接metastore 服务即可。
2.4 执行计算任务
- 向yarn申请资源
- 从hdfs中提取数据
3. Hive的部署
3.1 HIve的三种安装模式
- metastore服务配置有3种模式:内嵌模式、本地模式、远程模式
3.1.1 内嵌模式
优点:
解压hive安装包 bin/hive 启动即可使用
缺点:
不适用于生产环境,derby和Metastore服务都嵌入在主Hive Server进程中。一个服务只能被一个客户端连接(如果用两个客户端以上就非常浪费资源),且元数据不能共享
3.1.2 本地模式
优点:
1、元数据使用外置的RDBMS,常见使用最多的是MySQL。
2、不需要单独配置metastore 也不需要单独启动metastore服务
缺点:
如果使用多个客户端进行访问,就需要有多个Hiveserver服务,此时会启动多个Metastore有可能出现资源竞争现象
3.1.3 远程模式
优点:
可以单独使用外部库(mysql) 可以共享元数据 可以连接metastore服务也可以连接hiveserver2服务
metastore可以单独启动,配置 其他依赖hive的软件都可以通过Metastore访问hive
缺点:
需要注意的是如果想要启动hiveserver2服务需要先启动metastore服务
企业中也是最常用这种模式。
3.1.4 区分三种模式
区分3种配置方式的关键是弄清楚两个问题:
Metastore服务是否需要单独配置、单独启动?
Metadata是存储在内置库derby中,还是第三方库Mysql等中。
3.2 Hive的部署安装
hive只需要部署在一台服务器上就可以,也可部署在多台服务器上。
- 上传安装包 解压
先进入到指定的目录下,解压安装包
cd /export/server/
tar zxvf /export/server/apache-hive-3.1.2-bin.tar.gz
- 解决Hive与Hadoop之间guava版本差异
大家直接复制粘贴就可以这部分
rm -rf /export/server/apache-hive-3.1.2-bin/lib/guava-19.0.jar
cp /export/server/hadoop-3.3.0/share/hadoop/common/lib/guava-27.0-jre.jar /export/server/apache-hive-3.1.2-bin/lib/
- 配置环境变量
echo 'export HIVE_HOME=/export/server/apache-hive-3.1.2-bin' >> /etc/profile
echo 'export PATH=$PATH:$HIVE_HOME/bin:$HIVE_HOME/sbin' >> /etc/profile
source /etc/profile
- 修改配置文件
4.1 修改hive-env.sh
- 修改文件名称
cd /export/server/apache-hive-3.1.2-bin/conf
mv hive-env.sh.template hive-env.sh
写入数据
echo 'export HIVE_CONF_DIR=/export/server/hive/conf' >> /export/server/hive/hive-env.sh
echo 'export HIVE_CONF_DIR=/export/server/hive/conf' >> /export/server/hive/hive-env.sh
echo 'export HIVE_AUX_JARS_PATH=/export/server/hive/lib' >> /export/server/hive/conf/hive-env.sh
4.2 修改hive-site.xml
- 打开文件
vim hive-site.xml # 配置元数据存储
复制粘贴如下内容
<configuration>
<!-- 存储元数据mysql相关配置 -->
<property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:mysql://node1:3306/hive3?createDatabaseIfNotExist=true&useSSL=false</value>
</property><property><name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value>
</property><property><name>javax.jdo.option.ConnectionUserName</name><value>root</value>
</property><property><name>javax.jdo.option.ConnectionPassword</name><value>hadoop</value>
</property><!-- H2S运行绑定host -->
<property><name>hive.server2.thrift.bind.host</name><value>node1</value>
</property><!-- 远程模式部署metastore metastore地址 -->
<property><name>hive.metastore.uris</name><value>thrift://node1:9083</value>
</property><!-- 关闭元数据存储授权 -->
<property><name>hive.metastore.event.db.notification.api.auth</name><value>false</value>
</property>
</configuration>
- 上传mysql jdbc驱动
驱动上传到/export/server/apache-hive-3.1.2-bin/lib/
目录下
mysql-connector-java-5.1.32.jar
- 初始化元数据
schematool -initSchema -dbType mysql -verbos
#初始化成功会在mysql中创建74张表
- 在hdfs创建hive存储目录
hadoop fs -mkdir /tmp
hadoop fs -mkdir -p /user/hive/warehouse
hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hive/warehouse
4. Hive的客户端
hive依赖于hadoop的功能才能正常使用,所以启动hive前必须先启动hadoop.
start-all.sh
检查mysql服务是否可以使用
systemctl status mysqld
4.1 本地模式使用
使用一代客户端在本地服务器上连接hive完成sql操作
需要先把metastore的元数据管理服务启动起来
启动metastore服务
hive --service metastore
但是这个样子我们就没有办法继续使用服务器了,所以我们一般让他在后台运行
nohup hive --service metastore &
使用一代客户端连接,不需要输入账号密码
直接输入:
hive
4.2 远程模式使用
可以在其他服务器中连接hive进行相关操作
可以使用二代客户端进行连接,二代客户端支持jdbc,并且需要使用账号进行登录
- 启动metastore服务
这个我们再上面已经启动过了 - 启动hiveserver2服务
- 底层调用thriftserver
- 运行服务支持jdbc连接
nohup hive --service hiveserver2 &
hiveserver2的启动时间
会比较长
,可以通过端口查看确认hiveserver2是否真的启动
hiveserver2运行时会绑定10000端口
lsof -i:10000
使用hive自带的二代客户端,通过jdbc方式连接hive
beeline
5. Datagrip使用(连接Hive)
前提: 启动metastore 和hiveserver2服务
Datagrip连接hive服务,本质上链接的是hiveserver2
- 点击Datag Source 选择Apache Hive
- 填写相关服务器信息
第一次创建Hive,会要求下载驱动,有两种办法
第一种:进入页面后会提示下载驱动,直接点击downLoad下载
第二种:就是将本地的驱动直接部署上来
点击apache hive
点击test connection验证连接,当连接成功时,点击ok就可以使用了
6. Hive的数据库操作
6.1 数据库的创建
语法:
CREATE DATABASE [IF NOT EXISTS] database_name
-- 指定数据库在hdfs上路径位置
[LOCATION hdfs_path][] 括起来内容是可选的关键字语法
Hive sql中创建数据库可以指定路径
- 按照默认的路径创建数据库
-- 在hive中不需要指定charset
create database itcast;
-- 一但创建成功会在hdfs的默认路径下出现一个数据库目录 在hdfs的/user/hive/warehousw
create database if not exists itcast;
- 指定hdfs的路径目录作为数据库目录
-- 指定数据库在hdfs上的路径目录
-- 1-现在hdfs上创建一个空的数据库目录
-- 2-指定该空目录作为hive数据库的数据目录
create database itheima
location '/itheima';
6.2 切换数据库
-- use 切换数据库
use itcast;
use itheima;
6.3 删除数据库
-- 删除数据库 将 hdfs上的数据库目录一并删除
drop database itcast;
drop database itheima;
-- 如果数据库已经存在表数据,则需要强制删除 在有数据的情况下不要删库
drop database itcast cascade ;
6.4 查看数据库信息/建库语句
-- 查看数据库信息
desc database itheima;-- 查看建库语句
show create database itcast;
7. hive的数据表操作
7.1 建表语法
语法:
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name -- (Note: [(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])][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][SKEWED BY (col_name, col_name, ...) -- (Note: Available in Hive ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)[STORED AS DIRECTORIES][[ROW FORMAT row_format] [STORED AS file_format]| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)] -- (Note: Available in Hive 0.6.0 and later)][LOCATION hdfs_path][TBLPROPERTIES (property_name=property_value, ...)] -- (Note: Available in Hive 0.6.0 and later)[AS select_statement]; -- (Note: Available in Hive 0.5.0 and later; not supported for external tables)
基本语法:
create table [库名].表名(字段 字段类型
);
7.2 表的创建
-- 表的基本创建
-- 表创建成功后会在对应数据库目录下创建一个表目录
create table itcast.tb_stu(id int,-- 在hive中字符类型使用stringname string,gender string,age int,create_time date,-- decimal 类型表示小数 10 整数部分的个数+小数据部分的个数 2 表示小数位数height decimal(10,2)
);create table itheima.tb_goods(id int,name string,price decimal(10,2),create_time date
);
7.3 表数据的写入
-- 表数据写入
-- 数据是文件的方式存储在对应的表目录下
insert into itcast.tb_stu values
(1,'张三','男',20,'2023-10-10',178.23),
(2,'李四','男',21,'2023-10-11',175.23);-- 查看表数据
select * from itcast.tb_stu;
8.hive基础语法
8.1数字字段类型
数据类型官网:数据类型🤞🤞🤞
数值型:
- 整数
tinyint
smallint
int
bigint- 小数
float
double
decimal()精确到小数点后几位- 日期类型
data 日期
timestamps 日期时间- 字符串类型
string
varchar
char- 布尔类型
用1和0表示真假- 复杂类型
array【】数组类型
【1,2,3】,【‘a’,‘b’,‘c’】- map类型
{key:value}
hive数据类型案例:
-- hive中的数据类型演示
use itcast;
-- 创建表
create table tb_test(id tinyint comment 'id值',age smallint comment '年龄',phone int comment '手机号',name varchar(20),gender string,weight decimal(10,2),create_time timestamp,hobby array<string> comment '兴趣爱好', -- [数据1] arrary<数组中的数据类型>hero map<string,int> comment '游戏英雄' -- {key:value} 指定key值类型,指定value值类型
)comment '数据类型测试表';-- 写入数据进行类型测试
insert into tb_test values(1,20,13711111111,'张三','男',180.21,'2020-10-01 10:10:10',array('篮球','足球'),map('关羽',80,'小乔',60));
insert into tb_test values(2000,20,13711111111,'张三','男',1800.21,'2020-10-01 10:10:10',array('篮球','足球'),map('关羽',80,'小乔',60));select * from tb_test;
select hobby[1] from tb_test;
select hero['关羽'] from tb_test;
8.2 分隔符指定
对hdfs上的文件数据存储时的分割符进行指定
hive在将行数据存储在hdfs上时,默认字段之间的数据分隔符 \001
在创建表时可以指定分割符
row format delimited fields terminated by '分割符'
案例:
create table tb_row_field
(id int,name string,age int,gender string
) row format delimited fields terminated by ','; -- 指定分隔符 固定格式
我们制定分隔符为‘,’,文件就可以以我们制定个字符分割
9 表的删除,修改,分类
名字修改,字段名修改,字段类型修改
使用:
alter 关键字
9.1 表的修改
alter table 表名 rename to 新的表名
alter table 表名 add columns(字段名 字段类型)
alter table 表名 change 旧字段名 新字段 字段类型
alter table 表名 set 属性设置
-- 表的修改修改操作
create table tb_ddl(id int,name string,age int,gender string
);desc formatted tb_ddl2;-- 修改表名
alter table tb_ddl rename to tb_ddl2;-- 增加字段
alter table tb_ddl2 add columns(phone string);-- 修改字段
alter table tb_ddl2 change id id bigint;
desc tb_ddl2;
-- 修改字段类型是,只能将小字节的类型修改为大字节的类型
-- alter table tb_ddl2 change id id int;-- 修改表属性
alter table tb_ddl2 set tblproperties('age12'='20');
desc formatted tb_ddl2;-- hdfs://node1:8020/user/hive/warehouse/itcast.db/tb_ddl2
alter table tb_ddl2 set location 'hdfs://node1:8020/tb_ddl2';
desc formatted tb_ddl2;
insert into tb_ddl2 values(1,'aa',20,'ccc','123123123');alter table tb_ddl2 add columns(create_time date comment '创建时间',price decimal(10,2));
desc tb_ddl2;
alter table tb_ddl2 change age age1 string after phone;
desc tb_ddl2;
alter table tb_ddl2 change age1 age double after id;
desc tb_ddl2;
9.2 表的删除
在hive中我们想要删除表包括目录的元数据,使用**drop、只想清空数据使用truncate**
-- 表删除 会删除表的目录和表的元数据信息
drop table tb_ddl2;
select * from tb_ddl2;
-- 表清空数据 把存储数据的文件一并删除
select * from tb_row_field;
truncate table tb_row_field;
9.3 表的分类
hive中表的分类分为两种:
- 内部类 Managed Tabel
- 外部类 External Tables
区别:
在删除表时
内部表会把表的所有数据删除(元数据和行数据)
外部表会把表的元数据删除,保留hdfs上的文件数据
默认创建的表都是内部表
创建外部表需要使用关键字External
create external table 表名(字段 字段类型
)
案例:
-- 创建内部表
create table tb_managed(id int,name string
);
-- 创建外部表
create external table tb_external(id int,name string
);desc formatted tb_managed;
desc formatted tb_external;drop table tb_managed;
drop table tb_external;
修改表的类型,将内部表设置为外部表,或者将外部表设置为内部表
我们使用
tblproperties(‘EXTERNAL’=‘FALSE’); false为内部表
tblproperties(‘EXTERNAL’=‘TRUE’);true为外部表;
-- 修改表的类型
desc formatted tb_managed;
alter table tb_managed set tblproperties('EXTERNAL'='TRUE'); -- 设置为外部表
alter table tb_managed set tblproperties('EXTERNAL'='FALSE');-- 设置为内部表
10. 表数据的写入
在对表数据写入时有两张方式
- 方式一 直接将数据文件上传到指定的表目录下
- 方式二 通过insert将数据写入的表目录的文件中
10.1 方式一 将数据文件上传到对应的表目录下
10.0.1 使用hdfs页面进行上传
10.1.2 使用hivesql的load语句上传
语法:
LOAD DATA [LOCAL] INPATH 'filepath'
[OVERWRITE] INTO TABLE tablename
[PARTITION (partcol1=val1, partcol2=val2 ...)]
-- filepath 指定本地服务器的数据文件位置 ,本地指的是hive运行的服务器
案例:
-- 使用load语句将文件数据上传表中
-- file:// 是本地文件的路径协议,是一个固定写法
-- 追加
load data local inpath 'file:///root/order5.txt' into table tb_order;-- 覆盖上传文件
load data local inpath 'file:///root/order5.txt' overwrite into table tb_order;
10.2 方式2 使用insert指定数据导入
我们正常使用insert into tb_order values,结果是追加的。
我们可以使用overwrite去进行覆盖,将之前的全部结果覆盖成新插入的
语法:
INSERT OVERWRITE TABLE tablename1
[PARTITION (partcol1=val1, partcol2=val2 ...)
[IF NOT EXISTS]] select_statement1 FROM from_statement;
insert into tb_order values (1,123.23,5,'北京');insert overwrite table tb_order values (2,123.23,5,'上海');-- 写入数据是在values中指定
-- 也可以将一个select 查询结果写到表中
create table tb_order_new(id int,total_price decimal(10,2),total_number int,address string
)row format delimited fields terminated by ',';insert into tb_order_new select * from tb_order;-- 通过该方式可以实现计算结果的保存
create table tb_result(cnt int comment '总数'
);insert into tb_result select count(*) from tb_order;select * from tb_result;
10.3将表数据导出到服务器
insert overwrite local directory 'file:///root/data'row format delimited fields terminated by ',' select * from tb_order;