李翔-大数据技术

Big data technology!

第2章 Hive部署

一、Hive的基础原理

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

1.1 Hive是什么?

  1. Hive概述:

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

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

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

  2. Hive特点:

    • Hive不存储和计算数据,主要负责提供SQL接口,依赖HDFS和MapReduce。

    • HQL通过编译转为MapReduce作业,实现对Hadoop中数据的查询和分析。

    • 提供丰富的SQL查询方式,使用户能够方便地进行数据分析。

  3. 数据存储和处理:

    • Hive没有专门的数据格式,数据存储在Hadoop兼容的文件系统(如HDFS)中。

    • 数据加载过程中不对数据进行修改,只是将数据移动到HDFS中,不支持数据的改写和添加。

    • 适用于大规模数据的存储、查询、分析,可进行ETL操作。

  4. 应用场景:

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

    • 可以进行数据提取转化加载(ETL)操作。

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


img


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

image-20231221154939075

Hive的工作原理

image-20240207104353682


1.2 优缺点

2.1 优点

  • Hive 封装了一层接口,并提供类 SQL 的查询功能,避免去写 MapReduce,减少了开发人员的学习成本;

  • Hive 支持用户自定义函数,可以根据自己的需求来实现自己的函数;

  • 适合处理大数据;

  • 可扩展性强:可以自由扩展集群的规模,不需要重启服务而进行横向扩展;

  • 容错性强:可以保障即使有节点出现问题,SQL 语句也可以完成执行;

2.2 缺点

  • Hive 老版本不支持记录级别的增删改操作,但是可以通过查询创建新表来将结果导入到文件中;(hive 2.3.2 版本支持记录级别的插入操作,新版本支持insert语法。)

  • Hive 延迟较高,不适用于实时分析,主要做离线分析;

  • Hive 不支持事物,因为没有增删改,所以主要用来做 OLAP(联机分析处理),而不是 OLTP(联机事物处理);

  • Hive 自动生成的 MapReduce 作业,通常情况下不够智能。


1.3 架构原理

Hive 架构图1:

image-20221117085056597


用户接口:

  • CLI (Command Line Interface): Shell命令行,用于直接执行HiveQL命令。

  • JDBC/ODBC: 通过Thrift服务器,允许外部客户端通过网络与Hive进行JDBC或ODBC协议的交互。

  • WebGUI: 一个基于浏览器的用户界面,可以通过网络访问Hive。

Thrift Server:

  • 开发者Facebook的软件框架,支持可扩展的跨语言服务开发。

  • Hive集成Thrift Server以允许不同编程语言调用Hive接口。

元数据存储:

  • 通常存储在关系数据库中,如MySQL或Derby。

  • 包含表名、列和分区信息、表属性(如是否外部表)以及数据存储目录。

  • 元数据是结构与数据存储位置之间的映射。

Hive Driver (驱动器):

  • Hive架构的核心组件,负责处理HiveQL语句。

  • 包括解释器(Interpreter)、编译器(Compiler)、优化器(Optimizer)和执行器(Executor)。

查询处理流程:

  • 解释器: 将HQL查询转换为抽象语法树AST,并进行语法检查。

  • 编译器: 将AST编译成逻辑执行计划。

  • 优化器: 对逻辑执行计划进行优化处理。

  • 执行器: 将逻辑计划转换为物理执行计划,如MapReduce或Spark任务。

执行引擎:

  • Hive不直接操作数据文件,而是通过执行引擎处理数据。

  • 当前支持的执行引擎包括MapReduce、Tez和Spark。


hive的架构图2:

image-20221117084710938


Hive查询的流程:

  1. 接收查询: 通过用户交互接口接收到HQL(HiveQL)指令。

  2. 类型检测和语法分析: Driver结合元数据对接收到的HQL进行类型检测【比较查询中使用的数据类型与元数据存储中定义的数据类型是否匹配】和语法分析【是否遵循HiveQL的语法规则】。

  3. 生成逻辑方法: 分析后生成一个逻辑执行计划。

  4. 优化: 对逻辑执行计划进行优化。

  5. 生成MapReduce任务: 优化后的逻辑计划被转换成MapReduce任务。

  6. 任务执行: 将MapReduce任务提交到Hadoop集群中执行。

  7. 结果返回: 执行结果返回给用户交互接口


1.4 Hive 与 RDBMS 的比较

Hive 采用类 SQL 的查询语句,所以很容易将 Hive 与关系型数据库(RDBMS)进行对比。但其实 Hive 除了拥有类似 SQL 的查询语句外,再无类似之处。我们需要明白的是:数据库可以用做 online 应用;而 Hive 是为数据仓库设计的。



HiveRDBMS
查询语言HQLSQL
数据存储HDFS本地文件系统中
数据更新读多写少(不建议改写)增删改查
数据操作覆盖追加行级别更新删除
索引0.8 版本后引入 bitmap 索引建立索引
执行MapReduceExecutor
执行延迟延迟较高延迟较低
可扩展性可扩展性高可扩展性低
数据规模很大较小
分区支持支持


总的来说:

Hive 只具备 SQL 的外表,但应用场景完全不同。

Hive 只适合用来做海量离线数据统计分析,也就是数据仓库。


