大数据-Hive
创始人
2024-05-22 22:42:59
0

第1章 Hive入门

1.1 什么是Hive

1Hive简介

Hive是由Facebook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。

2Hive本质

Hive是一个Hadoop客户端,用于将HQL(Hive SQL)转化成MapReduce程序。

(1)Hive中每张表的数据存储在HDFS

(2)Hive分析数据底层的实现是MapReduce(也可配置为Spark或者Tez) 

(3)执行程序运行在Yarn上

1.2 Hive架构原理

1用户接口:Client

CLI(command-line interface)、JDBC/ODBC。

说明:JDBC和ODBC的区别。

(1)JDBC的移植性比ODBC好;(通常情况下,安装完ODBC驱动程序之后,还需要经过确定的配置才能够应用。而不相同的配置在不相同数据库服务器之间不能够通用。所以,安装一次就需要再配置一次。JDBC只需要选取适当的JDBC数据库驱动程序,就不需要额外的配置。在安装过程中,JDBC数据库驱动程序会自己完成有关的配置。)

(2)两者使用的语言不同,JDBC在Java编程时使用,ODBC一般在C/C++编程时使用。

2元数据:Metastore

元数据包括:数据库(默认是default)、表名、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。

默认存储在自带的derby数据库中,由于derby数据库只支持单客户端访问,生产环境中为了多人开发,推荐使用MySQL存储Metastore。

3驱动器:Driver

 

(1)解析器(SQLParser):将SQL字符串转换成抽象语法树(AST)

(2)语义分析(Semantic Analyzer):将AST进一步划分为QeuryBlock

(3)逻辑计划生成器(Logical Plan Gen):将语法树生成逻辑计划

(4)逻辑优化器(Logical Optimizer):对逻辑计划进行优化

(5)物理计划生成器(Physical Plan Gen):根据优化后的逻辑计划生成物理计划

(6)物理优化器(Physical Optimizer):对物理计划进行优化

(7)执行器(Execution):执行该计划,得到查询结果并返回给客户端

4Hadoop

使用HDFS进行存储,可以选择MapReduce/Tez/Spark进行计算。

第2章 Hive安装

2.1 Hive安装地址

1Hive官网地址

http://hive.apache.org/

2文档查看地址

https://cwiki.apache.org/confluence/display/Hive/GettingStarted

3下载地址

http://archive.apache.org/dist/hive/

4github地址

GitHub - apache/hive: Apache Hive

2.2 Hive安装部署

2.2.1 安装Hive

#修改名字
cd /opt/module
mv apache-hive-3.1.3-bin/ hive
添加环境变量
sudo vim /etc/profile.d/my_env.sh#HIVE_HOME
export HIVE_HOME=/opt/module/hive
export PATH=$PATH:$HIVE_HOME/binsource /etc/profile.d/my_env.sh
进入目录 并初始化数据库cd /opt/module/hive/bin./schematool -dbType derby -initSchema

生成db文件

2.2.2 启动并使用Hive

1)启动Hive

./hive

2)使用Hive

show databases;show tables;create table stu(id int, name string);
insert into stu values(1,"ss");select * from stu;

观察HDFS的路径/user/hive/warehouse/stu,体会Hive与Hadoop之间的关系。

Hive中的表在Hadoop中是目录;Hive中的数据在Hadoop中是文件。

 

3)在Xshell窗口中开启另一个窗口开启Hive,在/tmp/root目录下监控hive.log文件

 tail -500 /tmp/root/hive.log

Caused by: ERROR XSDB6: Another instance of Derby may have already booted the database /opt/module/hive/metastore_db.at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.privGetJBMSLockOnDB(Unknown Source)at org.apache.derby.impl.store.raw.data.BaseDataFileFactory.run(Unknown Source)...

原因在于Hive默认使用的元数据库为derbyderby数据库的特点是同一时间只允许一个客户端访问。如果多个Hive客户端同时访问,就会报错。由于在企业开发中,都是多人协作开发,需要多客户端同时访问Hive,怎么解决呢?我们可以将Hive的元数据改为用MySQL存储,MySQL支持多客户端同时访问。

2.3 MySQL安装

2.3.1 安装MySQL

1)上传MySQL安装包以及MySQL驱动jar包

mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

mysql-connector-java-5.1.37.jar

2)解压MySQL安装包

 mkdir mysql_lib

 tar -xf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C mysql_lib/

