Hive是一个基于Hadoop的数据仓库工具,可以对存储在Hadoop文件中的数据集进行数据整理,特殊查询和分析处理。
Hive提供了类似关系数据库SQL的查询语言:HiveQL
当采用MapReduce作为执行引擎是,Hive可以通过HiveQL语句快速实现简单的MapReduce作业,Hive自身可以将HiveQL语句快速转换成MapReduce作业进行运行,而不必开发专门的MapReduce作业
数据仓库的体系结构:
- 数据源
- 数据存储和管理
- 数据服务
- 数据应用
传统数据仓库面临的挑战
- 无法满足快速增长的海量数据存储需求
- 无法有效处理不同类型的数据
- 计算和处理能力不足
Hive的应用场景
- 维护海量数据
- 对数据进行挖掘
- 形成意见和报告
- 报表分析
- 日志分析等
Hive与HBase的区别
-
Hive是一个基于Hadoop的数据仓库工具,可以对存储在Hadoop文件中的数据集进行数据整理,特殊查询和分析处理。Hive中的表为纯逻辑表,其本身并不存储和处理数据,仅仅对表的元数据进行定义。Hive没有物理存储的功能,它完全依赖HDFS来存储数据,依赖MapReduce(或Tez、Spark)来处理数据。
HBase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。HBase中存储的表是物理表,支持列扩展,可以对单元格修改,采取K-V设计,查询效率高等特点,适合存放非结构化的数据。
两者均以HDFS为文件存储,均属于Hadoop生态圈
-
Hive是Hadoop数据仓库不是数据库
HBase是基于Hadoop的一种NoSQL数据库
-
Hive只能处理静态数据
HBase能够实时查询,常用于在线业务
-
Hive没有row-level的更新,它适用于大量append-only数据集(如日志)的批任务处理。而基于HBase的查询,支持和row-level的更新。
Hive与HBase的关系:
Hive和HBase是协作关系,根据不同的应用场景使用Hive和HBase发挥不同的作用。
Hive的执行机制:
- 有Hive驱动模块中的编译器(Antlr语法识别工具)对用户输入的SQL进行词法和语法解析,将SQL语句转化为抽象语法树(Abstract Syntax)的形式
- 对该抽象语法树进行遍历,进一步转化成查询块(QueryBlock)。因为抽象语法树的结构仍很复杂,不方便直接翻译为 MapReduce算法程序,所以,Hive把抽象语法树进一步转化为查询块。查询块是一个最基本的SQL 语法组成单元,包括输入源、计算过程和输出3个部分
- 再对查询块进行遍历,生成操作树(OperatorTree)。其中,操作树由很多逻辑操作符组成,如 TableScanOperator、SelectOperator、FilterOperator、JoinOperato、GroupByOperator和ReduceSinkOperator等。这些逻辑操作符可以在 Map阶段和Reduce阶段完成某一特定操作
- 通过Hive驱动模块中的逻辑优化器对操作树进行优化,变换操作树的形式,合并多余的操作符,从而减少MapReduce 作业数量以及 Shuffle阶段的数据量。
- 对优化后的操作树进行遍历,根据操作树中的操作逻辑操作符生成需要执行的MapReduce作业
- 启动Hive驱动模块中的物理优化器,对生成的 MapReduce作业进行优化,生成最终的MapReduce作业执行计划。
- 最后由Hive驱动模块中的执行器,对最终的MapReduce作业进行执行输出。
Hive包括哪些数据组织:
-
库:管理数据,不同模块的数据最好放在不同的数据库中,同mysql中的数据库的概念。
-
表:
按管理权限分
- 内部表:管理表,表的创建和数据的删除,都是由hive自己决定的,同mysql中的表,内部表在进行删除的时候,元数据和原始数据都会被删除。
- 外部表:external_table和内部表对立面,一个表不可能同时是内部表又是外部表的,表结构上同内部表,数据自己决定不了,外部表在进行删除的时候 只能删除元数据(描述信息),表的原始数据(hdfs)不会被删除。
按功能分
- 分区表:这里的分区的概念不同于MR中的分区的概念,hive中有可能一个表非常大,查询的时候会进行全表扫描,极大的降低hive表的查询性能,这时候就出现了分区表,将原来的一个大的表存储的时候分成不同的数据目录进行存储。
- 分桶表:类似于mapreduce中的分区的概念,同一个表的数据,存储在同一个目录下不同的文件中。
-
视图:hive中的视图,只有逻辑视图(存储的仅仅是一个sql语句,不会进行执行的)没有物化视图(将视图代表的sql进行执行结果),查询视图的时候才会进行执行,hive中的视图类似于sql语句的快捷方式,保存的是当前的视图代表的sql语句。
相关参考资料:
https://www.zhihu.com/question/21677041
https://blog.csdn.net/py_123456/article/details/80292267
https://blog.csdn.net/qq_37334135/article/details/78295427
https://www.cnblogs.com/beipiaodiaosi/p/11099557.html