一、Hive的基础原理
Hive是一个基于Hadoop的数据仓库工具,可以将结构化的数据文件映射成一张数据表,并可以使用类似SQL的方式来对数据文件进行读写以及管理。这套Hive SQL 简称HQL。
1.1 Hive是什么?
Hive概述:
Apache Hive是建立在Hadoop顶层的数据仓库,不是数据库。
作为用户编程接口,不存储和计算数据,主要提供在Hadoop下使用SQL的接口。
依赖于HDFS和MapReduce,提供类似SQL的查询语言(HQL)。
Hive特点:
不负责存储和计算数据,依赖 HDFS 和 MapReduce。
HQL 查询会被转换为 MapReduce 作业,用于对 Hadoop 中的数据进行查询和分析。
提供类 SQL 的查询方式,简化了大数据分析的复杂性。
应用场景:
Hive 主要用于大数据仓库,支持海量数据的存储和分析。
常用于数据的提取、转换、加载(ETL)操作。
用户可以通过 HQL 方便地进行数据查询、汇总和分析。
Hive 的本质:是「将 HQL 转换成 MapReduce 程序或者 spark 程序」

hive的架构图:

Hive 查询的流程(结合图示):
接收查询(图中的步骤1):
用户通过用户界面(UI)编写并提交一条 SQL 查询(HQL)。这条查询被传递到 Hive 的核心组件进行处理。
SQL语句解析(图中的步骤2):
SQL语句编译(图中的步骤2):
执行计划优化(图中的步骤2):
优化器对生成的逻辑计划进行优化。这个优化步骤是为了提高查询的执行效率,比如减少数据处理的时间和资源消耗。
SQL 语句通过语法检查后,编译器会将其转换为一个逻辑执行计划。这一计划描述了查询如何从输入数据中提取所需信息。
类型检查: SQL 语句首先经过语法解析器的检查。Hive 的 Driver 模块会结合存储在元数据存储中的信息,对查询中涉及的数据类型进行匹配和验证。
语法分析: 语法解析器还会检查 SQL 语句是否符合 HiveQL 的语法规则,如果语法正确,查询会继续进行。
查询元数据(图中的步骤3):
在逻辑计划优化之后,Hive 会通过元数据存储(Metastore)查询相关表和列的信息。元数据包含了 Hive 表的结构信息(如表名、字段名、字段类型、分区信息等),这些信息对将逻辑计划转换为实际执行任务至关重要。
生成执行任务(图中的步骤4):
优化后的逻辑计划结合查询到的元数据,最终被转换为实际的执行任务,通常是一个或多个 MapReduce 任务。在图中,这一步会生成需要在 Hadoop 集群上执行的 MapReduce 程序,并将其提交给 YARN 来调度执行。
任务执行(图中的步骤5):
Hadoop 集群上的 YARN 调度并执行这些 MapReduce 任务。这些任务会读取存储在 HDFS 上的数据(如图中显示的
china_user.txt文件),并按照计划执行数据处理。返回结果(图中的步骤6):
执行完毕后,结果会被返回给用户界面,供用户查看。用户可以在 UI 中看到查询的结果数据。
这种顺序更清晰地反映了 Hive 的查询处理过程,在计划优化之后进行元数据查询,以确保执行任务生成时能准确获取数据结构和其他必要信息。
1.2 Hive 与 RDBMS 的比较
虽然 Hive 使用类似 SQL 的查询语言,但除了这点相似之外,Hive 与关系型数据库(RDBMS)在其他方面差异显著。关键在于:RDBMS 适用于在线应用,而 Hive 则专为数据仓库设计。
| 特征 | Hive | RDBMS |
|---|---|---|
| 查询语言 | HQL(类SQL) | SQL |
| 数据存储 | HDFS | 本地文件系统 |
| 数据更新 | 读多写少(不建议频繁写入) | 支持增删改查 |
| 数据操作 | 覆盖追加 | 行级别更新删除 |
| 索引 | 0.8 版本后引入 Bitmap 索引 | 支持多种索引 |
| 执行 | MapReduce | 本地执行器 |
| 执行延迟 | 延迟较高 | 延迟较低 |
| 可扩展性 | 高扩展性 | 扩展性有限 |
| 数据规模 | 支持海量数据 | 数据规模较小 |
| 分区 | 支持 | 支持 |
总结:
Hive 仅在查询语言上类似 SQL,但应用场景完全不同。 Hive 适合处理海量的离线数据分析,理想的应用场景是数据仓库。
二、Hive的基础知识
1.Hive的基础知识
Hive安装与配置:
Hive 安装:Hive 不需要在 Hadoop 集群的每个节点上安装。它作为一个客户端工具,可以运行在集群中的任意一个节点上。
配置:Hive 的配置取决于具体的部署环境和需求,可以在伪分布式模式或完全分布式模式下运行。
伪分布式模式和完全分布式模式:
伪分布式模式:Hive 在单个节点上运行,适用于开发和测试。虽然在单机上运行,但它模拟了分布式环境。
完全分布式模式:Hive 运行在一个真正的 Hadoop 集群上,利用多个节点分布式地处理大规模数据,适用于生产环境。
Hive元数据服务(Hive Metastore):
元数据存储:Hive 的元数据通常存储在外部数据库中,如 MySQL。这些元数据包括表结构、分区信息等。
服务独立性:元数据服务可以独立于计算节点运行,而计算节点则负责执行 HiveQL 查询生成的 MapReduce 任务。
Hive和Hadoop集群的交互:
正确交互:Hive 需要与 Hadoop 集群正确配置以进行交互。这包括通过配置文件指定 Hadoop 文件系统的地址和 MapReduce 框架等信息。
安装位置:在完全分布式环境中,可以只在主节点(master)上安装和配置 Hive,因为计算任务会通过 Hadoop 集群的各个节点来执行。
2.元数据和服务
2.1 元数据 (Metadata)
元数据是指在 Hive 中创建的数据库、表、表的位置、类型、属性、字段顺序和类型等信息。这些元数据是 Hive 系统的核心部分,用于描述和管理数据的结构和属性。元数据通常存储在关系型数据库中,比如 Hive 内置的 Derby 数据库,或第三方数据库如 MySQL。
2.2 元数据服务 (Metastore)
元数据服务 (Metastore) 是管理元数据的核心服务。Metastore 负责处理和存储元数据,并对外提供服务接口,供不同的客户端访问元数据。
Metastore 服务的优势在于:
集中管理:多个客户端可以同时连接 Metastore 服务,而不需要直接访问底层的 MySQL 数据库。
安全性:客户端只需连接 Metastore 服务,不需要了解 MySQL 的用户名和密码,从而提高了元数据的安全性。
通过 Metastore 服务,Hive 的元数据可以被多个客户端方便、安全地访问和管理。
3. metastore三种配置方式
在 Hive 中,元数据存储(Metastore)服务可以通过三种模式进行配置:内嵌模式、本地模式和远程模式。
理解这三种模式的关键是:
Metastore 服务是否作为独立的进程运行,以及是否与 Hive 服务器分开部署(远程模式)。
元数据是存储在内嵌的 Derby 数据库中,还是使用外部的关系型数据库(如 MySQL)(本地模式和远程模式)。