3)卸载系统自带的mariadb

 sudo rpm -qa | grep mariadb | xargs sudo rpm -e --nodeps

4安装MySQL依赖

 cd mysql_lib

 sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm

 sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm

 sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm

5安装mysql-client

 sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm

6安装mysql-server

 sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm

2.4 配置Hive元数据存储到MySQL

2.4.1 配置元数据MySQL

1)新建Hive元数据库

#登录MySQL

mysql -uroot -p123456

#创建Hive元数据库

mysql> create database metastore;

mysql> quit;

2MySQLJDBC驱动拷贝到Hivelib目录下。

cp /opt/software/mysql-connector-java-5.1.37.jar $HIVE_HOME/lib

3)在$HIVE_HOME/conf目录下新建hive-site.xml文件

vim $HIVE_HOME/conf/hive-site.xml

添加如下内容:

javax.jdo.option.ConnectionURLjdbc:mysql://hadoop102:3306/metastore?useSSL=falsejavax.jdo.option.ConnectionDriverNamecom.mysql.jdbc.Driverjavax.jdo.option.ConnectionUserNamerootjavax.jdo.option.ConnectionPassword123456hive.metastore.warehouse.dir/user/hive/warehouse

5)初始化Hive元数据库(修改为采用MySQL存储元数据)

bin/schematool -dbType mysql -initSchema -verbose

2.4.2 验证元数据是否配置成功

1)再次启动Hive

[atguigu@hadoop102 hive]$ bin/hive

2)使用Hive

hive> show databases;

hive> show tables;

hive> create table stu(id int, name string);

hive> insert into stu values(1,"ss");

hive> select * from stu;

3)在Xshell窗口中开启另一个窗口开启Hive(两个窗口都可以操作Hive,没有出现异常)

hive> show databases;

hive> show tables;

hive> select * from stu;

2.5 Hive服务部署

2.5.1 hiveserver2服务

Hive的hiveserver2服务的作用是提供jdbc/odbc接口,为用户提供远程访问Hive数据的功能,例如用户期望在个人电脑中访问远程服务中的Hive数据,就需要用到Hiveserver2。

1)hiveserver2部署

(1)Hadoop端配置

hivesever2的模拟用户功能,依赖于Hadoop提供的proxy user(代理用户功能),只有Hadoop中的代理用户才能模拟其他用户的身份访问Hadoop集群。因此,需要将hiveserver2的启动用户设置为Hadoop的代理用户,配置方式如下:

修改配置文件core-site.xml,然后记得分发三台机器

 cd $HADOOP_HOME/etc/hadoopvim core-site.xml

增加如下配置:

hadoop.proxyuser.root.hosts*hadoop.proxyuser.root.groups*hadoop.proxyuser.root.users*

(2)Hive端配置

在hive-site.xml文件中添加如下配置信息

vim hive-site.xml

hive.server2.thrift.bind.hosthadoop102hive.server2.thrift.port10000

3)重启hadoop

 /usr/local/myhadoop.sh stop/usr/local/myhadoop.sh start

3)测试

(1)启动hiveserver2 

cd /opt/module/hive
nohup bin/hiveserver2 >/dev/null 2>&1 &

(2)使用命令行客户端beeline进行远程访问

启动beeline客户端,

 bin/beeline

 输入 !connect jdbc:hive2://hadoop2:10000
输入root
按下enter跳过

(3)使用Datagrip图形化客户端进行远程访问

4)配置DataGrip连接

选择默认库并数据查询 

2.5.2 metastore服务

Hive的metastore服务的作用是为Hive CLI或者Hiveserver2提供元数据访问接口。

1)metastore运行模式

metastore有两种运行模式,分别为嵌入式模式和独立服务模式。下面分别对两种模式进行说明:

 2)独立服务模式

生产环境中,不推荐使用嵌入式模式。因为其存在以下两个问题:

(1)嵌入式模式下,每个Hive CLI都需要直接连接元数据库,当Hive CLI较多时,数据库压力会比较大。

(2)每个客户端都需要用户元数据库的读写权限,元数据库的安全得不到很好的保证。

2)metastore部署

(1)嵌入式模式

