1.Hive的概念
Hive 由Facebook 实现并开源, 基于Hadoop 的一个数据仓库工具,可以将结构化的数据映射为一张数据库表,并提供HQL(Hive SQL)查询功能, 底层数据是存储在HDFS 上。 Hive的本质是将 HQL 语句转换为 MapReduce 任务运行,使不熟悉MapReduce 的用户很方便地利用HQL进行数据 ETL(Extraction-Transformation-Loading) 操作。
2.使用Hive的原因
(1)直接使用 MapReduce 所面临的问题:
学习成本太高
项目周期要求太短
MapReduce 实现复杂查询逻辑开发难度太大
(2)为什么要使用 Hive:
更友好的接口: 操作接口采用类 SQL 的语法,提供快速开发的能力
更低的学习成本: 避免了写 MapReduce,减少开发人员的学习成本
更好的扩展性: 可自由扩展集群规模而无需重启服务, 还支持用户自定义函数
3.Hive的特点
优点:
1、 可扩展性,横向扩展,Hive 可以自由的扩展集群的规模, 一般情况下不需要重启服务:
横向扩展: 通过分担压力的方式扩展集群的规模
纵向扩展:一台服务器 cpu i7-6700k 4 核心8 线程,8核心 16 线程,内存64G => 128G;
2、 延展性, Hive 支持自定义函数,用户可以根据自己的需求来实现自己的函数;
3、 良好的容错性,可以保障即使有节点出现问题,SQL 语句仍可完成执行 (这里的容错性是基于hdfs的容错性:单点故障的解决和数据块的冗余存储)。
缺点:
1、 hive不支持记录级别的增删改操作,但是用户可以通过查询生成新表或者将查询结果导入到文件中(当前选择的 hive-1.2.1 的版本支持记录级别的插入操作);
2、 Hive的查询延时很严重,因为 MapReduce Job的启动过程消耗很长时间,所以不能用在交互查询系统中;
3、 hive 对事务支持较弱(因为不没有增删改, 所以主要用来做OLAP(联机分析处理),而不是 OLTP(联机事务处理),这就是数据处理的两大级别)。
4.Hive架构
CLI:command line interface
ODBC:开放数据库连接(Open Database Connectivity,ODBC)
JDBC:java数据库连接(Java DataBase Connectivity,JDBC)
JDBC/ODBC:将hive启动为后台服务,用客户端连接就能使用
hive的元数据库在刚开始创建的时候有29张表,但是随着操作的增多,表也会增多
hive的四大组件:
驱动器 Thrift Server
编译器 Compiler
优化器 Optimizer
执行器 Executor
Hive架构的基本组成
用户接口:
CLI, Shell 终端命令行,最常用(学习,调试,生产),JDBC/ODBC是 Hive 的基于 JDBC 操作提供的客户端, 用户(开发员,运维人员) 通过这连接至 Hive server Web UI,通过浏览器访问 Hive;
元数据存储:元数据,通俗的讲, 就是存储在 Hive 中的数据的描述信息,
Hive 中的元数据通常包括:表的名字,表的列和分区及其属性,表的属性(内部表和外部表),表的数据所在目录,hive的元数据库只会存表所对应的hdfs上的目 录, 不会存该表当中存储了哪些文件。
Metastore 默认存在自带的 Derby 数据库中。缺点就是不适合多用户操作,并且数据存储目录不固定。数据库跟着 Hive 走,极度不方便管理,
例如:hive在哪个目录下面启动的,就会在哪个目录下面生成一个元数据库,如:第一次在/home/hadoop/下面启动的,就会在这个目录下面生成一个元数据库, 第二次在/home/hadoop/hive/目录下面启动的就会在这个目录下面生成一个新的数据库。这样在使用上会带来很多的不便。
解决方案:通常存我们自己创建的 MySQL 库(本地 或 远程)
解释器,编译器,优化器,执行器:
这四大组件完成 HQL 查询语句从词法分析,语法分析,编译,优化,以及生成查询计划的生成。生成的查询计划存储在 HDFS 中,并随后由 MapReduce 调用执行。
执行流程:
HiveQL 通过命令行或者客户端提交,经过 Compiler 编译器,运用 Metastore 中的元数据进行类型检测和语法分析,生成一个逻辑方案(logical plan),然后通过的优化处理,产生一个 MapReduce 任务。
5. Hive 和 RDBMS 的对比
数据库(写时模式)------数据仓库(读时模式)
1、模式问题: 数据库是 写时模式, 数据库仓库 是 读时模式
数据库主要的操作针对 单挑记录的 CRUD
数据库在插入数据的时候会进行各种校验:类型检查,int类型的字段如果插入例如qwer234这种数据,很明显会报错, 不让插入
数据仓库是针对大批量数据的存储和计算, hive根本不管你导入进某张hive表的数据是不是合法,当HQL语句被翻译成MR程序执行的时候,那么就会校验这个数据了。
2、数据库存储的数据量小,存储精细
数据仓库存储的数据量极大,粗粒度的存储机制