Advertisement

Hive基础知识

阅读量:

Hive 简介

1、什么是 Hive

Hive 由 Facebook 实现并开源,是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据映射为一张数据库表,并提供 HQL(Hive SQL)查询功能,底层数据是存储在 HDFS 上 。Hive的本质是将 SQL 语句转换为 MapReduce 任务运行,使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,适用于离线的批量数据计算。
数据仓库之父比尔·恩门(Bill Inmon)在 1991 年出版的“Building the Data Warehouse”(《建立数据仓库》)一书中所提出的定义被广泛接受——数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。
Hive 依赖于 HDFS 存储数据,Hive 将 HQL 转换成 MapReduce 执行
所以说 Hive 是基于 Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce计算框架,对存储在 HDFS 中的数据进行分析和管理。

在这里插入图片描述

Hive 特点

优点:
1、可扩展性,横向扩展 ,Hive 可以自由的扩展集群的规模,一般情况下不需要重启服务
横向扩展:通过分担压力的方式扩展集群的规模
纵向扩展:一台服务器cpu i7-6700k 4核心8线程,8核心16线程,内存64G => 128G
2、延展性 ,Hive 支持自定义函数,用户可以根据自己的需求来实现自己的函数
3、良好的容错性 ,可以保障即使有节点出现问题,SQL 语句仍可完成执行
缺点:
1、Hive 不支持记录级别的增删改操作 ,但是用户可以通过查询生成新表或者将查询结果导入到文件中(当前选择的 hive-2.3.2 的版本支持记录级别的插入操作)
2、Hive 的查询延时很严重 ,因为 MapReduce Job 的启动过程消耗很长时间,所以不能用在交互查询系统中。
3、Hive 不支持事务 (因为不没有增删改,所以主要用来做 OLAP(联机分析处理),而不是 OLTP(联机事务处理),这就是数据处理的两大级别)。

Hive 和 RDBMS 的对比

这里是引用
总结:Hive 具有 SQL 数据库的外表,但应用场景完全不同,Hive 只适合用来做海量离线数 据统计分析,也就是数据仓库

Hive 架构

这里是引用
基本组成
一、用户接口
CLI,Shell 终端命令行(Command Line Interface),采用交互形式使用 Hive 命令行与 Hive进行交互,最常用(学习,调试,生产)JDBC/ODBC,是 Hive 的基于 JDBC 操作提供的客户端,用户(开发员,运维人员)通过这连接至 Hive server 服务Web UI,通过浏览器访问 Hive。
二、Thrift Server
Thrift 是 Facebook 开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,
Hive 集成了该服务,能让不同的编程语言调用 Hive 的接口。
三、元数据存储
元数据,通俗的讲,就是存储在 Hive 中的数据的描述信息
**Hive 中的元数据通常包括:表的名字,**表的列和分区及其属性,表的属性(内部表和外部表),表的数据所在目录Metastore 默认存在自带的 Derby 数据库中。缺点就是不适合多用户操作,并且数据存储目录不固定。数据库跟着 Hive 走,极度不方便管理
解决方案:通常存我们自己创建的 MySQL 库(本地 或 远程)Hive 和 MySQL 之间通过 MetaStore 服务交互。
四、Driver:编译器(Compiler),优化器(Optimizer),执行器(Executor)
Driver 组件完成 HQL 查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行
计划的生成。生成的逻辑执行计划存储在 HDFS 中,并随后由 MapReduce 调用执行
Hive 的核心是驱动引擎, 驱动引擎由四部分组成:
(1) 解释器:解释器的作用是将 HiveSQL 语句转换为抽象语法树(AST)
(2) 编译器:编译器是将语法树编译为逻辑执行计划
(3) 优化器:优化器是对逻辑执行计划进行优化
(4) 执行器:执行器是调用底层的运行框架执行逻辑执行计划
五、执行流程
HiveQL 通过命令行或者客户端提交,经过 Compiler 编译器,运用 MetaStore 中的元数
据进行类型检测和语法分析,生成一个逻辑方案(Logical Plan),然后通过的优化处理,产生
一个 MapReduce 任务。

