简单了解Hive
使用hive的原因是解决使用mapreduce的三个问题MapReduce 开发难度大,学习成本高(wordCount => Hello World)Hdfs文件没有字段名、没有数据类型,不方便进行数据的有效管理使用MapReduce框架开发,项目周期长,成本高Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表(类似于RDBMS中的表),并提供类SQL查询功能;Hiv
介绍
使用hive的原因是解决使用mapreduce的三个问题
MapReduce 开发难度大,学习成本高(wordCount => Hello World)
Hdfs文件没有字段名、没有数据类型,不方便进行数据的有效管理
使用MapReduce框架开发,项目周期长,成本高
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表(类似于RDBMS中的表),并提供类SQL查询功能;
Hive是由Facebook开源,用于解决海量结构化日志的数据统计;
本质是将 SQL 转换为 MapReduce 的任务进行运算,底层由HDFS来提供数据存储,将Hive理解为将 SQL 转换为 MapReduce 任务的工具。
Hive和RDBMS的对比
由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将Hive 理解为数据库。其实从结构上来看,Hive 和传统的关系数据库除了拥有类似的查询语言,再无类似之处。
从七个方面进行对比
-
查询语言
HQL <=> SQL 高度相似
由于SQL被广泛的应用在数据仓库中,因此,专门针对Hive的特性设计了类SQL的查询语言HQL。熟悉SQL开发的开发者可以很方便的使用Hive进行开发。 -
数据规模
Hive存储海量数据;RDBMS只能处理有限的数据集;
由于Hive建立在集群上并可以利用MapReduce进行并行计算,因此可以支持很大规模的数据;而RDBMS可以支持的数据规模较小。 -
执行引擎
Hive的引擎是MR/Tez/Spark/Flink;RDBMS使用自己的执行引擎。
Hive中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的。而RDBMS通常有自己的执行引擎。 -
数据存储
Hive保存在HDFS上;RDBMS保存在本地文件系统 或 裸设备。 -
执行速度
Hive相对慢(MR/数据量);RDBMS相对快;
Hive存储的数据量大,在查询数据的时候,通常没有索引,需要扫描整个表;加之Hive使用MapReduce作为执行引擎,这些因素都会导致较高的延迟。
而RDBMS对数据的访问通常是基于索引的,执行延迟较低。当然这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出并行的优势。 -
可扩展性
Hive支持水平扩展;通常RDBMS支持垂直扩展,对水平扩展不友好。
Hive建立在Hadoop之上,其可扩展性与Hadoop的可扩展性是一致的(Hadoop集群规模可以轻松超过1000个节点)。而RDBMS由于 ACID 语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有100台左右。 -
数据更新
Hive对数据更新不友好;RDBMS支持频繁、快速数据更新。
Hive是针对数据仓库应用设计的,数据仓库的内容是读多写少的。因此,Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的。
而RDBMS中的数据需要频繁、快速的进行更新。
总结
Hive的优缺点
优点
-
学习成本低
Hive提供了类似SQL的查询语言,开发人员能快速上手; -
处理海量数据
底层执行的是MapReduce 任务; -
系统可以水平扩展
底层基于Hadoop; -
功能可以扩展
Hive允许用户自定义函数; -
良好的容错性
某个节点发生故障,HQL仍然可以正常完成; -
统一的元数据管理
元数据包括:有哪些表、表有什么字段、字段是什么类型;
缺点
- HQL表达能力有限
- 迭代计算无法表达
- Hive的执行效率不高(基于MR的执行引擎)
- Hive自动生成的MapReduce作业,某些情况下不够智能
- Hive调优困难
架构
基本组成
-
用户接口
主要由三个:CLI、JDBC/Beeline和WebGUI。其中,CLI为shell命令行;JDBC/ODBC是Hive的JAVA实现,与传统数据库JDBC类似;WebGUI是通过浏览器访问Hive。 -
元数据存储
Hive 将元数据存储在数据库中(MySql或者Derby)。
Hive中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。表的数据所在目录Metastore默认存在自带的 Derby 数据库中。
缺点就是不适合多用户操作,并且数据存储目录不固定。数据库跟着 Hive 走,极度不方便管理。
解决方案:通常存我们自己创建的 MySQL 库( 本地 或 远程)Hive 和 MySQL 之间通过 MetaStore 服务交互。 -
Thrift Server
Thrift 是 Facebook 开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,Hive 集成了该服务,能让不同的编程语言调用 Hive 的接口。 -
Driver
编译器 (Compiler) ,优化器 (Optimizer),执行器 (Executor );
Driver 组件完成 HQL 查询语句从词法分析,语法分析,编译,优化,以及生成逻辑执行计划的生成。生成的逻辑执行计划存储在 HDFS 中,并随后由 MapReduce 调用执行。
Hive 的核心是驱动引擎, 驱动引擎由四部分组成:
(1) 解释器:解释器的作用是将 HiveSQL 语句转换为抽象语法树(AST);
(2) 编译器:编译器是将语法树编译为逻辑执行计划;
(3) 优化器:优化器是对逻辑执行计划进行优化;
(4) 执行器:执行器是调用底层的运行框架执行逻辑执行计划,对于 Hive 来说,就是 MR/Spark/Tez。
工作原理
流程大致步骤为:
1.用户提交查询等任务给Driver。
2.编译器获得该用户的任务Plan。
3.编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。
4.编译器Compiler得到元数据信息,对任务进行编译;
1)词法分析/语法分析:使用antlr将SQL语句解析成抽象语法树-AST;
2)语义分析:从Megastore获取模式信息,验证SQL语句中队表名,列名,以及数据类型的检查和隐式转换,以及Hive提供的函数和用户自定义的函数(UDF/UAF);
3)逻辑计划生产:生成逻辑计划-算子树;
4)逻辑计划优化:对算子树进行优化,包括列剪枝,分区剪枝,谓词下推等;
5)物理计划生成:将逻辑计划转化为由MapReduce任务组成的DAG的物理计划;
6)选择最佳的策略;
5.将最终的计划提交给Driver。
6.Driver将计划Plan转交给ExecutionEngine去执行,获取元数据信息,提交给JobTracker或者SourceManager执行该任务,任务会直接读取HDFS中文件进行相应的操作。
7.获取执行的结果。
8.取得并返回执行结果。
创建表时:
解析用户提交的Hive语句–>对其进行解析–>分解为表、字段、分区等Hive对象。根据解析到的信息构建对应的表、字段、分区等对象,从SEQUENCE_TABLE中获取构建对象的最新的ID,与构建对象信息(名称、类型等等)一同通过DAO方法写入元数据库的表中,成功后将SEQUENCE_TABLE中对应的最新ID+5;
实际上常见的RDBMS都是通过这种方法进行组织的,其系统表中和Hive元数据一样显示了这些ID信息。通过这些元数据可以很容易的读取到数据。
参考
1.Hive基本原理详解
2.Hive的原理架构一
更多推荐
所有评论(0)