1)Hive简介
Hive是由Facebook开源,基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。
2)Hive本质
Hive是一个Hadoop客户端,用于将HQL(Hive SQL)转化成MapReduce程序。
(1)Hive中每张表的数据存储在HDFS
(2)Hive分析数据底层的实现是MapReduce(也可配置为Spark或者Tez)
(3)执行程序运行在Yarn上
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):执行该计划,得到查询结果并返回给客户端
4)Hadoop
使用HDFS进行存储,可以选择MapReduce/Tez/Spark进行计算。
1)Hive官网地址
http://hive.apache.org/
2)文档查看地址
https://cwiki.apache.org/confluence/display/Hive/GettingStarted
3)下载地址
http://archive.apache.org/dist/hive/
4)github地址
GitHub - apache/hive: Apache 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文件
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默认使用的元数据库为derby。derby数据库的特点是同一时间只允许一个客户端访问。如果多个Hive客户端同时访问,就会报错。由于在企业开发中,都是多人协作开发,需要多客户端同时访问Hive,怎么解决呢?我们可以将Hive的元数据改为用MySQL存储,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
1)新建Hive元数据库
#登录MySQL
mysql -uroot -p123456
#创建Hive元数据库
mysql> create database metastore;
mysql> quit;
2)将MySQL的JDBC驱动拷贝到Hive的lib目录下。
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.ConnectionURL jdbc:mysql://hadoop102:3306/metastore?useSSL=false javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword 123456 hive.metastore.warehouse.dir /user/hive/warehouse
5)初始化Hive元数据库(修改为采用MySQL存储元数据)
bin/schematool -dbType mysql -initSchema -verbose
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;
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.host hadoop102 hive.server2.thrift.port 10000
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连接
选择默认库并数据查询
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.ConnectionURL jdbc:mysql://hadoop102:3306/metastore?useSSL=false javax.jdo.option.ConnectionDriverName com.mysql.jdbc.Driver javax.jdo.option.ConnectionUserName root javax.jdo.option.ConnectionPassword 123456
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
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常见属性配置
1)Hive客户端显示当前库和表头
(1)在hive-site.xml中加入如下两个配置:
vim hive-site.xml
hive.cli.print.header true Whether to print the names of the columns in query output. hive.cli.print.current.db true Whether to include the current database in the Hive prompt.
(2)hive客户端在运行时可以显示当前使用的库和表头信息
/opt/module/hive/bin/hive
3)Hive的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
-- 创建数据库,不指定路径
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 ;
上一篇:判断是否为平衡树