李翔-大数据技术

Big data technology!

第7章 Hive的安装部署

一、Hive的基础原理

Hive是一个基于Hadoop的数据仓库工具,可以将结构化的数据文件映射成一张数据表,并可以使用类似SQL的方式来对数据文件进行读写以及管理。这套Hive SQL 简称HQL。

1.1 Hive是什么?

  1. Hive概述:

    • Apache Hive是建立在Hadoop顶层的数据仓库,不是数据库。

    • 作为用户编程接口,不存储和计算数据,主要提供在Hadoop下使用SQL的接口。

    • 依赖于HDFS和MapReduce,提供类似SQL的查询语言(HQL)。

  2. Hive特点:

    • 不负责存储和计算数据,依赖 HDFS 和 MapReduce。

    • HQL 查询会被转换为 MapReduce 作业,用于对 Hadoop 中的数据进行查询和分析。

    • 提供类 SQL 的查询方式,简化了大数据分析的复杂性。

  3. 应用场景:

    • Hive 主要用于大数据仓库,支持海量数据的存储和分析。

    • 常用于数据的提取、转换、加载(ETL)操作。

    • 用户可以通过 HQL 方便地进行数据查询、汇总和分析。


Hive 的本质:是「将 HQL 转换成 MapReduce 程序或者 spark 程序

image-20231221154939075



hive的架构图:

image-20221117084710938


Hive 查询的流程(结合图示):

  1. 接收查询(图中的步骤1):

    • 用户通过用户界面(UI)编写并提交一条 SQL 查询(HQL)。这条查询被传递到 Hive 的核心组件进行处理。

  2. SQL语句解析(图中的步骤2):

    SQL语句编译(图中的步骤2):

    执行计划优化(图中的步骤2):

    • 优化器对生成的逻辑计划进行优化。这个优化步骤是为了提高查询的执行效率,比如减少数据处理的时间和资源消耗。

    • SQL 语句通过语法检查后,编译器会将其转换为一个逻辑执行计划。这一计划描述了查询如何从输入数据中提取所需信息。

    • 类型检查: SQL 语句首先经过语法解析器的检查。Hive 的 Driver 模块会结合存储在元数据存储中的信息,对查询中涉及的数据类型进行匹配和验证。

    • 语法分析: 语法解析器还会检查 SQL 语句是否符合 HiveQL 的语法规则,如果语法正确,查询会继续进行。

  3. 查询元数据(图中的步骤3):

    • 在逻辑计划优化之后,Hive 会通过元数据存储(Metastore)查询相关表和列的信息。元数据包含了 Hive 表的结构信息(如表名、字段名、字段类型、分区信息等),这些信息对将逻辑计划转换为实际执行任务至关重要。

  4. 生成执行任务(图中的步骤4):

    • 优化后的逻辑计划结合查询到的元数据,最终被转换为实际的执行任务,通常是一个或多个 MapReduce 任务。在图中,这一步会生成需要在 Hadoop 集群上执行的 MapReduce 程序,并将其提交给 YARN 来调度执行。

  5. 任务执行(图中的步骤5):

    • Hadoop 集群上的 YARN 调度并执行这些 MapReduce 任务。这些任务会读取存储在 HDFS 上的数据(如图中显示的 china_user.txt 文件),并按照计划执行数据处理。

  6. 返回结果(图中的步骤6):

    • 执行完毕后,结果会被返回给用户界面,供用户查看。用户可以在 UI 中看到查询的结果数据。

这种顺序更清晰地反映了 Hive 的查询处理过程,在计划优化之后进行元数据查询,以确保执行任务生成时能准确获取数据结构和其他必要信息。


1.2 Hive 与 RDBMS 的比较

虽然 Hive 使用类似 SQL 的查询语言,但除了这点相似之外,Hive 与关系型数据库(RDBMS)在其他方面差异显著。关键在于:RDBMS 适用于在线应用,而 Hive 则专为数据仓库设计。