Hive与HBase的区别?

  • Hive是一种能执行MapReduce作业的类SQL编程接口,

  • Hbase是一种非关系型的数据库结构。

结合这两者自身的特点,互相结合使用或许能收到相得益彰的效果。例如:

  • 利用Hive处理静态离线数据,

  • 利用HBase进行联机实时查询,

而后对两者间的结果集进行整合归并,从而使得数据完整且永葆青春,为进一步的商业分析提供良好支持。



二、Hive的安装部署

  1. Hive安装与配置:

    • Hive一般不需要在Hadoop集群的每个节点安装,它作为一个客户端工具,可以运行在Hadoop集群的任意一个节点上。

    • Hive的配置取决于部署环境和需求,可以在伪分布式模式或完全分布式模式下运行。

  2. 伪分布式模式和完全分布式模式:

    • 伪分布式模式是在单个节点上运行Hive,用于开发和测试,模拟分布式环境。

    • 完全分布式模式是Hive运行在真正的Hadoop集群上,利用集群中的多个节点来分布式地处理大规模数据,适用于生产环境。

  3. Hive元数据服务(Hive Metastore):

    • Hive的元数据通常存储在外部的数据库中,例如MySQL。

    • 元数据服务可以独立于计算节点运行,而计算节点负责执行HiveQL查询的MapReduce任务。

  4. Hive和Hadoop集群的交互:

    • Hive需要与Hadoop集群正确交互,通过配置文件指定Hadoop的文件系统地址和MapReduce框架等信息。

    • 在完全分布式环境中,可以只在master节点上安装配置Hive,因为计算任务可以通过Hadoop集群中的节点来执行。


1. 元数据相关名词

1.1 Metadata

Metadata即元数据。元数据包含用Hive创建的database、table、表的位置、类型、属性,字段顺序类型等元信息。元数据存储在关系型数据库中。如hive内置的Derby、或者第三方如MySQL等。

1.2 Metastore

Metastore即元数据服务。Metastore服务的作用是管理metadata元数据,对外暴露服务地址,让各种客户端通过连接metastore服务,由metastore再去连接MySQL数据库来存取元数据。

有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。某种程度上也保证了hive元数据的安全。

image-20240206102400902


2. metastore三种配置方式

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

区分这三种模式的关键在于:

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

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

image-20240206102335856


2.1 内嵌模式

内嵌模式(Embedded Metastore)这是Hive的默认配置。在这种模式下,Metastore服务运行在Hive服务进程内部。它使用内嵌的Derby数据库实例来存储元数据信息。这种模式通常用于测试和开发环境,不推荐用于生产环境。

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

img


2.2 本地模式

本地模式(Local Mode):在这种模式下,Metastore服务运行在一个独立的进程中,但是它运行在与Hive Server相同的主机上。Metastore服务使用一个外部数据库(如MySQL, PostgreSQL等)来存储元数据。

