1. Hive 的概念:
- Hive 由 Facebook 实现并开源
- Hive 是基于 Hadoop 的一个数据仓库工具
- Hive 存储的数据其实底层存储在 HDFS 上
- Hive 将 HDFS 上的结构化的数据映射为一张数据库表
- Hive 提供 HQL(Hive SQL)查询功能
- Hive 的本质是将 SQL 语句转换为 MapReduce 任务运行,使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,适用于离线的批量数据计算
- 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 特点
优点:
- 可扩展性,横向扩展,Hive 可以自由的扩展集群的规模,一般情况下不需要重启服务横向扩展:通过分担压力的方式扩展集群的规模 纵向扩展: 一台服务器 cpu i7-6700k 4核心 8 线程,8核心 16 线程,内存 64G => 128G
- 延展性,Hive 支持自定义函数,用户可以根据自己的需求来实现自己的函数
- 良好的容错性,可以保障即使有节点出现问题,SQL 语句仍可完成执行
缺点:
- Hive 不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询结果导入到文件中(当前选择的 hive-2.3.3 的版本支持记录级别的插入操作)
- Hive 的查询延时很严重,因为 MapReduce Job 的启动过程消耗很长时间,所以不能用在交互查询系统中。
- Hive 不支持事务(因为没有增删改,所以主要用来做 OLAP(联机分析处理),而不是 OLTP(联机事务处理),这就是数据处理的两大级别)。
3. Hive 和 RDBMS 的对比(红色为不同)
对比项
Hive
RDBMS
查询语言
HQL
SQL
数据存储
HDFS
Raw Device or Local FS
执行器
MapReduce
Executor
数据插入
支持批量导入/单条插入
支持单条或者批量导入
数据操作
覆盖追加
行级更新删除
处理数据规模
大
小
执行延迟
高
低
分区
支持
支持
索引
0.8 版本之后加入简单索引
支持复杂的索引
扩展性
高(好)
有限(差)
数据加载模式
读时模式(快)
写时模式(慢)
应用场景
海量数据查询
实时查询
Hive 只适合用来做海量离线数据统计分析,也就是数据仓库。
4. Hive 和 HBase 的差别
- Hive 是建立在 Hadoop 之上为了降低 MapReduce 编程复杂度的 ETL 工具。 HBase 是为了弥补 Hadoop 对实时操作的缺陷。
- Hive 表是纯逻辑表,因为 Hive 的本身并不能做数据存储和计算,而是完全依赖 Hadoop 。 HBase 是物理表,提供了一张超大的内存 Hash 表来存储索引,方便查询。
- Hive 是数据仓库工具,需要全表扫描,就用 Hive,因为 Hive 是文件存储 。 HBase 是数据库,需要索引访问,则用 HBase,因为 HBase 是面向列的 NoSQL 数据库。
- Hive 表中存入数据(文件)时不做校验,属于读模式存储系统 。 HBase 表插入数据时,会和 RDBMS 一样做 Schema 校验,所以属于写模式存储系统。
- 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
- 准备好 MySQL(请参考以下文档,或者自行安装 MySQL,或者一个可用的 MySQL)
- 上传安装包 apache-hive-2.3.3-bin.tar.gz
- 解压安装包 tar -zxvf apache-hive-2.3.3-bin.tar.gz -c ~/apps/
- 修改配置文件
[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 基本使用
- 创建库:create database if not exists mydb;
- 查看库:show databases;
- 切换数据库:use mydb;
- 创建表: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 ',';
- 查看表列表:show tables;
- 查看表的详细信息:desc formatted t_user;
- 插入数据:insert into table t_user values ('1','huangbo'), ('2','xuzheng'), ('3','wangbaoqiang');
- 查询数据:select * from t_user;
- 导入数据:
- 导入 HDFS 数据:load data inpath '/user.txt' into table t_user;
- 导入本地数据:load data local inpath '/home/hadoop/user.txt' into table t_user;
- 执行查询时若想显示表头信息时,请执行命令: Hive> set hive.cli.print.header=true;