0%

Hadoop-16-Hive1

IDEA的扩展功能

之前每次我们想要去修改集群中的一些配置文件,采用的方式是vim,这种方式对于非常熟悉vim命令的程序员来说是很方便的,但是对于我们大多数初学者很不友好。前面我们使用过IDEA去编写Java代码,这种方式十分高效,那么如果可以使用IDEA去直接修改配置文件,那我们代码的编写效率就可以大大提升了。

IDEA中是有这样的功能的,接下来我们一起操作。

依次点击工具->部署->浏览远程主机

image-20230803215128330

这个时候会弹出以下界面,比如我们想要连接hadoop102,我们可以在其中填写以下内容:

  • 名称:hadoop102
  • 类型:SFTP

image-20230803215434728

接下来点击图示中的...选择SSH配置。

image-20230803215607779

此时点击+去添加一个SSH配置,然后填入hadoop102SSH登录信息。

image-20230803215639250

填写完毕后,点击测试连接。

image-20230803215724106

显示成功连接就说明SSH连接是正常的,接下来每个页面中都点击确定。

image-20230803215818785

这个时候在右侧的侧边栏中就会多出一个选项,点击该选项后就可以查看远程的主机文件信息。

我们可以直接在该界面中操作远程服务器的文件系统,比如去修改配置文件获取是上传文件,都十分方便。

例如我们点击之前在hadoop中的配置文件core-site.xml

image-20230803220014447

双击打开文件。

打开完毕后,会在当前本地的IDEA中打开配置文件。

image-20230803220047914

并且在文件上方会显示当前文件与远程文件是否存在差异,如果我们修改了就是存在差异,会提示我们文件已修改,是否上传到远程主机进行修改,我们想要远程文件同步修改就必须点击上传按钮进行同步。

image-20230803220140361

点击同步按钮后,就又会恢复到与远程文件相同的提示。

image-20230803220301109

还需要注意一个文件,就是在Windows系统中和Linux系统中,对于文件中的换行符是存在差异的。

  • Windows\r\n
  • Linux\n

我们想要在编写相关文件能够在远程的Linux主机中运行,还需要去修改使用IDEA编写代码是,换行符采用\n

依次点击文件->设置

image-20230803220521801

然后找到编辑器->代码样式->行分隔符,修改为Unix 和 macOS(\n)

image-20230803220553903

Hive基本概念

Hive的产生背景

现在我们有了HDFS来存储海量数据、MapReduce来对海量数据进行分布式并行计算、Yarn来实现资源管理和作业调度。但是面对海量数据和负责的业务逻辑,开发人员要编写MR来对数据进行统计分析难度极大、效率较低,并且对开发者的Java功底也有要求。所以Facebook公司在处理自己的海量数据时开发了hive这个数仓工具。Hive可以帮助开发人员来做完成这些苦活(将SQL语句转化为MapReduceyarn上跑),如此开发人员就可以更加专注于业务需求了。

Hive简介

Hive是由Facebook开源用于解决海量结构化日志的数据统计工具。Hive是基于Hadoop的一个数据仓库工具,将结构化的数据文件映射为一张表,并提供类SQL(HQL)查询功能。

映射成为一张表,实际上并没有这个表。

Hive的本质

Hive的本质实际上就是将复杂的MR程序转化成为了简单的HQL程序语句。

Hive其实就是做的一个翻译工作,将HQL语句翻译为MR程序,然后在集群下执行任务。

Hive架构基本原理

image-20230803212225212

整个框架的基本原理如图所示,其中涉及到的一些组件功能如下图所示。

MateStore:指的是创建出来的元数据。前面讲过Hive中的数据表都是映射出来的,那么实际使用的时候究竟是如何映射的,这个时候就需要使用到元数据去映射出具体的表。

CliJDBC:表示连接Hive的两种方式,客户端连接和JDBC连接。

DriverHive驱动用于客户端与服务器之间进行数据交互,驱动器又被分为4个步骤,分别由不同的角色承担。如下所示:

  • SQL Parser:将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。

  • Physical Plan:将AST编译生成逻辑执行计划。

  • Query Optimizer:对逻辑执行计划进行优化。

  • Execution:把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark

Hive在执行HQL的整个过程如下:

  1. 获取客户端发送过来的HQL代码。
  2. 首先由SQL Parser去检查HQL代码是否有语法错误,如果有直接报错。如果没有语法错误,就会去生成一个抽象语法树AST
  3. 那么接下来就由Physical PlanAST进行编译,生成逻辑执行计划。也可以说是初步的MR程序。
  4. 为了提高MR程序的运行效率,Query Optimizer会去改进MR程序的执行逻辑,使得其运行起来更高效。
  5. Execution去提交对应的MR程序到集群中去执行。

Hive和数据库比较

Hive mysql
语言 sql sql
数据规模 大数据pb及以上 数据量小一般百万左右到达单表极限
数据插入 能增加insert,不能update,delete insert,update,delete
数据存储 Hdfs 拥有自己的存储空间
计算引擎 Mapreduce/spark/tez 自己的引擎innodb

综上所述,Hive压根就不是数据库,Hive除了语言类似以外,存储和计算都是使用Hadoop来完成的。而Mysql则是使用自己的,拥有自己的体系。

Hive的优缺点

优点 缺点
1. 提供了类SQL语法操作接口,具备快速开发的能力(简单、易上手) 1. HiveHQL表达能力有限 1)Hive自动生成MapReduce作业,通常情况下不够智能化
2. 避免了去写MapReduce,减少开发者的学习成本 2)数据挖掘方面不擅长(多个子查询),由于MapReduce数据处理流程的限制,效率更高的算法却无法实现
3. Hive优势在于处理大数据,在处理小数据时没有优势,因为Hive的执行延迟较高。 2. Hive的效率比较低 1)Hive的执行延迟比较高,因为Hive常用于数据分析,对实时性要求不高的场合
2)Hive调优比较困难,粒度较粗
4. Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数 3. Hive不支持实时查询和行级别更新 hive分析的数据是存储在HDFS上的,而HDFS仅支持追加写,所以在Hive中不能updatedelete,只能selectinsert

Hive安装

修改hadoop相关参数

修改core-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 配置该minglog(superUser)允许通过代理访问的主机节点 -->
<property>
<name>hadoop.proxyuser.minglog.hosts</name>
<value>*</value>
</property>
<!-- 配置该minglog(superUser)允许通过代理用户所属组 -->
<property>
<name>hadoop.proxyuser.minglog.groups</name>
<value>*</value>
</property>
<!-- 配置该minglog(superUser)允许通过代理的用户-->
<property>
<name>hadoop.proxyuser.minglog.users</name>
<value>*</value>
</property>

修改yarn-site.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!-- NodeManager使用内存数,默认8G,修改为4G内存 -->(16g物理内存的改为2g或者是3g)
<property>
<description>Amount of physical memory, in MB, that can be allocated
for containers. If set to -1 and
yarn.nodemanager.resource.detect-hardware-capabilities is true, it is
automatically calculated(in case of Windows and Linux).
In other cases, the default is 8192MB.
</description>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>4096</value>
</property>
<!-- 容器最小内存,默认512M -->
<property>
<description>The minimum allocation for every container request at the RM in MBs.
Memory requests lower than this will be set to the value of this property.
Additionally, a node manager that is configured to have less memory than this value
</description>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>512</value>
</property>

<!-- 容器最大内存,默认8G,修改为4G -->
<property>
<description>The maximum allocation for every container request at the RM in MBs.
Memory requests higher than this will throw an InvalidResourceRequestException.
</description>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>

<!-- 虚拟内存检查,默认打开,修改为关闭 -->(使用虚拟内存)
<property>
<description>Whether virtual memory limits will be enforced for containers.</description>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>

修改完后分发

1
xsync /opt/module/hadoop-3.1.3/etc/hadoop/core-site.xml /opt/module/hadoop-3.1.3/etc/hadoop/yarn-site.xml

然后重启集群

1
2
myhadoop stop
myhadoop start

Hive下载与解压安装

安装包下载地址

下载完后上传到/opt/software,然后解压安装包到/opt/module目录