判断方法:如果hive-site.xml配置文件中指定了Metastore服务的连接信息,并且hive.metastore.uris配置项为空或指向本地主机(例如thrift://localhost:9083),则Metastore服务运行在本地模式。


img


2.3 远程模式

远程模式(Remote Mode):在这种模式下,Metastore服务运行在一个独立的进程中,并且可以部署在与Hive Server不同的主机上。这允许多个Hive实例共享同一个Metastore服务,并且可以提供更好的扩展性和可靠性。

判断方法:在hive-site.xml配置文件中,如果hive.metastore.uris设置了远程Metastore服务器的地址(例如thrift://<metastore-host>:<port>),则Metastore服务运行在远程模式。

通常,生产环境中会使用本地模式或远程模式,因为它们支持更健壮的外部数据库解决方案

image-20240206113912422

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


1、前期准备

# 已完成以下组件的安装和配置
- jdk1.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文件到master主机上/opt/software

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 配置环境变量

vim /etc/profile

#添加hive environment
export HIVE_HOME=/opt/apps/hive
export PATH=$PATH:$HIVE_HOME/bin

使profile配置生效

[root@master apps]]# source /etc/profile


2.4 安装mysql环境

前期已经配置完成


2.5 配置hive接入mysql

这里我们采用MySQL数据库保存Hive的元数据,而不是采用Hive自带的derby来存储元数据。

下载mysql jdbc,下载地址:http://www.mysql.com/downloads/connector/j/

下载文件mysql-connector-java-5.1.40.tar.gz,解压jar包并拷贝到/opt/apps/hive/lib目录下

mysql-connector-java-5.1.40.tar.gz 是MySQL数据库的JDBC驱动程序的压缩包,用于在Java应用程序中实现对MySQL数据库的连接和操作。

cd /opt/software
tar -zxvf mysql-connector-java-5.1.40.tar.gz   #解压

#将mysql-connector-java-5.1.40-bin.jar拷贝到/usr/local/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]$ vim 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
# 第一种方法:使用vim编辑新文件
vim hive-site.xml

# 第二种方法:使用touch创建空文件
touch hive-site.xml

配置以下信息

<configuration>
 <!-- 设置连接到存储 Hive 元数据的 MySQL 数据库的 JDBC URL -->
 <!--hive:存储元数据的mysql的库,没有则会自动创建,记录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 监听的端口号 -->
  <property>
     <name>hive.server2.thrift.port</name>
     <value>10000</value>
  </property>
  <!-- 设置 HiveServer2 绑定的主机名 -->
  <property>
     <name>hive.server2.thrift.bind.host</name>
     <value>master</value>
  </property>
  <!-- 打印表头  -->
  <property>
     <name>hive.cli.print.header</name>
     <value>true</value>
  </property>
  <!-- 打印当前所在的库  -->
  <property>
     <name>hive.cli.print.current.db</name>
     <value>true</value>
  </property>
</configuration>


2.8 创建Hive的元数据库【可以跳过此步骤,Hive】

因为在 hive-site.xml 配置文件中使用了 createDatabaseIfNotExist=true 参数,那么在 Hive 第一次尝试连接到 MySQL 时,如果指定的数据库(在这个例子中是 hive 数据库)不存在,它将自动被创建。

# 1.登陆mysql
systemctl status mysqld     #查看mysql服务是否启动
mysql -uroot -p123456       #登陆mysql

# 如果登录失败(如下图),尝试重启mysql服务:systemctl restart mysqld
# ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

# 2.创建数据库
mysql> create database hive;
# 这个hive数据库与hive-site.xml中localhost:3306/hive的hive对应,用来保存hive元数据
# 如果在初始化数据库的时候报错(解决:删除数据库再创建一次)

# 3.查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hive               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

# 4.退出mysql
mysql> quit


2.9 初始化Hive元数据库

使用 MySQL 作为元存储数据库类型,初始化或更新 Hive 的元数据存储结构。

cd /opt/apps/hive

[root@master hive]# ./bin/schematool -initSchema -dbType mysql -verbose

# 初始化成功的状态如下:
.......
# 最后两行的信息
beeline> Initialization script completed
schemaTool completed

# 初始化失败,出现如下错误的日志信息,参照下文5.1更改
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V


3、启动hive

hive有两种客户端

  • hive :  只需要启动metastore一个元数据服务,即可使用Hive CLI访问到hive;

  • beeline :需要启动metastore元数据服务、Hiveserver2两个服务后才可访问hive;

    • HiveServer2 是 Apache Hive 中的一个服务,提供了一个远程的、多用户的 SQL 接口,允许客户端通过 JDBC 或 Thrift 连接到 Hive 并执行执行 SQL 查询、管理数据库等。

    • Thrift 框架 是一个跨语言的服务定义框架,用于开发可在不同编程语言之间通信的服务。在 Hive 中,Thrift 用于定义和生成 HiveServer2 的通信接口,使得各种编程语言的客户端能够与 HiveServer2 交互。

Hive的hive与beeline命令都可以为客户端提供Hive的控制台连接

  1. Hive CLI (Hive Command Line Interface):

    • Hive CLI 允许用户在本地直接与 Hive 交互,通过命令行界面执行 HiveQL 语句。

    • 在 Hive CLI 中执行的 SQL 语句是在客户端本地编译的,然后与 Metastore 进行交互以获取必要的元数据,并最终生成 MapReduce 作业提交到 Hadoop 集群运行。

    • 执行 Hive CLI 时,会自动运行一个名为 RunJar 的进程,实际上就是 Metastore 服务。

    • Hive CLI 可以看作是一个重量级客户端,因为它在本地处理很多工作。

  2. Beeline:

    • Beeline 是 Hive 提供的一个 JDBC 客户端,用于与 HiveServer2 建立连接。

    • 使用 Beeline 时,用户提交的 SQL 语句会发送到 HiveServer2,由 HiveServer2 进行编译、执行以及对 Metastore 的访问,并管理作业的执行。

    • Beeline 支持多用户操作(允许多个用户同时通过不同的会话连接到 HiveServer2),更加安全,并且可以实现权限控制。

    • 相比 Hive CLI,Beeline 是一个轻量级客户端,因为执行 SQL 语句的编译、优化、执行等操作都在 HiveServer2 端完成,客户端主要负责提交查询和接收结果。

简而言之,Hive CLI 是一个重量级的客户端,直接在本地处理 SQL 编译和作业提交,而 Beeline 是一个轻量级客户端,它通过连接 HiveServer2 来处理 SQL 语句和作业提交,并支持更好的多用户操作和安全性。

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 &,服务在后台运行,输出重定向到log.txt。可简化命令:nohup hive --service metastore  &

  2. 启动Hive:

    • 执行命令hive进入Hive命令行。

    • 执行show databases;显示当前所有数据库,其中会显示默认的default数据库。注意:在HDFS的目录结构中不会直接显示default数据库,但在default数据库下建立的表会直接存储在warehouse目录下。

  3. 退出Hive:

    • 执行命令quit;退出Hive命令行界面。

  4. 问题解决:

    • 在启动metastore服务时,如果遇到错误日志信息“SLF4J: Class path contains multiple SLF4J bindings”,需要参考下文的5.3节解决方案来处理这个问题。


知识点解释:

  1. 默认数据库: Hive中的"default"数据库是初始设置的默认数据库,用于存储表和相应的数据。

  2. 表创建默认行为: 在Hive中未指定数据库时创建的表,默认归属于"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 配置文件:

    • conf/hive-site.xml 中添加以下配置项:

      <!-- 禁用 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>


3.2.2 启动服务

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

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

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

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

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

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

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

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

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

    • 以完全后台模式启动服务,输出重定向到日志文件。


3.2.3 启动客户端

  • beeline -u jdbc:hive2://master:10000 -n root

语法解释:

作用:使用 Beeline 客户端以 root 用户名连接到运行在 master 主机上、监听在 10000 端口的 HiveServer2 服务。

  1. beeline: 这是启动 Beeline 客户端的命令。Beeline 是一个基于 JDBC 的命令行工具,用于与 Hive 服务器进行交互。

  2. -u: 这个参数后面跟着的是 JDBC URL,用于指定 Beeline 客户端连接到哪个 Hive 服务器。

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

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

    • master: 这是 Hive 服务器所在的主机名。在这个例子中,Hive 服务器运行在名为 master 的主机上。

    • 10000: 这是 HiveServer2 监听的端口号。默认情况下,HiveServer2 使用的是 10000 端口。

  4. -n root:

    • -n: 指定连接到 Hive 服务器时使用的用户名。

    • root: 这里指定使用 root 用户名来连接 Hive 服务器。


3.2.4 登录和退出

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

    登录成功的状态如下:
    Connecting to jdbc:hive2://master:10000
    Connected to: Apache Hive (version 3.1.2)
    Driver: Hive JDBC (version 2.3.7)
    0: jdbc:hive2://master:10000>
  • Hive 常用退出命令

    退出 Beeline 客户端:

    清屏:

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

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

  • 取消 Metastore 和 HiveServer2 服务

  1. 查看进程:

    示例进程列表:

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

  2. 终止进程:

    • kill -9 4788 终止进程 ID 为 4788 的进程。

    • kill -9 4551 终止进程 ID 为 4551 的进程。

    • 使用 kill -9 命令强制终止特定的进程。

    • 例如,要终止上述列表中的 Metastore 和 HiveServer2 进程,可以执行:


常见错误及解决方案

1. Beeline 客户端运行错误1

  • 问题描述:

    • 当尝试使用 Beeline 客户端连接 Hive 时,出现警告 WARN jdbc.HiveConnection: Failed to connect to master:10000,提示 User: root is not allowed to impersonate root,表示 root 用户无法模拟 root 用户。

  • 解决方案:

    • 参考下文5.4的方案一来解决此问题,需要配置 Hive 以允许 root 用户登录,否则 Beeline 客户端无法连接 Hive。

2. Beeline 客户端运行错误2

  • 问题描述:

    • 在后台启动 Metastore 与 HiveServer2 服务后立即启动 Beeline 客户端,可能会因为这两个服务尚未完全启动而导致连接失败。

  • 解决方案:

    • 方案一: 在后台启动 Metastore 与 HiveServer2 服务后,等待一段时间确保服务完全启动,再启动 Beeline 客户端。

    • 方案二: 前台启动 Metastore 与 HiveServer2 服务,确保服务完全启动后再启动 Beeline 客户端。

    • 方案三: 在另一个终端窗口中,运行 jps 命令查看当前运行的 Java 进程列表。如果 Hive Metastore 和 HiveServer2 服务已经启动,应该能看到它们对应的进程 ID,确认服务启动后再连接 Beeline 客户端。


img

img


3.3 第三种交互方式

# 使用 –e 参数来直接执行hql的语句 (不进入hive,直接操作)
hive -e "create database test;"
hive -e "use hive_Load_data;show databases;select * from test;"

# 使用 –f 参数通过指定文本文件来执行hql的语句
# 特点:执行完sql后,回到linux命令行。
# 编辑sql文件
vim hive.sql
use test;
desc test;

# 运行sql文件(不进入hive,直接操作)
hive -f hive.sql


3.4 Hive 部署之远程模式

(将元数据库放在其他机器上)(多用户模式),将元数据放在别的服务器上,这种的就是咱们常说的集群模式。 可以有一个hive的server和多个hive的client。

我们需要两台虚拟机,一台作为 Hive 服务端,另一台作为 Hive 客户端。

Hive 服务端需要启动以下三个服务:

  1. Hive Metastore:负责存储 Hive 元数据信息,例如表定义、分区信息等。

  2. MySQL 数据库:作为 Hive Metastore 的后端数据库存储 Hive 元数据信息。

  3. HiveServer2:负责处理客户端的请求,执行查询操作,并将结果返回给客户端。

在服务端上完成上述服务的安装和配置后,客户端只需要安装 Hive 并配置连接信息即可连接到 HiveServer2,并执行 Hive 查询操作。

例如:

  • master节点作为服务端:已安装Hive和MySQL

  • slave1节点作为客户端:远程连接虚拟机master中的HiveServer2服务操作Hive


3.4.1 解压并改名

下载apache-hive-2.3.4-bin.tar.gz文件到slave1主机上/opt/software

# 在slave1上操作
mkdir /opt/software
cd /opt/software
sudo tar -zxvf apache-hive-2.3.4-bin.tar.gz -C /opt/apps   # 解压到/opt/apps中
cd /opt/apps/
sudo mv apache-hive-2.3.4-bin hive       # 将文件夹名改为hive


3.4.2  配置环境变量
[root@slave1 apps]$ vim /etc/profile

#添加hive environment
export HIVE_HOME=/opt/apps/hive
export PATH=$PATH:$HIVE_HOME/bin

使profile配置生效

[root@slave1 apps]]$ source /etc/profile