特征HiveRDBMS
查询语言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 的元数据可以被多个客户端方便、安全地访问和管理。


image-20240206102400902


3. metastore三种配置方式

在 Hive 中,元数据存储(Metastore)服务可以通过三种模式进行配置:内嵌模式、本地模式和远程模式

理解这三种模式的关键是:

  1. Metastore 服务是否作为独立的进程运行,以及是否与 Hive 服务器分开部署(远程模式)。

  2. 元数据是存储在内嵌的 Derby 数据库中,还是使用外部的关系型数据库(如 MySQL)(本地模式和远程模式)。

image-20240818130339477


3.1 内嵌模式

内嵌模式(Embedded Metastore)是 Hive 的默认配置方式。在这种模式下,Metastore 服务直接运行在 Hive 的进程内部,并使用内嵌的 Derby 数据库来存储元数据。这种模式适合开发和测试环境,但不推荐用于生产环境。

如何判断: 如果 Hive 的配置文件 hive-site.xml 中没有特别指定 Metastore 服务的连接信息(比如 javax.jdo.option.ConnectionURL),那么就是在使用内嵌模式。

img


3.2 本地模式

本地模式(Local Mode):在这种模式下,Metastore 服务作为一个独立进程运行,但它和 Hive Server 在同一台机器上。这种模式下,Metastore 使用外部数据库(如 MySQL 或 PostgreSQL)来存储元数据。

