Hive详解

Hive是由Facebook实现并开源的数据仓库工具,基于Hadoop,将结构化的数据文件映射为数据库表,通过SQL进行查询。它不支持记录级别的增删改,适合海量离线数据统计分析,不适用于交互查询。Hive与RDBMS相比,更侧重于扩展性和容错性,而非实时查询。Hive与HBase不同,前者是数据仓库工具,后者是面向列的NoSQL数据库,适合实时操作。Hive架构包括元数据、CLI、JDBC/ODBC等组件,数据模型包括database、table、partition和bucket。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Hive 的概念:

 

  1. Hive Facebook 实现并开源
  2. Hive 是基于 Hadoop 的一个数据仓库工具
  3. Hive 存储的数据其实底层存储在 HDFS
  4. Hive HDFS 上的结构化的数据映射为一张数据库表
  5. Hive 提供 HQL(Hive SQL)查询功能
  6. Hive 的本质是将 SQL 语句转换为 MapReduce 任务运行,使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,适用于离线的批量数据计算
  7. Hive 使用户可以极大简化分布式计算程序的编写,而将精力集中于业务逻辑

扩展:Impala:(与Hive类似,但比HIve执行效率高)

数据仓库:(扩展)

数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。 历史数据:记录就是某些软件,某个产品,某个用户等在过去某个时刻的运行状态和使用行为。

Hive 依赖于 HDFS 存储数据,Hive HQL 转换成 MapReduce 执行 ,所以说 Hive 是基于 Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS MapReduce 计算框架,对存储在HDFS中的数据进行分析和管理。

2. Hive 特点

优点:

  1. 可扩展性,横向扩展Hive 可以自由的扩展集群的规模,一般情况下不需要重启服务横向扩展:通过分担压力的方式扩展集群的规模             纵向扩展: 一台服务器 cpu i7-6700k 4核心 8 线程,8核心 16 线程,内存 64G => 128G 
  2. 延展性Hive 支持自定义函数,用户可以根据自己的需求来实现自己的函数
  3. 良好的容错性,可以保障即使有节点出现问题,SQL 语句仍可完成执行

缺点:

  1. Hive 不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询结果导入到文件中(当前选择的 hive-2.3.3 的版本支持记录级别的插入操作)
  2. Hive 的查询延时很严重,因为 MapReduce Job 的启动过程消耗很长时间,所以不能用在交互查询系统中。
  3. Hive 不支持事务(因为没有增删改,所以主要用来做 OLAP(联机分析处理),而不是 OLTP(联机事务处理),这就是数据处理的两大级别)。