应用场景:

olap:Online Analytical Processing 联机分析处理 查询select
oltp:On-LineTransaction Processing 联机事物处理 insert update delete
数据库:联机事物处理 insert update delete
数据仓库:联机分析处理 select
hive中不支持delete update操作

**>

Hive 的数据存储

1、Hive 的存储结构包括数据库、表、视图、分区和表数据等。数据库,表,分区等等都对
应 HDFS 上的一个目录。表数据对应 HDFS 对应目录下的文件。
2、Hive 中所有的数据都存储在 HDFS 中,没有专门的数据存储格式,因为 Hive 是读模式
(Schema On Read),可支持 TextFile,SequenceFile,RCFile 或者自定义格式等。
3、 只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据
Hive 的默认列分隔符:控制符 Ctrl + A,\x01
Hive 的默认行分隔符:换行符 \n
4、Hive 中包含以下数据模型:
database:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
table:在 HDFS 中表现所属 database 目录下一个文件夹
external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径
partition:在 HDFS 中表现为 table 目录下的子目录
bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散
列之后的多个文件
view:与传统数据库类似,只读,基于基本表创建
5、Hive 的元数据存储在 RDBMS 中,除元数据外的其它所有数据都基于 HDFS 存储。默认情
况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的
测试。实际生产环境中不适用,为了支持多用户会话,则需要一个独立的元数据库,使用
MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持。
6、Hive 中的表分为内部表、外部表、分区表和 Bucket 表
内部表和外部表的区别:
删除内部表,删除表元数据和数据
删除外部表,删除元数据,不删除数据
内部表和外部表的使用选择:
大多数情况,他们的区别不明显,如果数据的所有处理都在 Hive 中进行,那么倾向于
选择内部表,但是如果 Hive 和其他工具要针对相同的数据集进行处理,外部表更合适。
使用外部表访问存储在 HDFS 上的初始数据,然后通过 Hive 转换数据并存到内部表中
使用外部表的场景是针对一个数据集有多个不同的 Schema
通过外部表和内部表的区别和使用选择的对比可以看出来,hive 其实仅仅只是对存储在
HDFS 上的数据提供了一种新的抽象。而不是管理存储在 HDFS 上的数据。所以不管创建内部
表还是外部表,都可以对 hive 表的数据存储目录中的数据进行增删操作。
分区表和分桶表的区别:
Hive 数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同
时表和分区也可以进一步被划分为 Buckets,分桶表的原理和 MapReduce 编程中的
HashPartitioner 的原理类似
分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于 Hive 是读模式,所
以对添加进分区的数据不做模式校验,分桶表中的数据是按照某些分桶字段进行 hash 散列
形成的多个文件,所以数据的准确性也高很多

Hive 环境搭建

外置 MySQL 版本
1、准备好 MySQL(请参考以下文档,或者自行安装 MySQL,或者一个可用的 MySQL)
2、传安装包 apache-hive-2.3.2-bin.tar.gz
3、解压安装包 tar -zxvf apache-hive-2.3.2-bin.tar.gz -c /apps
4、修改配置文件
[hadoop@hadoop112 conf]$ vi hive-site.xml

复制代码
    <configuration>
    <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://hadoop112:3306/hivedb?createDatabaseIfNotExist=true</value>
    <description>JDBC connect string for a JDBC metastore</description>
    <!-- 如果 mysql 和 hive 在同一个服务器节点,那么请更改 hadoop02 为 localhost -->
    </property>
    <property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
    <description>Driver class name for a JDBC metastore</description>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
    <description>username to use against metastore database</description>
    </property>
    <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>123456</value>
    <description>password to use against metastore database</description>
    </property>
    <!-- 可选配置,该配置信息用来指定 Hive 数据仓库的数据存储在 HDFS 上的目录 t -->
    <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
    <description>hive default warehouse, if nessecory, change it</description>
    </property>
    </configuration>