3.4.3  配置hive-site.xml
cd /opt/apps/hive/conf
[root@slave1 conf]$ vim hive-site.xml    # 或者touch hive-site.xml创建空文件

配置以下信息

<configuration>
   <!-- 配置Hive数据存储在HDFS上的目录 -->
<property>
 <name>hive.metastore.warehouse.dir</name>                    
 <value>/user/hive/warehouse</value>    
</property>
   <!-- 配置Hive在HDFS上的临时目录 -->
<property>
 <name>hive.exec.scratchdir</name>
        <value>/tmp_local/hive</value>
</property>
   <!-- 指定Hive不开启本地模式 -->
<property>  
 <name>hive.metastore.local</name>
 <value>false</value>  
</property>  
   <!-- 指定 metastore服务存储元数据要连接的地址(通过thrift协议连接元数据的方法)  -->
<property>  
 <name>hive.metastore.uris</name>
 <value>thrift://master:9083</value>
</property>  
</configuration>


3.4.4 启动Hive服务器端
# 在master上启动
[root@master ~]# hive --service metastore &        # 启动元数据服务
[root@master ~]# hive --service hiveserver2 &      # 启动远程访问服务

在master中启动metastoreHiveServer2服务,服务进入监听状态


3.4.5 启动Hive客户端
beeline -u jdbc:hive2://master:10000 -n root