如何判断: 如果 hive-site.xml 配置文件中指定了 Metastore 的连接信息,并且 hive.metastore.uris 配置为空或指向本地主机(例如 thrift://localhost:9083),则表示正在使用本地模式。


img


3.3 远程模式

远程模式(Remote Mode):在这种模式下,Metastore 作为独立的进程运行,可以部署在与 Hive Server 不同的主机上。此模式下,多个 Hive 实例可以共享同一个 Metastore 服务,适合需要高扩展性和高可用性的生产环境。

如何判断是否使用远程模式:如果 hive-site.xml 配置文件中的 hive.metastore.uris 配置了远程 Metastore 服务器的地址(例如 thrift://<metastore-host>:<port>),则表示 Hive 正在使用远程模式。

通常在生产环境中,会选择本地模式或远程模式,因为这两种模式使用外部数据库作为元数据存储,相较于嵌入式模式更为可靠和高效。

image-20240206113912422

本系列课程中使用企业推荐模式--远程模式部署。


三、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/lib


2.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/hive


2.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&amp;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.bf


2.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 两个服务。


wps32


启动环境

在启动hive之前,要保证成功启动hadoop完全分布式集群启动Yarn启动mysql服务【默认开机启动】

start-dfs.sh           #在master上启动HDFS
start-yarn.sh          #在slave1上启动Yarn


3.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;


知识点解释:

  1. 默认数据库:

    • 在 Hive 中,default 数据库是系统默认创建的,用于存储表和相应的数据。如果没有指定其他数据库,表将默认存储在 default 数据库中。

  2. 表创建的默认行为:

    • 如果在创建表时未指定数据库,Hive 会将这些表归属于 default 数据库。这意味着在未明确指定的情况下,所有新创建的表都会默认存放在 default 数据库中。

  3. 数据存储位置:

    • default 数据库中创建的表,其数据物理上存储在 HDFS 的 Hive 仓库目录下。虽然在 HDFS 中不会直接看到名为 default 的目录,但表数据通常存放在由 hive.metastore.warehouse.dir 参数指定的路径中,常见路径为 /user/hive/warehouse/your_table

  4. 逻辑与物理映射:

    • Hive 使用元数据存储(通常使用 MySQL)将数据库和表的逻辑名称映射到 HDFS 上的物理路径。即使在 HDFS 中不直接显示数据库名称,Hive 通过元数据管理,使得数据能够被正确存储、管理和定位。


3.2 第二种交互方式

官方推荐:通过服务连接的方式(服务端启动metastore服务和hiveserver2服务,启动beeline客户端

3.2.1 启动服务

  1. 方法一:前台启动【每个服务在独立的终端窗口运行】:

    • hive --service metastore         // 启动元数据服务

    • hive --service hiveserver2    // 启动远程访问服务,客户端可通过 JDBC连接到 Hive 进行交互。

  2. 方法二:后台启动【不占用终端窗口】【推荐此方法】:

    • hive --service metastore &         // 后台启动元数据服务

    • hive --service hiveserver2 &    // 后台启动远程访问服务

  3. 方法三:完全后台启动:

    • nohup hive --service metastore>log.txt 2>&1 &

    • nohup hive --service hiveserver2>log.txt 2>&1 &

    • 以完全后台模式启动服务,输出【日志和错误信息】重定向到日志文件。

  4. 方法四:完全后台启动的简化命令:


    • 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 的交互。

  1. beeline:

    • 启动 Beeline 客户端的命令。Beeline 是一个基于 JDBC 的命令行工具,用于与 HiveServer2 进行交互。

  2. -u:

    • 指定连接的 JDBC URL。

  3. jdbc:hive2://master:10000:

    • jdbc:hive2: 指定使用 JDBC 连接到 Hive 2 服务。

    • master: HiveServer2 所在的主机名(在此例中为 master)。

    • 10000: HiveServer2 监听的端口号,默认是 10000。

  4. -n root:

    • -n: 指定连接时使用的用户名。

    • root: 使用 root 用户名连接到 HiveServer2。


3.2.3 登录和退出

  • 登录状态:成功连接后显示版本信息和提示符 0: jdbc:hive2://master:10000>


  • Hive 常用退出命令

    退出 Beeline 客户端:

    清屏:

    • 在命令行界面,可以使用 Ctrl + L 快捷键进行清屏。

    • 使用 !quit!exit 命令可以退出 Beeline 客户端。

  • 取消 Metastore 和 HiveServer2 服务

  1. 查看进程:

    示例进程列表:

    2849 NameNode
    2211 QuorumPeerMain
    4788 RunJar
    4551 RunJar
    • 使用 jps -m 命令查看 Java 进程,识别出 Metastore 和 HiveServer2 对应的进程。这些进程通常显示为 RunJar

  2. 终止进程:

    • 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 命令行。

步骤:

  1. 编辑 SQL 文件

    创建并编辑一个包含 HQL 语句的文本文件,例如 hive.sql

    vim hive.sql

    在文件中编写 HQL 语句:

    use test;
    desc test;
  2. 运行 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;

image-20241013182109748

--建表
create table t_student(id int,name varchar(255));

--插入一条数据
insert into table t_student values(1,"allen");

--查询表数据
select * from t_student;


在执行插入数据的时候,发现插入速度极慢,sql执行时间很长,为什么?

image-20241013182142125


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

image-20241013182217445


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

image-20241013182241944

1.3 验证

首先登陆Hadoop YARN上观察是否有MapReduce任务执行痕迹。

YARN Web UI: http://resourcemanager_host:8088/

image-20241013182313872

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

HDFS Web UI: http://namenode_host:9870/

image-20241013182346551


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


image-20241013182418475

在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 验证

image-20241013182445679


此时再创建一张表,保存分隔符语法,但是故意使得字段类型和文件中不一致。

--建表语句 增加分隔符指定语句
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;

image-20241013182511661

此时发现,有的列显示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岁的有几个。

image-20241013182537664


3.3 验证

--执行查询操作
select count(*) from t_user_1 where age > 20;

发现又是通过MapReduce程序执行的数据查询功能。

image-20241013182612154


3.4 结论

  • Hive底层的确是通过MapReduce执行引擎来处理数据的

  • 执行完一个MapReduce程序需要的时间不短

  • 如果是小数据集,使用hive进行分析将得不偿失,延迟很高

  • 如果是大数据集,使用hive进行分析,底层MapReduce分布式计算,很爽


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Powered By Z-BlogPHP 1.7.3

版权:李翔
备案/许可证编号为:新ICP备2024006115号-1