3.1 内嵌模式
内嵌模式(Embedded Metastore)是 Hive 的默认配置方式。在这种模式下,Metastore 服务直接运行在 Hive 的进程内部,并使用内嵌的 Derby 数据库来存储元数据。这种模式适合开发和测试环境,但不推荐用于生产环境。
如何判断: 如果 Hive 的配置文件 hive-site.xml 中没有特别指定 Metastore 服务的连接信息(比如 javax.jdo.option.ConnectionURL),那么就是在使用内嵌模式。
3.2 本地模式
本地模式(Local Mode):在这种模式下,Metastore 服务作为一个独立进程运行,但它和 Hive Server 在同一台机器上。这种模式下,Metastore 使用外部数据库(如 MySQL 或 PostgreSQL)来存储元数据。
如何判断: 如果 hive-site.xml 配置文件中指定了 Metastore 的连接信息,并且 hive.metastore.uris 配置为空或指向本地主机(例如 thrift://localhost:9083),则表示正在使用本地模式。
3.3 远程模式
远程模式(Remote Mode):在这种模式下,Metastore 作为独立的进程运行,可以部署在与 Hive Server 不同的主机上。此模式下,多个 Hive 实例可以共享同一个 Metastore 服务,适合需要高扩展性和高可用性的生产环境。
如何判断是否使用远程模式:如果 hive-site.xml 配置文件中的 hive.metastore.uris 配置了远程 Metastore 服务器的地址(例如 thrift://<metastore-host>:<port>),则表示 Hive 正在使用远程模式。
通常在生产环境中,会选择本地模式或远程模式,因为这两种模式使用外部数据库作为元数据存储,相较于嵌入式模式更为可靠和高效。

本系列课程中使用企业推荐模式--远程模式部署。
三、Hive的安装部署
1、前期准备
在开始安装和配置 Hive 之前,请确保以下组件已正确安装和配置:
JDK 1.8
Hadoop 3.1.3 集群
MySQL 5.7.27
2、安装并配置
2.1 下载hive
首先需要下载Hive安装包文件apache-hive-3.1.2-bin.tar.gz
[Hive官网下载地址]http://archive.apache.org/dist/hive/
2.2 解压并改名
将下载的 apache-hive-3.1.2-bin.tar.gz 文件放在主节点的 /opt/software 目录下,并解压到 /opt/apps 目录中,然后将文件夹重命名为 hive。
cd /opt/software
tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /opt/apps # 解压到/opt/apps中
cd /opt/apps/
mv apache-hive-3.1.2-bin hive # 将文件夹名改为hive 2.3 配置环境变量
vi /etc/profile
# 添加以下信息
# Hive
export HIVE_HOME=/opt/apps/hive
export PATH=$PATH:$HIVE_HOME/bin使环境变量配置生效
source /etc/profile
2.4 安装mysql环境
前期已经配置完成!
2.5 配置hive接入mysql
我们采用
MySQL数据库保存Hive的元数据,而不是采用Hive自带的derby来存储元数据。
mysql-connector-java-5.1.40.tar.gz是MySQL数据库的JDBC驱动程序的压缩包,用于在Java应用程序中实现对MySQL数据库的连接和操作。
下载文件mysql-connector-java-5.1.40.tar.gz到master节点的/opt/software目录中;
解压并拷贝mysql-connector-java-5.1.40-bin.jar到/opt/apps/hive/lib目录下。
cd /opt/software
tar -zxvf mysql-connector-java-5.1.40.tar.gz #解压
#将mysql-connector-java-5.1.40-bin.jar拷贝到/opt/apps/hive/lib目录下
cp mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar /opt/apps/hive/lib2.6 配置hive-env.sh
cd /opt/apps/hive/conf
[root@master conf]$ cp hive-env.sh.template hive-env.sh
[root@master conf]$ vi hive-env.sh
# 配置如下
export HADOOP_HOME=/opt/apps/hadoop
export JAVA_HOME=/opt/apps/jdk
export HIVE_CONF_DIR=/opt/apps/hive/conf
# 指定Hive的辅助JAR文件的路径[包含Hive扩展或自定义的UDF(用户定义函数)]
export HIVE_AUX_JARS_PATH=/opt/apps/hive
export HIVE_HOME=/opt/apps/hive2.7 配置hive-site.xml
cd /opt/apps/hive/conf
# 使用touch创建空文件
touch hive-site.xml配置以下信息
<configuration>
<!-- 设置连接到用于存储 Hive 元数据的 MySQL 数据库的 JDBC URL -->
<!-- 如果数据库 'hive' 不存在,将根据配置自动创建,记录 Hive 的元数据信息 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<!--配置mysql的连接驱动-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!--配置 MySQL 用户名和密码-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!--配置登录mysql的密码-->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
</property>
<!--关闭元数据存储版本的验证-->
<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>
<!-- 设置Hive在HDFS上的默认仓库目录-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!-- 指定用于远程连接到 Metastore 服务的地址和端口,使用 Thrift 协议进行通信。 -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
</property>
<!-- 设置 HiveServer2 监听的端口号 -->
<!-- 允许客户端使用各种支持JDBC工具和编程语言如SQL来执行查询和管理 Hive -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<!-- 设置 HiveServer2 绑定的主机名 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>master</value>
</property>
<!-- 配置 CLI 输出表头 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>
<!-- 配置 CLI 显示当前数据库 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!-- 禁用 HiveServer2 的用户模拟功能, Hive查询和操作都将以 HiveServer2 进程的所有者身份运行 -->
<!-- 解决了 `User: root is not allowed to impersonate root` 的错误。 -->
<property>
<name>hive.server2.enable.doAs</name>
<value>false</value>
</property>
<!-- 启用 Hive Server2 的主备模式(高可用性功能),有助于提高启动速度并解决特定错误 -->
<!-- 解决TezConfiguration和NoClassDefFoundError错误 -->
<property>
<name>hive.server2.active.passive.ha.enable</name>
<value>true</value>
</property>
</configuration>2.8 解决Hive与Hadoop依赖的Guava库版本冲突问题
Guava 是一个增强 Java 编程的工具库,提供集合处理、并发、缓存等多种实用功能,简化常见编程任务。
# 查看/opt/apps/hadoop/share/hadoop/common/lib/内guava.jar版本
# 查看的结果:guava-27.0-jre.jar
# 查看/opt/apps/hive/lib内guava.jar的版本,如果两者不一致,删除版本低的,并拷贝高版本的 问题解决!
# 查看的结果:guava-19.0.jar
# 1.把hadoop下的guava-27.0-jre.jar 复制到 Hive下的
cp /opt/apps/hadoop/share/hadoop/common/lib/guava-27.0-jre.jar /opt/apps/hive/lib
# 2.把Hive下的guava.jar重命名
mv /opt/apps/hive/lib/guava-19.0.jar guava-19.0.jar.bf2.9 初始化Hive元数据库
使用 MySQL 作为元存储数据库类型,初始化或更新 Hive 的元数据存储结构。
cd /opt/apps/hive
# 初始化Hive元数据库
./bin/schematool -initSchema -dbType mysql -verbose
# 初始化成功的状态如下:
# 最后两行的信息
# beeline> Initialization script completed
# schemaTool completed-initSchema:表示初始化 Hive 的元数据表结构。
-dbType mysql:指定使用 MySQL 作为 Hive 的元数据库。
-verbose:启用详细模式,输出更多的操作细节,方便调试和确认操作过程。
3、启动hive
Hive 的两种客户端
1.Hive CLI:
Hive CLI 是 Hive 提供的本地命令行工具,可以直接输入 SQL 与 Hive 交互。
在本地执行查询时,Hive CLI 会编译 SQL 查询,与 Metastore 交互获取元数据,并生成 MapReduce 作业提交到 Hadoop 集群运行。
运行 Hive CLI 时,会启动一个叫 RunJar 的进程,包含了 Metastore 服务。
Hive CLI 是一个“重量级”客户端,因为它在本地处理了 SQL 编译、作业提交等大量任务。
注意:只需启动 Metastore 服务即可通过 Hive CLI 使用 Hive。
2.Beeline:
Beeline 是一个轻量级的 JDBC 客户端,用于连接 HiveServer2。
在 Beeline 中,SQL 查询会发送到 HiveServer2,后者负责编译、优化、执行查询,并与 Metastore 交互。
Beeline 支持多用户操作,允许多个用户同时连接 HiveServer2,具有更好的安全性和权限控制。
与 Hive CLI 不同,Beeline 仅负责提交查询和接收结果,查询的处理由 HiveServer2 完成,因此是“轻量级”客户端。
注意:使用 Beeline 时,需要同时启动 Metastore 和 HiveServer2 两个服务font>。
HiveServer2 和 Thrift 框架
1.HiveServer2:Hive 的核心服务,提供远程 SQL 接口,支持多用户并发访问,负责编译和执行 SQL 查询,适合分布式系统的部署。
2.Thrift 框架:一个跨语言的通信框架,使不同编程语言(如 Java、Python)能够通过统一的接口与 HiveServer2 进行数据交互。
总结
Hive CLI 是一个功能强大的本地客户端,直接处理 SQL 编译和作业提交,适合需要在本地处理的场景。只需启动 Metastore 服务,即可使用 Hive CLI 访问 Hive。
Beeline 是一个更轻便的客户端,通过连接 HiveServer2 来处理 SQL 查询,支持多用户并具备更好的安全性和权限控制。要使用 Beeline 访问 Hive,必须启动 Metastore 和 HiveServer2 两个服务。

启动环境
在启动hive之前,要保证成功启动hadoop完全分布式集群,启动Yarn,启动mysql服务【默认开机启动】
start-dfs.sh #在master上启动HDFS
start-yarn.sh #在slave1上启动Yarn3.1 第一种交互方式
任务:通过服务端启动 Metastore 服务,并使用 Shell 方式与 Hive 交互
1. 启动 Metastore 元数据服务
有以下四种方法可以启动 Hive 的 Metastore 元数据服务:
方法一:前台启动
hive --service metastore
# 此时服务会独占一个命令行窗口。方法二:后台启动
hive --service metastore &
# 服务在后台运行,命令行窗口仍可用于其他操作。
# 虽然服务在后台运行,但输出【日志和错误信息】仍然直接显示在你启动该命令的终端窗口中方法三:完全后台启动
nohup hive --service metastore >log.txt 2>&1 &
# 服务在后台运行,并将所有输出【运行Metastore服务过程中产生的日志信息和可能出现的错误信息】重定向到 `log.txt` 文件中。方法四:完全后台启动简化命令
nohup hive --service metastore &
# 服务在后台运行,输出【运行Metastore服务过程中产生的日志信息和可能出现的错误信息】将默认写入 `nohup.out` 文件。
2. 启动 Hive
hive # 进入 Hive 命令行界面。
show databases; # 查看数据库
显示当前所有数据库,通常会看到默认的 default 数据库。
注意:在 HDFS 的目录结构中不会直接显示 default 数据库,但在 default 数据库下创建的表会直接存储在 warehouse 目录下。
3. 退出 Hive
quit;
知识点解释:
默认数据库:
在 Hive 中,
default数据库是系统默认创建的,用于存储表和相应的数据。如果没有指定其他数据库,表将默认存储在default数据库中。表创建的默认行为:
如果在创建表时未指定数据库,Hive 会将这些表归属于
default数据库。这意味着在未明确指定的情况下,所有新创建的表都会默认存放在default数据库中。数据存储位置:
在
default数据库中创建的表,其数据物理上存储在 HDFS 的 Hive 仓库目录下。虽然在 HDFS 中不会直接看到名为default的目录,但表数据通常存放在由hive.metastore.warehouse.dir参数指定的路径中,常见路径为/user/hive/warehouse/your_table。逻辑与物理映射:
Hive 使用元数据存储(通常使用 MySQL)将数据库和表的逻辑名称映射到 HDFS 上的物理路径。即使在 HDFS 中不直接显示数据库名称,Hive 通过元数据管理,使得数据能够被正确存储、管理和定位。
3.2 第二种交互方式
官方推荐:通过服务连接的方式(服务端启动metastore服务和hiveserver2服务,启动beeline客户端)
3.2.1 启动服务
方法一:前台启动【每个服务在独立的终端窗口运行】:
hive --service metastore// 启动元数据服务hive --service hiveserver2// 启动远程访问服务,客户端可通过 JDBC连接到 Hive 进行交互。方法二:后台启动【不占用终端窗口】【推荐此方法】:
hive --service metastore &// 后台启动元数据服务hive --service hiveserver2 &// 后台启动远程访问服务方法三:完全后台启动:
nohup hive --service metastore>log.txt 2>&1 &nohup hive --service hiveserver2>log.txt 2>&1 &以完全后台模式启动服务,输出【日志和错误信息】重定向到日志文件。
方法四:完全后台启动的简化命令:
nohup hive --service metastore &nohup hive --service hiveserver2 &以完全后台模式启动服务,输出【日志和错误信息】重定向到日志文件。
3.2.2 启动客户端
beeline -u jdbc:hive2://master:10000 -n root
命令解释:
通过 Beeline 客户端,以 root 用户名连接到位于 master 主机上、监听 10000 端口的 HiveServer2 服务,实现与 Hive 的交互。
beeline:
启动 Beeline 客户端的命令。Beeline 是一个基于 JDBC 的命令行工具,用于与 HiveServer2 进行交互。
-u:
指定连接的 JDBC URL。
jdbc:hive2://master:10000:
jdbc:hive2: 指定使用 JDBC 连接到 Hive 2 服务。master: HiveServer2 所在的主机名(在此例中为master)。10000: HiveServer2 监听的端口号,默认是 10000。-n root:
-n: 指定连接时使用的用户名。root: 使用root用户名连接到 HiveServer2。
3.2.3 登录和退出
登录状态:成功连接后显示版本信息和提示符
0: jdbc:hive2://master:10000>。Hive 常用退出命令
退出 Beeline 客户端:
清屏:
在命令行界面,可以使用
Ctrl + L快捷键进行清屏。使用
!quit或!exit命令可以退出 Beeline 客户端。取消 Metastore 和 HiveServer2 服务
查看进程:
示例进程列表:
2849 NameNode
2211 QuorumPeerMain
4788 RunJar
4551 RunJar使用
jps -m命令查看 Java 进程,识别出 Metastore 和 HiveServer2 对应的进程。这些进程通常显示为RunJar。终止进程:
kill -9 4788终止进程 ID 为 4788 的进程。kill -9 4551终止进程 ID 为 4551 的进程。使用
kill -9命令强制终止特定的进程。例如,要终止上述列表中的 Metastore 和 HiveServer2 进程,可以执行:
3.3 第三种交互方式
1. 直接执行 HQL 语句
使用 -e 参数可以在不进入 Hive Shell 的情况下直接执行 HQL 语句,并返回结果。
# 创建一个名为 test 的数据库
hive -e "create database test;"
# 切换到 hive_Load_data 数据库,显示所有数据库并查询 test 表的数据
hive -e "use hive_Load_data; show databases; select * from test;"2. 通过文本文件执行 HQL 语句
使用 -f 参数可以运行一个包含 HQL 语句的文本文件。执行完成后,系统会自动返回到 Linux 命令行。
步骤:
编辑 SQL 文件
创建并编辑一个包含 HQL 语句的文本文件,例如
hive.sql:vim hive.sql在文件中编写 HQL 语句:
use test;
desc test;运行 SQL 文件
使用
-f参数执行hive.sql文件中的 HQL 语句:hive -f hive.sql特点:执行完成后,系统会自动返回到 Linux 命令行,而无需进入 Hive Shell。
4、HIVE的基本操作:库、表
1. 说明与命名规范
默认数据库:Hive 有一个默认的数据库
default,如果在执行 HQL 时没有明确指定要使用哪个数据库,则会默认使用default数据库。不区分大小写:Hive 的数据库名和表名都不区分大小写。
命名规则:
名字不能以数字开头。
不能使用 Hive 关键字。
尽量避免使用特殊符号。
2. 创建数据库
-- 语法1:基本创建数据库
CREATE DATABASE mydb;
-- 语法2:创建数据库(如果不存在);默认存放在 /user/hive/warehouse 目录下
CREATE DATABASE IF NOT EXISTS mydb;
-- 语法3:创建数据库(如果不存在),并指定存放的 HDFS 路径
CREATE DATABASE IF NOT EXISTS mydb LOCATION '指定的HDFS路径';【重点归纳】
Hive 数据库与 HDFS 目录:在创建数据库时,Hive 会在 HDFS 的默认存储路径
/user/hive/warehouse下创建一个与数据库同名的文件夹,用于存储该数据库中所有表的数据文件。每个表的数据将存放在该文件夹下的子目录中。例如,如果你创建了一个名为
mydb的数据库,Hive 会在 HDFS 的/user/hive/warehouse/mydb.db目录中为该数据库创建一个目录,用来存放该数据库的所有表数据。假设在
mydb数据库中创建了一个名为mytable的表,Hive 会在mydb.db目录下生成一个名为mytable的子目录。这个子目录/user/hive/warehouse/mydb.db/mytable将用于存储mytable表的数据文件。数据库和表的元数据信息存储在 Hive 的元数据存储中(如 MySQL),但实际的数据文件始终保存在 HDFS 上的这些目录中。因此,管理和维护这些目录与 Hive 的数据库操作息息相关。
3. 查看所有数据库
SHOW DATABASES;
4. 切换数据库
USE mydb;
5. 查看数据库信息
-- 语法1:查看数据库的基本描述(如数据库的名称和在 HDFS 中的位置)
DESC DATABASE databaseName;
-- 语法2:查看数据库的扩展描述(包括元数据、创建时间及其他数据库属性)
DESC DATABASE EXTENDED databaseName;6. 删除数据库
-- 语法1:删除空数据库
DROP DATABASE databasename;
-- 语法2:强制删除非空数据库及其所有内容
DROP DATABASE databasename CASCADE;【重点归纳】
删除与重新创建数据库:在 Hive 中,元数据(如数据库的定义、表结构等)存储在元数据存储中(如 MySQL),而实际的数据文件存储在 HDFS 上。这意味着如果直接删除 HDFS 中的数据库目录,Hive 的元数据存储中仍然会保留关于该数据库的记录。由于元数据仍然存在,Hive 会认为数据库依然存在,这会导致无法使用相同的名称重新创建该数据库。
完全删除 Hive 数据库,包括清理其元数据和 HDFS 上的物理存储,必须使用
DROP DATABASE 数据库名 CASCADE命令。此命令不仅会删除元数据中的数据库记录,还会删除与该数据库相关的所有表及其在 HDFS 上的物理数据文件,确保数据库被彻底删除。
二、场景案例:Apache Hive初体验
1.体验1:Hive使用起来和Mysql差不多吗?
1.1 背景
对于初次接触Apache Hive的人来说,最大的疑惑就是:Hive从数据模型看起来和关系型数据库mysql等好像。包括Hive SQL也是一种类SQL语言。那么实际使用起来如何?
1.2 过程
体验步骤:按照mysql的思维,在hive中创建、切换数据库,创建表并执行插入数据操作,最后查询是否插入成功。
-- 列出所有数据库
show databases;
-- 删除数据库
drop database if exists itcast cascade;
-- 创建数据库
create database if not exists itcast;
-- 选择数据库
use itcast;
--建表
create table t_student(id int,name varchar(255));
--插入一条数据
insert into table t_student values(1,"allen");
--查询表数据
select * from t_student;在执行插入数据的时候,发现插入速度极慢,sql执行时间很长,为什么?

最终插入一条数据**,历史30秒的时间。

查询表数据,显示数据插入成功

1.3 验证
首先登陆Hadoop YARN上观察是否有MapReduce任务执行痕迹。
YARN Web UI: http://resourcemanager_host:8088/

然后登陆Hadoop HDFS浏览文件系统,根据Hive的数据模型,表的数据最终是存储在HDFS和表对应的文件夹下的。
HDFS Web UI: http://namenode_host:9870/

1.4 结论
Hive SQL语法和标准SQL很类似,使得学习成本降低不少。
Hive底层是通过MapReduce执行的数据插入动作,所以速度慢。
如果大数据集这么一条一条插入的话是非常不现实的,成本极高。
Hive应该具有自己特有的数据插入表方式,结构化文件映射成为表。
2.体验2:如何才能将结构化数据映射成为表?
2.1 背景
在Hive中,使用insert+values语句插入数据,底层是通过MapReduce执行的,效率十分低下。此时回到Hive的本质上:可以将结构化的数据文件映射成为一张表,并提供基于表的SQL查询分析。
假如,现在有一份结构化的数据文件,如何才能映射成功呢?在映射成功的过程中需要注意哪些问题?不妨猜想文件的存储路径?字段类型?字段顺序?字段之间的分隔符问题?
2.2 过程
在HDFS根目录下创建一个结构化数据文件user.txt,里面内容如下
1,zhangsan,18,beijing
2,lisi,25,shanghai
3,allen,30,shanghai
4,woon,15,nanjing
5,james,45,hangzhou
6,tony,26,beijing
在hive中创建一张表t_user。注意:字段的类型顺序要和文件中字段保持一致。
-- 选择数据库
use itcast;
-- 创建数据表,增加分隔符指定语句
create table t_user(
id int,
name varchar(255),
age int,
city varchar(255))
row format delimited
fields terminated by ',';
-- 查看库中有哪些表
show tables ;
-- 在master节点上操作
[root@master ~]# hdfs dfs -put user.txt /user/hive/warehouse/itcast.db/t_user
-- 查看表内容
select * from t_user;2.3 验证

此时再创建一张表,保存分隔符语法,但是故意使得字段类型和文件中不一致。
--建表语句 增加分隔符指定语句
create table t_user_2(id int,name int,age varchar(255),city varchar(255))
row format delimited
fields terminated by ',';
#把user.txt文件从本地文件系统上传到hdfs
hadoop fs -put user.txt /user/hive/warehouse/itcast.db/t_user_2/
--执行查询操作
select * from t_user_2;
此时发现,有的列显示null,有的列显示正常。
name字段本身是字符串,但是建表的时候指定int,类型转换不成功;age是数值类型,建表指定字符串类型,可以转换成功。说明hive中具有自带的类型转换功能,但是不一定保证转换成功。
2.4 结论
要想在hive中创建表跟结构化文件映射成功,需要注意以下几个方面问题:
创建表时,字段顺序、字段类型要和文件中保持一致。
如果类型不一致,hive会尝试转换,但是不保证转换成功。不成功显示null。
文件好像要放置在Hive表对应的HDFS目录下,其他路径可以吗?
建表的时候好像要根据文件内容指定分隔符,不指定可以吗?
3.体验3:使用hive进行小数据分析如何?
3.1 背景
因为Hive是基于HDFS进行文件的存储,所以理论上能够支持的数据存储规模很大,天生适合大数据分析。假如Hive中的数据是小数据,再使用Hive开展分析效率如何呢?
3.2 过程
之前我们创建好了一张表t_user_1,现在通过Hive SQL找出当中年龄大于20岁的有几个。

3.3 验证
--执行查询操作
select count(*) from t_user_1 where age > 20;发现又是通过MapReduce程序执行的数据查询功能。

3.4 结论
Hive底层的确是通过MapReduce执行引擎来处理数据的
执行完一个MapReduce程序需要的时间不短
如果是小数据集,使用hive进行分析将得不偿失,延迟很高
如果是大数据集,使用hive进行分析,底层MapReduce分布式计算,很爽