slave1上执行开户Hive客户端工具Beeline远程连接虚拟机masterHiveServer2服务。


3.4.6 验证Hive远程连接

在master节点上执行“hive”命令,通过Hive客户端工具HiveCLI操作本地模式下的Hive,创建一个新数据库;

分别查看master和slave1数据库列表是否会联动。

# 在master上操作
[root@master ~]#  hive
hive (default)> create database test;
hive (default)> show databases;
# 运行结果
OK
database_name
default
test

# 在slave1上操作
0: jdbc:hive2://master:10000> show databases;
+----------------+
| database_name  |
+----------------+
| default        |
| test           |
+----------------+


3.5  IntelliJ IDEA连接Hive

3.5.1 连接hive

使用hive自带的第一代或第二代hive客户端去写HQL不太方便,接下来使用第三方工具IDEA充当hive客户端的角色。由于Hadoop集群配置在虚拟机中,IDEA只能远程访问hive,所以hive必须必须采用远程模式配置元数据库。

依次启动以下模块:

  • 1.启动hadoop

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

    # 检查各节点的进程
    [root@master ~]# jps
    3728 NameNode
    3906 DataNode
    4745 NodeManager
    4972 Jps

    [root@slave1 ~]# jps
    5686 Jps
    3591 DataNode
    4535 NodeManager
    4380 ResourceManager

    [root@slave2 ~]# jps
    4705 NodeManager
    3672 DataNode
    3961 SecondaryNameNode
    5998 Jps
  • 2.启动(检查)MySQL数据库

    service mysql status   #在master上查看mysql是否已经启动,如已启动无需再启动
  • 3.启动hive元数据库服务

    hive --service metastore &     # 在master节点启动
  • 4.开启hiveserver2远程服务

    hive --service hiveserver2 &   # 在master节点启动远程登录服务

    # 检查master节点的进程
    [root@master ~]# jps
    3728 NameNode
    3906 DataNode
    8852 RunJar
    10756 RunJar
    4745 NodeManager
    11258 Jps
  • 5.启动Hive客户端

    beeline -u jdbc:hive2://master:10000 -n root

    # 如果master节点出现以下日志,表示hive启动成功
    Beeline version 2.3.4 by Apache Hive
    0: jdbc:hive2://master:10000>


检查10000端口号上的进程

netstat -tunlp | grep 10000


3.5.2 打开IDEA进行配置

一、安装windows下面的JDK,并配置环境变量

安装版本:jdk-8u281-windows-x64


二、安装IDEA的2020的专业破解版

IDEA2021以后的版本的maven默认为maven 3.8.1版本;

IDEA2020以前的版本的maven默认为maven 3.6.3版本;

针对一些老项目 还是尽量采用 3.6.3版本,针对idea各个版本的兼容性就很兼容

本教程中建议使用IDEA2020的maven 3.6.3版本,pom.xml安装依赖的时候不会报错

安装IDEA参考:https://www.jb51.net/article/207758.htm

配置IDEA+Hive参考:https://blog.csdn.net/qq_43546676/article/details/127442854


三、配置IDEA

  • 打开IDEA,创建项目


    image-20230321184548247



    image-20230321184904053



配置hive驱动

方法:将hive-jdbc-jar包配置到IDEA中

步骤:打开 Database 窗口

image-20230321185414589


创建 Driver

步骤:选中 Driver ,并点击

image-20230321185304287


image-20230321190439171


下载 Driver 所需依赖 1.去自己的主机上/opt/apps/hive/jdbc 目录中下载hive-jdbc-2.3.4-standalone.jar的 jar 包

注意:默认下载到电脑的桌面上的fsdownload文件夹

image-20230321190133326


2.把hive-jdbc-2.3.4-standalone.jar复制到IDEA中,并连接