嵌入式模式下,只需保证Hiveserver2和每个Hive CLI的配置文件hive-site.xml中包含连接元数据库所需要的以下参数即可:

    javax.jdo.option.ConnectionURLjdbc:mysql://hadoop102:3306/metastore?useSSL=falsejavax.jdo.option.ConnectionDriverNamecom.mysql.jdbc.Driverjavax.jdo.option.ConnectionUserNamerootjavax.jdo.option.ConnectionPassword123456

2.5.3 编写Hive服务启动脚本(了解)

1)为了方便使用,可以直接编写脚本来管理服务的启动和关闭

 vim $HIVE_HOME/bin/hiveservices.sh

内容如下:此脚本的编写不要求掌握。直接拿来使用即可。

#!/bin/bashHIVE_LOG_DIR=$HIVE_HOME/logsif [ ! -d $HIVE_LOG_DIR ]thenmkdir -p $HIVE_LOG_DIRfi#检查进程是否运行正常,参数1为进程名,参数2为进程端口function check_process(){pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)echo $pid[[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1}function hive_start(){metapid=$(check_process HiveMetastore 9083)cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"[ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动"server2pid=$(check_process HiveServer2 10000)cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"[ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动"}function hive_stop(){metapid=$(check_process HiveMetastore 9083)[ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"server2pid=$(check_process HiveServer2 10000)[ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"}case $1 in"start")hive_start;;"stop")hive_stop;;"restart")hive_stopsleep 2hive_start;;"status")check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常";;*)echo Invalid Args!echo 'Usage: '$(basename $0)' start|stop|restart|status';;esac

3)添加执行权限

 chmod +x $HIVE_HOME/bin/hiveservices.sh

4)启动Hive后台服务

 hiveservices.sh start

2.6 Hive使用技巧

2.6.1 Hive常用交互命令

1)在Hive命令行里创建一个表student,并插入1条数据

hive (default)> create table student(id int,name string);OKTime taken: 1.291 secondshive (default)> insert into table student values(1,"zhangsan");hive (default)> select * from student;OKstudent.id student.name1 zhangsanTime taken: 0.144 seconds, Fetched: 1 row(s)

2)“-e”不进入hive的交互窗口执行hql语句

 bin/hive -e "select id from student;"

3)“-f”执行脚本中的hql语句

(1)在/opt/module/hive/下创建datas目录并在datas目录下创建hivef.sql文件

 mkdir datasvim hivef.sql

(2)文件中写入正确的hql语句

select * from student;

(3)执行文件中的hql语句

 bin/hive -f /opt/module/hive/datas/hivef.sql

(4)执行文件中的hql语句并将结果写入文件中

 bin/hive -f /opt/module/hive/datas/hivef.sql  > /opt/module/hive/datas/hive_result.txt

2.6.3 Hive常见属性配置

1Hive客户端显示当前库和表头

(1)在hive-site.xml中加入如下两个配置:

vim hive-site.xml

hive.cli.print.headertrueWhether to print the names of the columns in query output.hive.cli.print.current.dbtrueWhether to include the current database in the Hive prompt.

(2)hive客户端在运行时可以显示当前使用的库和表头信息

/opt/module/hive/bin/hive

3Hive的JVM堆内存设置

新版本的Hive启动的时候,默认申请的JVM堆内存大小为256M,JVM堆内存申请的太小,导致后期开启本地模式,执行复杂的SQL时经常会报错:java.lang.OutOfMemoryError: Java heap space,因此最好提前调整一下HADOOP_HEAPSIZE这个参数。

(1)修改$HIVE_HOME/conf下的hive-env.sh.template为hive-env.sh

3DDL(Data Definition Language数据定义

3.1 数据库(database)

3.1.1 创建数据库

-- 创建数据库,不指定路径
create database db_hive1;
-- 创建一个数据库,指定路径
create database db_hive2 location '/db_hive2';
-- 创建一个数据库,带有dbproperties
create database db_hive3 with dbproperties ('create_date'='2022-11-18');

3.1.2 查询数据库

-- 查看数据库
show databases ;
show databases like 'db*';-- 查看数据库信息
describe database db_hive3;
-- 查看数据库详细信息
describe database extended db_hive3 ;

 3.1.3 修改数据库

alter database db_hive3 set dbproperties ('create_date'='2022-11-20');

3.1.4 删除数据库

-- 删除数据库
drop database db_hive2 ;
-- 删除非空数据库
drop database db_hive3 cascade ;

3.2 表(table)

3.2.1 创建表 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...