Hive(一)基本概念

1. 什么是Hive

  1. 历史
    Hive:由Facebook开源,后捐给了Apache,用于解决海量结构化日志的数据统计.
  2. 定义
    Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类似于SQL的查询功能.
  3. 本质
    Hive的本质是将HQL转化成MapReduce程序.
    (1)Hive处理的数据存储在HDFS上.
    (2)Hive分析数据的底层实现是MapReduce.
    (3)执行程序运行在Yarn上

2. Hive的优缺点

2.1 优点

  1. 操作接口采用类似SQL的语法,提供了快速的开发能力.(在MapReduce框架中至少要有3个类的操作可以用一条简单的HQL语句类解决)
  2. 减少了学习成本.(对很多并不是从事Java开发的人员来说,写类似SQL的HQL远远比写生僻的HQL要来的快)
  3. 因为底层实现是MapReduce,所以很适合处理大数据.
  4. Hive支持自定义函数,开发人员可以根据自身的业务需求来自定义函数

2.2 缺点

  1. Hive的HQL表达能力有限
    (1)迭代式算法无法表达
    (2)数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法无法实现.
  2. Hive的效率比较低
    (1)Hive自动生成的MapReduce作业通常情况下不够智能,有待根据业务进行进一步优化.
    (2)Hive调优比较困难,粒度较粗.(Hadoop数据的存储,压缩,Map和Reduce阶段,HQL的调优等等诸多方面)

3. Hive架构原理

首先声明,此图是在网上找到的,由于书籍以及网络上大多都是基于老版本的千篇一律的描述,这里特意找到了一张Hadoop2.x的图,至于图中描述是否准确,不做讨论,毕竟个人还没有理解到那么全面,写这篇日志只是学习时的笔记以及备忘作用.
在这里插入图片描述
(1)用户接口:Client
CLI(Command Line Interface)、JDBC/ODBC(jdbc访问Hive),WebGUI(浏览器访问),和一个Thrift Server.
(2)元数据:Metastore
元数据包括:表名,表所属的数据库(默认是default),表的拥有者,列/分区字段,表的类型(是否是外部表),表的数据所在目录等.
默认存储在自带的derby数据库中,但是有个缺点是,derby不支持多用户访问,同时只能与一个用户保持回话关系,所以推荐使用MySQL存储Metastore.
(3)Hadoop
Hive使用HDFS进行存储,使用MapReduce进行计算.
(4)驱动器:Driver

  1. 编译器(Compiler):将HQL字符串转换成抽象语法树AST,这一步一般都是借由第三方工具库来完成,比如antlr;然后对AST进行语法分析,比如表是否存在,字段是否存在,SQL语义是否错误.再借由内部的各种计划,将最终编辑成MapReduce任务.
  2. 优化器(Optimizer):分为逻辑优化器和物理优化器,将HiveQL生成的执行计划和MapReduce进行优化.
  3. 执行器(Executor):按照任务的依赖关系执行MapReduce任务.

4. 与数据库的比较

由于Hive使用了类似于SQL的HQL,所以很容易被误解成数据库.但是Hive并不是数据库而是为了数据仓库而设计的工具.
(1)查询语言
由于SQL应用程度的广泛,因此Hive专门针对Hive的特性设计了类SQL的查询语言HQL,使得熟悉SQL的开发人员可以快速的掌握Hive.
(2)数据存储位置
Hive是基于Hadoop的,其数据存储于HDFS之上.而数据库则可以将数据保存在本地文件系统中.
(3)数据更新
Hive是针对数据仓库的,而数据仓库是读多写少的.因此Hive中不建议对数据的改写,所有的数据都是在加载的时候确定好的.而数据库中的数据是需要经常进行修改的.
(4)执行
Hive在查询时,由于没有索引,需要扫描整个表,因此延迟较高.
另一个导致Hive高延迟的原因是,Hive的底层执行的是MapReduce任务.
即使极少量的数据,在Hive中的执行速度也会明显慢于SQL.因此Hive适合执行那些数据规模比较大的查询任务,这时,Hive的并行机制的优势就会得到体现.
(5)集群规模可扩展性
由于Hive是建立在Hadoop之上的,因此Hive的可扩展性和Hadoop是一致的.(世界上最大的Hadoop集群在Yahoo!,2019年的规模在4000台节点左右)而数据库由于ACID语义的严格限制,扩展非常有限.目前最先进的数据库Oracle,在理论上的扩展能力也只有100台左右的节点.
(6)数据规模
由于Hive的数据存储在HDFS之上,所以数据规模可以非常的庞大,而相较而言,数据库的数据规模显得小很多很多.

发布了62 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Leonardy/article/details/104063447