在IDEA中粘贴jar包

image-20230321190550847


image-20230321190800109


image-20230321191035708


3.在IDEA中连接jar包

image-20230321191656938


image-20230321191856342


4.开启连接

创建数据源,选择Apache Hive

image-20230321192024569


image-20230321192249366


3.5.3 创建文件,并执行MySQL语句

本例中文件取名为hive.sql

img


执行show databases命令进行测试

img


img


image-20230103185819246


常见命令解释

img


3.5.4 错误坑点

错误:如果master节点上的beeline客户端能正常启动,但是IDEA一直连接Hive失败

原因:可能是在idea里进行连接的时候,主机名使用的是master,可以尝试在Windows的命令提示符(cmd)下使用"ping master"命令来测试主机名是否能够被解析,如果不能ping通,使用IP地址代替主机名进行连接如果ping通,说明在windows没有做IP映射,不能远程进行访问master

解决:

1.把master更改为IP地址访问连接

image-20230426113336412

image-20230426113513105


2.尝试手动添加主机名和IP地址的映射关系,编辑Windows系统下的"hosts"文件,将主机名和IP地址的映射关系添加到该文件中,以便系统能够正确地解析主机名。该文件的路径为C:\Windows\System32\drivers\etc\hosts

另外,还需要确保IDEA和beeline客户端连接的网络配置相同,例如连接端口、用户名和密码等信息需要一致。如果以上步骤均未解决问题,建议检查网络防火墙service firewalld status和代理设置,以确保网络连接没有被阻止。



错误:idea中SQL语句提示SQL Dialect is Not Configured

原因:是没有配置数据库类型

解决:file -->setting --> language&frameworks --> sql dialects 选择数据库类型,比如mysql

image-20230419215854307




五、管理配置和项目依赖

3.5.5 设置每次打开idea都不用重新配置maven


问题描述:

使用 idea 开发工具每次新建一个项目或者重新导入打开一个新的项目,都需要重新配置一下 maven(Maven home path 和 User settings file),如何设置才能永久不再去设置呢?

根本原因:

是因为没有设置成为全局配置,所以新建都要重新配置。

解决方案:

设置 Maven 路径和用户配置文件,将maven作为全局配置:

1、选择file>other settings>settings for new projets选项(如果没有此路径,可能你的IDEA版本比较新,路径为file>new projects settings>settings for new projets)

img

2、选择build,execution,deployment>build tools>maven选项,配置maven home dictionary和user settings file

image-20230126104640125


3.5.6 解决 IDEA maven库下载依赖包速度很慢问题

使用 IDEA 在pom.xml中添加maven 依赖包时下载依赖包大部分速度很慢,很慢,通过这样修改,使用阿里的maven镜像就可以了,速度快到飞起

操作步骤:

打开settings.xml的两种方法

1.1 方法一:右键项目选中maven选项,然后选择“open settings.xml”或者 “create settings.xml”。如果之前没有创建过,就是“create settings.xml”,我已经修改过了,所以只出现“open settings.xml”

img

1.2 方法二:选择File > Setting s> build,execution,deployment > build tools > maven选项,查看user settings file的settings.xml配置文件的路径,使用编辑器进行编辑

image-20230126105700002


2、然后把如下代码粘贴进去就可以了。如果不可以,就重启IDEA。

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
   <mirrors>
       <!-- mirror
        | Specifies a repository mirror site to use instead of a given repository. The repository that [指定要使用的存储库镜像站点代替给定默认的存储库。]
        | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
        | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
        |
       <mirror>
         <id>mirrorId</id>
         <mirrorOf>repositoryId</mirrorOf>
         <name>Human Readable Name for this Mirror.</name>
         <url>http://my.repository.com/repo/path</url>
       </mirror>
        -->

       <mirror>
           <id>alimaven</id>
           <name>aliyun maven</name>
           <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
           <mirrorOf>central</mirrorOf>
       </mirror>

       <mirror>
           <id>uk</id>
           <mirrorOf>central</mirrorOf>
           <name>Human Readable Name for this Mirror.</name>
           <url>http://uk.maven.org/maven2/</url>
       </mirror>

       <mirror>
           <id>CN</id>
           <name>OSChina Central</name>
           <url>http://maven.oschina.net/content/groups/public/</url>
           <mirrorOf>central</mirrorOf>
       </mirror>

       <mirror>
           <id>nexus</id>
           <name>internal nexus repository</name>
           <!-- <url>http://192.168.1.100:8081/nexus/content/groups/public/</url>-->
           <url>http://repo.maven.apache.org/maven2</url>
           <mirrorOf>central</mirrorOf>
       </mirror>

   </mirrors>
</settings>


4、HIVE的基本操作:库、表

1、说明和命名规范

hive有一个默认的数据库default,在操作HQL时,如果不明确的指定要使用哪个库,则使用默认数据库。
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目录下创建相应的文件夹来存储该数据库的表数据;如果只是删除HDFS上的数据库目录并不会影响Hive的元数据。

  • 删除和重新创建数据库:Hive的元数据和HDFS的物理存储是分开的,因此在HDFS中删除数据库目录后,Hive元数据仍认为数据库存在,导致无法用同名重新创建数据库。完全删除Hive数据库需使用DROP DATABASE  数据库名 CASCADE命令,同时清理元数据和物理存储。