5、 一定要记得加入 MySQL 驱动包(mysql-connector-java-5.1.40-bin.jar)该 jar 包放置在 hive
的根路径下的 lib 目录。

6、 安装完成,配置环境变量
vi /etc/profile 添加以下两行内容:
export HIVE_HOME=/home/hadoop/apps/apache-hive-2.3.2-bin
export PATH=PATH:HIVE_HOME/bin

保存退出。
[hadoop@hadoop112 apache-hive-2.3.2-bin] source /etc/profile** 7、 验证 Hive 安装 **[hadoop@hadoop112 ~] hive --help
在这里插入图片描述
8、 初始化元数据库
注意:当使用的 hive 是 2.x 之前的版本,不做初始化也是 OK 的,当 hive 第一次启动的
时候会自动进行初始化,只不过会不会生成足够多的元数据库中的表。在使用过程中会
慢慢生成。但最后进行初始化。如果使用的 2.x 版本的 Hive,那么就必须手动初始化元
数据库
。使用命令:
[hadoop@hadoop112 ~] schematool -dbType mysql -initSchema** ![在这里插入图片描述](https://ad.itadn.com/c/weblog/blog-img/images/2025-03-16/PiAXGmH63Vr1tLdYshF8EkDTRbUM.png) 9、 启动 Hive 客户端 **[hadoop@hadoop112 ~] hive --service cli 或者 hive
10、退出 Hive
hive > quit;
或者
hive> exit;

Hive 使用方式,即三种连接方式

1、CLI
进入到 bin 目录下,直接输入命令:
[hadoop@hadoop112 ~]$ hive
补充:
1、上面的 hive 命令相当于在启动的时候执行:hive --service cli
2、使用 hive --help,可以查看 hive 命令可以启动那些服务
3、通过 hive --service serviceName --help 可以查看某个具体命令的使用方式
2、HiveServer2/beeline

复制代码
    在现在使用的最新的 hive-2.3.2 版本中:都需要对 hadoop 集群做如下改变,否则无法使用
    第一:修改 hadoop 集群的 hdfs-site.xml 配置文件:加入一条配置信息,表示启用 webhdfs
    <property>
     <name>dfs.webhdfs.enabled</name>
     <value>true</value>
    </property>
    第二:修改 hadoop 集群的 core-site.xml 配置文件:加入两条配置信息:表示设置 hadoop
    的代理用户
    <property>
     <name>hadoop.proxyuser.hadoop.hosts</name>
     <value>*</value>
    </property>
    <property>
     <name>hadoop.proxyuser.hadoop.groups</name>
     <value>*</value>
    </property>
    配置解析:
    hadoop.proxyuser.hadoop.hosts 配置成*的意义,表示任意节点使用 hadoop 集群的代理用户
    hadoop 都能访问 hdfs 集群,hadoop.proxyuser.hadoop.groups 表示代理用户的组所属

以上操作做好了之后,请继续做如下两步:
第一步:先启动 hiveserver2 服务
启动方式,(假如是在 hadoop112 上):
启动为前台:hiveserver2
启动为后台:
nohup hiveserver2 1>/home/hadoop/hiveserver.log 2>/home/hadoop/hiveserver.err &
或者:nohup hiveserver2 1>/dev/null 2>/dev/null &
或者:nohup hiveserver2 >/dev/null 2>&1 &

以上 3 个命令是等价的,第一个表示记录日志,第二个和第三个表示不记录日志
命令中的 1 和 2 的意义分别是:
1:表示标准日志输出
2:表示错误日志输出
如果我没有配置日志的输出路径,日志会生成在当前工作目录,默认的日志名称叫做:
nohup.xxx
nohup 命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,
那么可以使用 nohup 命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。
nohup 就是不挂起的意思(no hang up)。
该命令的一般形式为:nohup command &
第二步:然后启动 beeline 客户端去连接:
执行命令:
beeline -u jdbc:hive2://hadoop112:10000 -n hadoop
-u : 指定元数据库的链接信息
-n : 指定用户名和密码

另外还有一种方式也可以去连接:先执行 beeline 然后按图所示输入:!connect jdbc:hive2://hadoop112:10000 按回车,然后输入用户名,这个 用户名就是安装 hadoop 集群的用户名,接下来便可以做 hive 操作
2、Web UI
1、 下载对应版本的 src 包:apache-hive-2.3.2-src.tar.gz
2、 上传,解压
tar -zxvf apache-hive-2.3.2-src.tar.gz
3、 然后进入目录**{HIVE_SRC_HOME}/hwi/web**,执行打包命令: **jar -cvf hive-hwi-2.3.2.war *** 在当前目录会生成一个 h**ive-hwi-2.3.2.war** 4、 **得到 hive-hwi-2.3.2.war 文件,复制到 hive 下的 lib 目录中 cp hive-hwi-2.3.2.war {HIVE_HOME}/lib/**

复制代码
    5、 修改配置文件 hive-site.xml
    <property>
     <name>hive.hwi.listen.host</name>
     <value>0.0.0.0</value>
     <description>监听的地址</description>
    </property>
    <property>
     <name>hive.hwi.listen.port</name>
     <value>9999</value>
     <description>监听的端口号</description>
    </property>
    <property>
     <name>hive.hwi.war.file</name>
     <value>lib/hive-hwi-2.3.2.war</value>
     <description>war 包所在的地址</description>
    </property>

6、 复制所需 jar 包 1、cp {JAVA_HOME}/lib/tools.jar {HIVE_HOME}/lib
2、再寻找三个 jar 包,都放入 {HIVE_HOME}/lib 目录: c**ommons-el-1.0.jar jasper-compiler-5.5.23.jar jasper-runtime-5.5.23.jar** 不然启动 hwi 服务的时候会报错。 7、 安装 ant 1、 上传 ant 包:**apache-ant-1.9.4-bin.tar.gz** 2、 解压 **tar -zxvf apache-ant-1.9.4-bin.tar.gz -C ~/apps/** 3、 配置环境变量 **vi /etc/profile** 在最后增加两行: **export ANT_HOME=/home/hadoop/apps/apache-ant-1.9.4 export PATH= PATH: ANT_HOME/bin** 配置完环境变量别忘记执行:source /etc/profile 4、 验证是否安装成功 **ant -version** 8、 上面的步骤都配置完,基本就大功告成了。进入 {HIVE_HOME}/bin 目录:
$ {HIVE_HOME}/bin/hive --service hwi
或者让在后台运行:
nohup bin/hive --service hwi > /dev/null 2> /dev/null &
9、 前面配置了端口号为 9999,所以这里直接在浏览器中输入:
hadoop112:9999/hwi

Hive 基本使用

复制代码
    1、 创建库:create database if not exists mydb;
    2、 查看库:show databases;
    3、 切换数据库:use mydb;
    4、 创建表:create table if not exists t_user(id string, name string)
    或 create table test(id string, name string) row format delimited fields terminated by ',';
    5、 查看表列表:show tables;
    6、 插入数据:insert into table test values ('1','a'), ('2','b'), ('3','c'); 7、 查询数据:select * from test;
    8、 导入数据:
    a) 导入 HDFS 数据:load data inpath '/user.txt' into table test;
    b) 导入本地数据:load data local inpath '/home/hadoop/user.txt' into table test; user.txt 的数据为:
    4,d
    5,e
    6,d
    9、再次查询数据:select * from test;

小技能补充:
1、 进入到用户的主目录,使用命令 cat /home/hadoop/.hivehistory 可以查看到 hive 执行的
历史命令
2、 执行查询时若想显示表头信息时,请执行命令:
Hive > set hive.cli.print.header=true;
3、 hive的执行日志的存储目录在** {java.io.tmpdir}/{user.name}/hive.log**中,假如使用hadoop
用户操作的 hive,那么日志文件的存储路径为:/temp/hadoop/hive.log

全部评论 (0)

还没有任何评论哟~