1
2
3
tar -zxvf /opt/software/apache-hive-3.1.2-bin.tar.gz -C /opt/module/

mv /opt/module/apache-hive-3.1.2-bin/ /opt/module/hive-3.1.2

解压完成后,接下来给Hive设置环境变量

1
sudo vim /etc/profile.d/my_env.sh

添加以下内容:

1
2
3
#HIVE_HOME
export HIVE_HOME=/opt/module/hive-3.1.2
export PATH=$PATH:$HIVE_HOME/bin

重新启动客户端,让环境变量生效。

Hive元数据部署

元数据之Derby

内嵌模式示意图:

image-20230803221816267

Derby数据库是Java编写的内存数据库,在内嵌模式中与应用程序共享一个JVM,应用程序负责启动和停止。

首先初始化Derby数据库,执行以下命令:

1
schematool -dbType derby -initSchema

image-20230803222010177

执行上述初始化元数据库时,会发现存在jar包冲突问题,现象如下:

SLF4J: Found binding in [jar:file:/opt/module/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/opt/module/hadoop-3.1.3/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]

出现这个问题的原因是:hadoophive下都有这个jar包.

解决办法:以底层的hadoop为主,改了hive的。

1
2
3
4
# 进入到Hive目录
cd $HIVE_HOME

mv lib/log4j-slf4j-impl-2.10.0.jar lib/log4j-slf4j-impl-2.10.0.back

初始化完毕后在Hive目录下就会生成一个日志文件和一个数据库目录。

image-20230803223650059

如果我们初始化失败,或者想要重新初始化Hive都需要将这两个文件删除再重新初始化。

接下来执行以下命令,即可启动hive,并通过Cli方式连接到hive

1
hive

启动hive时会出现以下的一行提示信息。

image-20230803222338121

该提示信息大致意思是我们没有启动hbase服务,这个暂时不管,后续我们讲完hbase的时候就不会出现了。

image-20230803222505845

这个时候我们就可以输入相关的SQL命令去操作Hive了。

例如:

  • 查看当前数据库,并创建一个people数据表

image-20230803222832445

  • 然后向该表中插入两条数据。

    image-20230803222958371

    可以看到此时其实就是执行的是一个MR任务。

    并且此时在HDFS中也会存储该文件。

    image-20230803223115164

    image-20230803223129783

在内嵌模式下只有一个JVM进程。

这个时候再打开一个hadoop102SSH窗口,输入jps

image-20230803223314984

可以看到多出了一个RunJar进程,但是无法看到具体的任务是什么。

可以输入-ml参数,展示对于进程的全类名。

1
jps -ml

image-20230803223442143

这个时候就可以看到,RunJar进程就是CliDriver进程,也就是Hive的客户端进程。就是我们另外一个没有关闭的Hive终端。

在该终端下输入hive也进入到hive客户端。

在该终端下输入show databases;展示数据库,发现出现报错。

image-20230803223931601

出现错误的原因是因为Hive默认使用的元数据库为derby并且部署方式是内嵌式,在开启Hive之后就会独占元数据库,且不与其他客户端共享数据,如果想多窗口操作就会报错,操作比较局限。为此Hive支持采用MySQL作为元数据库,就可以支持多窗口操作。

元数据之mysql

直连式示意图:

image-20230803224846393

Mysql安装部署

首先检查当前系统是否安装过Mysql,如果存在就是用下列命令移除,如果不存在则忽略。(一定要做这一步)

1
2
3
rpm -qa|grep mariadb  # 如果有返回内容说明存在数据库

sudo rpm -e --nodeps mariadb-libs # 卸载

MySQL安装包和驱动包上传到/opt/software目录下。

下载地址

然后在/opt/software下新创建mysql_jars目录

1
mkdir /opt/software/mysql_jars

解压MySQL安装包资源到/opt/software下新创建的mysql_jars目录

1
tar -xf /opt/software/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar -C /opt/software/mysql_jars

进入到mysql_jars就可以看到解压后的文件如下图所示。

image-20230803225410017

接下来在mysql_jars目录下执行以下代码进行安装:

1
2
3
4
5
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
sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm

在安装最后一条命令时可能出现以下报错。

image-20230803225518625

出现这个错误的原因是因为我们采用的是最小化安装,有部分依赖没有安装完成。

采用以下命令安装解决后继续安装最后一个包。

1
2
3
sudo yum install -y libaio

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

如果在mysql的数据存储路径下有文件存在,需要将其全部删除,存储路径地址在/etc/my.cnf文件中datadir参数所对应的值:

image-20230803231809974

1
sudo rm -rf /var/lib/mysql/*

接下来初始化mysql数据库,会创建mysql内部数据库、表及初始化密码。

1
sudo mysqld --initialize --user=mysql

查看root用户首次登录mysql的初始密码

1
sudo cat /var/log/mysqld.log

image-20230803232057585

此时我的初始密码就是uuSMD=wEf8!8

接下来开启mysql服务

1
sudo systemctl start mysqld

然后进入到mysql数据库

1
mysql -uroot -p

执行完成后输入上方的初始密码进入mysql

image-20230803232238006

这个时候是不能够执行SQL命令的。

image-20230803232306082

提示我们需要修改初始密码,才可以操作数据库。

将初始密码修改为123456

1
set password = password("123456");

默认情况下Mysql的登录权限之开启了root用户在本机登录。我们想要在其他节点下去使用Mysql就必须设置允许用户在任意节点访问数据库。

1
update mysql.user set host='%' where user='root';

修改完成后刷新数据库配置。

1
flush privileges;

这样数据库的安装就完成了。

配置Hive元数据库为Mysql

首先,将MysqlJDBC驱动拷贝到Hivelib目录下,供Hive使用

1
mv /opt/software/mysql-connector-java-5.1.37.jar /opt/module/hive-3.1.2/lib/

然后,配置MetastoreMySql,在Hive家目录下的conf目录下新建hive-site.xml文件

1
vim /opt/module/hive-3.1.2/conf/hive-site.xml

并在文件中加入以下配置内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- jdbc连接的URL -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value>
</property>
<!-- jdbc连接的Driver-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- jdbc连接的username-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- jdbc连接的password -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!-- Hive默认在HDFS的工作目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- Hive元数据存储的验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<!-- 元数据存储授权 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
</configuration>

接下来Hive初始化Mysql元数据库

在初始化之前首先在Mysql中创建metastore数据库。

1
mysql -uroot -p

输入密码后执行以下SQL命令

1
2
create database metastore;
quit;

然后初始化Hive元数据库

1
schematool -initSchema -dbType mysql -verbose

image-20230803233410538

初始化完成后,会在Mysql中的metastore数据库中生成一系列的数据表,这些数据表共同组成了Hive的元数据功能。

image-20230803233517940

这个时候再次开启Hive

1
hive

使用hive执行相关命令

image-20230803233739000

返回正常,Hive功能可以使用。

接下来再次打开一个hadoop102SSH窗口输入hive,在该窗口的hive中再次测试hive是否可以使用。

image-20230803233844818

测试结果同样正常,说明使用Mysql作为元数据库,Hive支持客户端并发访问。

元数据之MetaStore Server

元数据服务模式示意图:

image-20230803234059742

在服务器端启动MetaStore服务,客户端利用Thrift协议通过MetaStore服务访问元数据库。

元数据服务的访问方式更适合在生产环境中部署使用,相比内嵌式,该方式更加的灵活。(跨网络跨语言跨平台)

Mysql做为元数据库,部署元数据服务。

首先,将hive的元数据库配置为Mysql

1
vim conf/hive-site.xml

hive-site.xml中添加如下配置信息。

1
2
3
4
5
   <!-- 指定存储元数据要连接的地址 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://hadoop102:9083</value>
</property>

注意:在配置了此参数后,启动hive之前必须先启动元数据服务,否则,hive启动后无法连接到元数据服务。

如果设置了这个参数,但是没有开启元数据服务,这个时候会导致Hive服务异常。

image-20230803234530928

Hive的日志中也可以看到相关报错。

image-20230803234716104

启动元数据服务。

1
hive --service metastore

image-20230803234821643

开启元数据服务后,该SSH窗口就会阻塞,需要重新开启一个SSH窗口启动Hive

image-20230803234934057

此时Hive服务恢复正常。

这个时候再重新开启一个SSH窗口执行以下命令,查看当前Java进程详细信息。

1
jps -ml

image-20230803235107511

可以看到有CliDriverHiveMetaStore两个Java进程在运行。

连接Hive的两种方式

命令行方式

  1. 在前面的操作中,我们都是通过cli的方式访问hive的。
  2. 我们可以切身的体会到,通过cli的方式访问hive的不足,如:cli太过笨重,需要hivejar支持。

HiveServer2模式

JDBC访问Hive示意图

image-20230803235403388

JDBC方式访问Hive

JDBC方式,本质上是将hive包装为服务发布出去,开发者使用JDBC的方式连接到服务,从而操作hive

减少了对hive环境的依赖。

开启HiveServer2

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

1
2
3
4
5
6
7
8
9
10
<!-- 指定hiveserver2连接的host -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>hadoop102</value>
</property>
<!-- 指定hiveserver2连接的端口号 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>

重启MetaStore服务

1
hive --service metastore

image-20230803235910204

启动hiveserver2服务

1
hive --service hiveserver2

image-20230803235903079

启动beeline客户端

1
beeline -u jdbc:hive2://hadoop102:10000 -n minglog

image-20230804000001580

Hive简单使用

image-20230804000017014

使用IDEA连接Mysql和Hive

连接Mysql

点击IDEA右侧的数据库侧栏,依次点击+ -> 数据源 -> MySQL

image-20230804000216385

然后下载驱动程序文件

image-20230804000325180

image-20230804000404183

等待下载完成即可。

然后设置MySQL数据库的连接信息,如下所示,点击测试连接连接成功后点击确定即可。

image-20230804000626871

此时在侧边栏就会生成对应的数据库连接对象。

image-20230804000703924

连接Hive

首先和前面的操作一样,先在侧边栏中依次点击+ -> 数据源 -> Apache Hive

image-20230804000812026

但后点击下载驱动文件。

image-20230804000903900

下载完成后参照下图进行Hive信息配置后,点击测试连接,显示连接成功后,点击确定即可。

image-20230804000957857

此时在右侧的侧边栏也会多一个Hive连接对象。

image-20230804001100254

并且在IDEA中可以添加控制台直接编写HQL或者SQL代码操作数据库和数据仓库。

image-20230804001315880

点击相应的表也可以直接查看表中的内容。

image-20230804001237217

Hive启停脚本编写

这部分的内容较为复杂,不要求掌握详细的Shell编写流程,只需会用给出的脚本启动Hive即可。

问题引出,之前每次我们在开启Hive时,都需要先开启MetaStore,再开启HiveSeriver2,并且这两个服务在开启的时候都会把当前窗口变为监听窗口,监听服务。并且窗口还不可以关闭,如果关闭服务也随之停止,这个时候大家都应该想到了在Shell编程中给大家讲到的nohub XXXX &用法,可以保证服务在后台正常运行而不占用当前SSH窗口。

脚本编写如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs
if [ ! -d $HIVE_LOG_DIR ]
then
mkdir -p $HIVE_LOG_DIR
fi
#检查进程是否运行正常,参数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 &"
cmd=$cmd" sleep 4; hdfs dfsadmin -safemode wait >/dev/null 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_stop
sleep 2
hive_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

上述脚本写完后保存为hive2.sh名称,赋予执行权限,然后放到用户命令下的bin目录下。

脚本使用方式如下:

  1. 启动Hive

    1
    hive2.sh start

    image-20230805202424439

    image-20230805202825556

  2. 查看Hive服务状态

    1
    hive2.sh status

    image-20230805202500431

    注意:HiveServer2服务开启后需要等一段时间过后在可以正常使用,刚开启完成后直接使用该命令查看状态可能显示成如下内容:

    image-20230805202605021

    此时只需稍等一段时候过后,再次查看状态就显示正常了。

  3. 关闭Hive

    1
    hive2.sh stop
  4. 重启Hive

    1
    hive2.sh restart

    image-20230805205000755

Hive常用交互命令

使用以下命令可以查看Hive中支持的所有命令。

1
hive -help

image-20230805203117840

其中用到最多的是两个参数:

  1. -e:直接指定要在Hive中执行的SQL命令。

    1
    hive -e "select * from people;"

    image-20230805203321808

  2. -f:指定要在Hive中运行的SQL脚本。

    首先新建一个SQL脚本my_sql.sql

    1
    2
    3
    4
    # 进入家目录
    cd ~
    # 新建sql脚本
    vim my_sql.sql

    内容如下:

    1
    select * from people;

    执行该脚本:

    1
    hive -f my_sql.sql

    image-20230805203604070

用这两个参数执行SQL代码有一个好处就是不需要提前进入Hive客户端,而且执行完SQL命令后也不会停留到Hive客户端。

Hive中常见属性配置

修改Hive日志默认存储路径

默认的情况下Hive的日志存储在以下目录/tmp/minglog/hive.log(当前用户的临时目录下)。而/tmp目录在Linux中表示的是临时目录,临时目录意味着系统会定期清楚该目录中的文件,这样可能就会导致日志丢失,所以修改Hive日志的默认存储路径是很有必要的。

image-20230805204457252

修改步骤如下。

修改conf目录下hive-log4j2.properties.template文件名称为hive-log4j2.properties

image-20230805204630125

hive-log4j.properties文件中修改log存放位置。

1
property.hive.log.dir=/opt/module/hive-3.1.2/logs

image-20230805205152387

然后重启Hive。重启后在/opt/module/hive-3.1.2/logs目录下就会生成hive.log日志文件。

Hive启动JVM堆内存配置

新版Hive启动时,默认申请的JVM堆内存大小为256M,内存太小,导致若后期开启本地模式,执行相对复杂的SQL经常会报错:java.lang.OutOfMemoryError: Java heap space

解决办法为,扩大JVM堆内存大小为1024M,具体操作如下所示。

修改/opt/module/hive/conf/下的hive-env.sh.template文件为hive-env.sh

image-20230805205626617

修改以下内容:

1
export HADOOP_HEAPSIZE=1024

image-20230805205701773

重启Hive服务即可生效。

hive窗口打印默认库和表头

默认的情况下,使用命令在Hive查看表中的数据时,是没有显示每一列的字段名称和当前表格所处数据库的,这对于不熟悉数据的开发者十分不友好,可以采用修改hive-site.xmlhive.cli.print.current.dbhive.cli.print.header两个参数的值都为true,分别打印出当前库头和表头。

1
2
3
4
5
6
7
8
9
10
<!--    打印字段名称-->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 打印当前数据所处数据库-->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>

配置完后重启Hive

  • 配置前。

image-20230805210033578

  • 配置后。

image-20230805210357978

直接输入hive进入Hive客户端,也可以看到当前选择的数据库名称。

image-20230805210524459

配置参数的其他两种方式

命令行配置方式

启动hive时,可以在命令行添加--hiveconf param=value来设定参数。

例如,我们现在设置不让他显示库头

1
hive --hiveconf hive.cli.print.current.db=false

image-20230805211609807

此时进入的hive客户端中就不存在库头了。

该方式设置的参数,只在当前Hive客户端会话中生效。

当我们有些命令只想在某个配置参数下运行时,可以使用该方式设置配置参数。

在进入hive命令行交互窗口后,可使用set命令设置参数

首先,直接输入hive进入Hive客户端。

image-20230805211847870

接下来使用以下命令设置参数。

1
set hive.cli.print.current.db=false;

可以看到执行完该命令后,库头就消失了。

image-20230805212011640

该方式设置的参数,也是只在当前Hive客户端会话中生效。

当我们有些命令只想在某个配置参数下运行时,可以使用该方式设置配置参数。

总结:现在我们一共讲了3种设置参数的方法。

  1. 修改hive-site.xml文件内容。
  2. 命令行配置方式。
  3. 在进入hive命令行交互窗口后,可使用set命令设置参数。

这三种方式的优先级如下所示:3 > 2 > 1

-------------本文结束感谢您的阅读-------------