3、 查看所有数据库

语法:show database;

4、切换数据库

语法:use mydb;

5、查看数据库信息

语法1:(查看数据库基本描述,如数据库的名称和在HDFS中的位置)
desc database databaseName;
语法2:(查看数据库扩展描述,除了基础信息外,还显示如数据库的元数据、创建时间和其他数据库属性。)
desc database extended databaseName;

6、删除数据库

语法1:drop database databasename;          #这个只能删除空库
语法2:drop database databasename cascade;  #如果不是空库,则可以加cascade强制删除


5、错误坑点:

5.1 初始化Hive元数据库,出现错误的日志信息

[root@master conf]# schematool -initSchema -dbType mysql -verbose
# 错误
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V

# 问题原因:
com.google.common.base.Preconditions.checkArgument 这是因为hive内依赖的guava.jar和hadoop内的版本不一致造成的。

# 解决方案:
1.查看hadoop安装目录下share/hadoop/common/lib内guava.jar版本
cd /opt/apps/hadoop/share/hadoop/common/lib
# 查看的结果是guava-27.0-jre.jar

2.查看hive安装目录下lib内guava.jar的版本 如果两者不一致,删除版本低的,并拷贝高版本的 问题解决!
cd /opt/apps/hive/lib
# 查看的结果是guava-19.0.jar

# 本操作是把hadoop下的guava-27.0-jre.jar 替换 Hive下的 guava-19.0.jar


5.2 启动hive客户端,出现错误的日志信息

hive> show tables;
FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClien

# 问题原因:
hive.site.xml配置了metastore服务,但是没有启动

# 解决方案:
在启动hive客户端前,先启动 hive --service metastore


5.3 启动metastore服务时,出现错误的日志信息

hive --service metastore 启动时出现以下日志信息

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/hive/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/local/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]

# 问题原因:
类路径下包含重复的SLF4J绑定,然后给出了重复的两个全路径类名,可能会导致日志输出异常
hive和hadoop中的SLF4J的jar包重复了
SLF4J:JAVA的日志框架

# 解决方案:
# 建议移除 /usr/local/hive/lib/log4j-slf4j-impl-2.6.2.jar 中的 SLF4J 绑定,因为通常情况下 Hadoop 自带的 slf4j-log4j12-1.7.10.jar 是较为常用的版本,并且这个版本的绑定实现也比较完整。
cd /opt/apps/hive/lib/
mv log4j-slf4j-impl-2.6.2.jar log4j-slf4j-impl-2.6.2.jar.bak


5.4 HIVE查看文件日志巧妙方法

1.先关闭hive
# Hive的log默认存放在/tmp/root/hive.log目录下(当前用户名下)
2.再开一个新窗口,输入 tail -f  /tmp/root/hive.log  #  -f 常用于查阅正在改变的日志文件。多敲几个空行,作为此次日志的起始
3.再次打开hive
4.第2个窗口查看日志


5.5 beeline客户端运行错误1:

## 方法一:[建议采用这种方法]

# 启动客户端:
1. beeline -u jdbc:hive2://master:10000 -n root
2. 启动客户端后,运行select count(*) from 表名,会启动MR, 出现以下类似报错
# 出现错误:
WARN jdbc.HiveConnection: Failed to connect to master:10000
.......
User: root is not allowed to impersonate root        impersonate/模拟/


# 错误类型:
`错误类型:User: AAA is not allowed to impersonate BBB`
- AAA 指的是 hdfs 文件系统的用户
- BBB 是hive 设置的 hiveserver2 配置文件中的登陆用户名

# 分析原因:
`beeline -u jdbc:hive2://master:10000 -n root` 使用的是`root`用户名登录beeline
hive.server2.enable.doAs 是一个 Hive 配置参数,它用于指定是否允许 Hive Server2 使用代理用户的身份进行访问,也就是是否启用 doAs 功能。如果启用了 doAs 功能,那么 Hive Server2 会尝试使用客户端提供的用户名和代理用户名来访问 Hadoop 文件系统和其他 Hadoop 组件,这样就可以实现对 Hadoop 资源的访问控制。

当出现 User: root is not allowed to impersonate root 错误时,通常是因为 Hive Server2 在使用 doAs 功能的情况下,试图使用 root 用户的身份来执行某些操作,但是在 Hadoop 集群中,root 用户是被禁止使用 doAs 功能的。因此,为了解决这个错误,需要在 Hive 配置文件中将 hive.server2.enable.doAs 参数设置为 false,即禁用 doAs 功能。

如果设置为true,HiveServer2会模拟提交用户的身份去执行语句; 如果设置为false,HiveServer2会以启动它的管理员用户来执行语句。


# 解决方法:
# 更改Hive的conf/hive.site.xml,添加以下信息
<property>
  <name>hive.server2.enable.doAs</name>
  <value>false</value>
  <description>Enable user impersonation for HiveServer2</description>