3. Hive 和 RDBMS 的对比(红色为不同

 

 

对比项

Hive

RDBMS

查询语言

HQL

SQL

数据存储

HDFS

Raw Device or Local FS

执行器

MapReduce

Executor

数据插入

支持批量导入/单条插入

支持单条或者批量导入

数据操作

覆盖追加

行级更新删除

处理数据规模

执行延迟

分区

支持

支持

索引

0.8 版本之后加入简单索引

支持复杂的索引

扩展性

高(好)

有限(差)

数据加载模式

读时模式(快)

写时模式(慢)

应用场景

海量数据查询

实时查询

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

4. Hive 和 HBase 的差别

 

  1. Hive 是建立在 Hadoop 之上为了降低 MapReduce 编程复杂度的 ETL 工具。  HBase 是为了弥补 Hadoop 对实时操作的缺陷。
  2. Hive 表是纯逻辑表,因为 Hive 的本身并不能做数据存储和计算,而是完全依赖 Hadoop 。 HBase 是物理表,提供了一张超大的内存 Hash 表来存储索引,方便查询。
  3. Hive 是数据仓库工具,需要全表扫描,就用 Hive,因为 Hive 是文件存储   HBase 是数据库,需要索引访问,则用 HBase,因为 HBase 是面向列的 NoSQL 数据库。
  4. Hive 表中存入数据(文件)时不做校验,属于读模式存储系统  HBase 表插入数据时,会和 RDBMS 一样做 Schema 校验,所以属于写模式存储系统。
  5. Hive 不支持单行记录操作,数据处理依靠 MapReduce,操作延时高   HBase 支持单行记录的 CRUD,并且是实时处理,效率比 Hive 高得多。

5.Hive 架构

                       

元数据,通俗的讲,就是存储在 Hive 中的数据的描述信息。

Hive 中的元数据通常包括:表的名字,表的列和分区及其属性,表的属性(内部表和外部表),表的数据所在目录。

CLI,Shell 终端命令行(Command Line Interface),采用交互形式使用 Hive 命令行与 Hive 进行交互,最常用(学习,调试,生产) 。

JDBC/ODBC,是 Hive 的基于 JDBC 操作提供的客户端,用户(开发员,运维人员)通过这连接至 Hive server 服务 。

Web UI,通过浏览器访问 Hive。

6. Hive 中包含以下数据模型:

database:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹 table:在 HDFS 中表现所属 database 目录下一个文件夹

external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径 partition:在 HDFS 中表现为 table 目录下的子目录

bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散列之后的多个文件

view:与传统数据库类似,只读,基于基本表创建

hive中的某个表的数据存储目录示例:

hdfs://hadoop02:9000/    数据仓库根目录/      数据库目录/  表目录/  分区目录/       数据文件
hdfs://hadoop02::9000/  user/hive/warehouse   myhive.db   table  province=hunan  stu.txt

 Hive 中的表分为内部表、外部表、分区表和 Bucket(分桶) 表:

内部表和外部表的区别:  
    删除内部表,删除表元数据和数据 
    删除外部表,删除元数据,不删除数据 
    内部表和外部表的使用选择:  大多数情况,他们的区别不明显,如果数据的所有处理都在 Hive 中进行,那么倾向于选择内部表,但是如果 Hive 和其他工具要针对相同的数据集进行处理,外部表更合适。  使用外部表访问存储在 HDFS 上的初始数据,然后通过 Hive 转换数据并存到内部表中  使用外部表的场景是针对一个数据集有多个不同的 Schema, 通过外部表和内部表的区别和使用选择的对比可以看出来,hive 其实仅仅只是对存储在 HDFS 上的数据提供了一种新的抽象。而不是管理存储在 HDFS 上的数据。所以不管创建内部表还是外部表,都可以对 hive 表的数据存储目录中的数据进行增删操作。 
 
分区表和分桶表的区别: 
    Hive 数据表可以根据某些字段进行分区操作,细化数据管理,可以让部分查询更快。同时表和分区也可以进一步被划分为 Buckets,分桶表的原理和 MapReduce 编程中的HashPartitioner 的原理类似,分区和分桶都是细化数据管理,但是分区表是手动添加区分,由于 Hive 是读模式,所以对添加分区的数据不做模式校验,分桶表中的数据是按照某些分桶字段进行 hash 散列形成的多个文件,所以数据的准确性也高很多 。

 

7. 安装Hive

  1. 准备好 MySQL(请参考以下文档,或者自行安装 MySQL,或者一个可用的 MySQL)
  2. 上传安装包 apache-hive-2.3.3-bin.tar.gz
  3. 解压安装包 tar  -zxvf  apache-hive-2.3.3-bin.tar.gz  -c  ~/apps/
  4. 修改配置文件

[hadoop@hadoop02 conf]# touch  hive-site.xml

[hadoop@hadoop02 conf]# vi  hive-site.xml

<configuration> 
<property> 
<name>javax.jdo.option.ConnectionURL</name> 
<value>jdbc:mysql://hadoop02: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> 
 //mysql用户名
<property> 
<name>javax.jdo.option.ConnectionUserName</name> 
<value>root</value> 
<description>username to use against metastore database</description> </property> 
 //MySQL密码
<property> 
<name>javax.jdo.option.ConnectionPassword</name> 
<value>root</value> 
<description>password to use against metastore database</description> 
</property> 
<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 ~/.bashrc(或.bash_profile)  添加以下两行内容:

export HIVE_HOME=/home/hadoop/apps/apache-hive-2.3.3-bin

export PATH=$PATH:$HIVE_HOME/bin 保存退出。

最后不要忘记:[hadoop@hadoop02 bin]$ source  ~/.bashrc

7. 初始化元数据库:

[hadoop@hadoop02 bin]$ schematool  -dbType  mysql  -initSchema

8. 启动 Hive 客户端

[hadoop@hadoop02 bin]$ hive

8. Hive 使用方式

采用  HiveServer2/beeline  模式:

第一:修改 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> 

第一步:先启动 hiveserver2 服务

第二步:然后启动 beeline 客户端去连接:

接着输入      !connect jdbc:hive2://hadoop02:10000    命令。然后输入用户名,这个用户名就是安装 hadoop 集群的用户名 。

9. 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 t_user(id string, name string) row format delimited fields terminated by ',';
  5. 查看表列表:show tables;
  6. 查看表的详细信息:desc formatted t_user;
  7. 插入数据:insert into table t_user values ('1','huangbo'), ('2','xuzheng'), ('3','wangbaoqiang');
  8. 查询数据:select * from t_user;
  9. 导入数据:
    1. 导入 HDFS 数据:load data inpath '/user.txt' into table t_user;
    2. 导入本地数据:load data local inpath '/home/hadoop/user.txt' into table t_user;
  10. 执行查询时若想显示表头信息时,请执行命令: Hive> set hive.cli.print.header=true;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值