</property>
# 解释:
hive.server2.enable.doAs是Apache Hive的一个配置参数,用于控制是否启用模拟用户(impersonation)。模拟用户允许一个用户代表另一个用户执行操作,这在多个用户需要访问相同资源的情况下非常有用。
当设置该参数为 true 时,Hive Server 2启用模拟用户,这意味着用户可以代表另一个用户执行操作。例如,如果用户A有权限访问某个资源,而用户B没有这些权限,则用户B可以使用模拟用户来以用户A的身份访问该资源。
但是,如果将该参数设置为 false,则禁用模拟用户,用户只能基于其自身的权限访问资源。

重启hadoop集群

重新启动Hive的metastorehiveserver2服务

再次启动beeline,问题解决


## 方法二:[使用方法一,此方法不再使用]

# 启动客户端:
1. beeline -u jdbc:hive2://master:10000 -n root
2. 启动客户端后,运行select count(*) from 表名,会启动MR, 出现以下类似报错
# 出现错误:
WARN jdbc.HiveConnection: Failed to connect to master:10000
.......
User: root is not allowed to impersonate root        impersonate/模拟/

# 错误类型:
`错误类型:User: AAA is not allowed to impersonate BBB`
- AAA 指的是 hdfs 文件系统的用户
- BBB 是hive 设置的 hiveserver2 配置文件中的登陆用户名

# 分析原因:
`beeline -u jdbc:hive2://master:10000 -n root` 使用的是`root`用户名登录beeline
此方法是通过hive的thrift服务来实现跨语言访问Hive数据仓库,但是hadoop引入了一个安全伪装机制,使得hadoop不允许上层系统直接将实际用户传递到hadoop层,而是将实际用户传递给一个超级代理,由此代理在hadoop上执行操作,从而避免任意客户端随意操作hadoop。
`任何用户,要提交任务到hadoop上必须配置代理用户

image-20221117095158279


图上的超级代理是“Oozie”,你自己的超级代理是下面设置的proxyuser后面的“xxx”。

解决措施:

允许用 root 用户登录hive

在hadoop的core-site.xml中添加(三台机器都要进行更改添加)

<!-- 下面配置中root是hdfs文件系统的用户名 -->
<!-- 允许 root 用户从任何主机代理任何组的用户,进行各种操作。 -->
<!-- root 用户可以从任何主机代理用户访问hdfs集群-->
<property>
  <name>hadoop.proxyuser.root.hosts</name>
  <value>*</value>
</property>
<!-- root 用户可以代理任何组的用户-->
<property>
  <name>hadoop.proxyuser.root.groups</name>
  <value>*</value>
</property>

重启hadoop集群

重新启动Hive的metastorehiveserver2服务

再次启动beeline,问题解决


5.6 Hive表字段Comment中文乱码

问题:默认Hive中创建有中文注释的表时,无论是在Hive CLI还是Hue中该注释显示都会是乱码。如使用以下建表语句:

解决:因为mysql中的元数据库Hive的表COLUMNS_V2中的字段COMMENT编码问题导致的,需要设置为utf-8

# 在mysql中设置该字段的编码为utf-8,如下所示:
mysql –uroot –p123456
use hive;

alter table COLUMNS_V2 modify column COMMENT varchar(256) character set utf8;
FLUSH  PRIVILEGES;
  • 查看以前的表

    • 发现依旧显示为乱码。

    • 需要修改以前的表的comment才能显示正常,在Hive CLI中执行,例如命令如下

    • ALTER TABLE test_table1 change column s2 s2 STRING COMMENT '我很好';

或者,删除旧表,重新建新表,comment就能正常显示中文。


三、场景案例:Apache Hive初体验

1.体验1:Hive使用起来和Mysql差不多吗?

1.1 背景

对于初次接触Apache Hive的人来说,最大的疑惑就是:Hive从数据模型看起来和关系型数据库mysql等好像。包括Hive SQL也是一种类SQL语言。那么实际使用起来如何?

1.2 过程

体验步骤:按照mysql的思维,在hive中创建、切换数据库,创建表并执行插入数据操作,最后查询是否插入成功。

create database itcast;--创建数据库
show databases;--列出所有数据库
use itcast;--切换数据库

img


--建表
create table t_student(id int,name varchar(255));
--插入一条数据
insert into table t_student values(1,"allen");
--查询表数据
select * from t_student;


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

img


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

img


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

img


1.3 验证

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

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

img

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

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

img


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


img

在hive中创建一张表t_user。注意:字段的类型顺序要和文件中字段保持一致

create table t_user(id int,name varchar(255),age int,city varchar(255));


2.3 验证

执行数据查询操作,发现表中并没有数据。

猜想:难道数据文件要放置在表对应的HDFS路径下才可以成功?

img

再次执行查询操作,显示如下,都是null:

img

表感知到结构化文件的存在,但是并没有正确识别文件中的数据。猜想:还需要指定文件中字段之间的分隔符?重建张新表,指定分隔符。


--建表语句 增加分隔符指定语句
create table t_user_1(id int,name varchar(255),age int,city varchar(255))
row format delimited
fields terminated by ',';
--关于分隔符语法 后续学习展开

#把user.txt文件从本地文件系统上传到hdfs
hadoop fs -put user.txt /user/hive/warehouse/itcast.db/t_user_1/

--执行查询操作
select * from t_user_1;

img


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

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

img

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

img


3.3 验证

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

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

img


3.4 结论

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

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

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

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


发表评论:

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

Powered By Z-BlogPHP 1.7.3

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