Hive基本概念和架构介绍

Hive

Hive是一个构建在Hadoop上的数据分析工具,它没有存储数据的能力,只有使用数据的能力,底层是由HDFS来提供数据存储,可以将结构化的数据文件映射成一张数据库表,并能够提供类似SQL的查询功能。
可以将它简单理解为一个将Hive SQL转换成MapReduce程序的工具,甚至可以说Hive就是一个MapReduce的客户端。
使用Hive时,可以使用SQL语句进行交互,仅与MYSQL之类的数据库有少量的差别。
它的元数据也正好可以存储在MYSQL数据库中;而它的数据则是存储在HDFS中。
那么可能有人要问了,元数据是什么呢,它跟数据有什么差别?
元数据正是数据的数据,对数据及信息资源的描述性信息 大部分属性字段就是元数据;元数据显示有关数据的基本信息,可以更轻松地查找和处理特定数据实例。
Hive分析数据的底层实现,是MapReduce,但是也同样可以切换成Spark之类快速的引擎。

Hive与数据库之之间的区别

  1. 首先、在查询语言方面
    由于 SQL 被广泛的应用在数据仓库中,因此,专门针对 Hive 的特性设计了类 SQL 的查询语言 HQL。熟悉SQL 开发的开发者可以很方便的使用 Hive 进行开发。

  2. 数据存储方面
    Hive 是建立在 Hadoop 之上的,所有 Hive 的数据都是存储在 HDFS 中。而数据库则可以将数据保存在块设备或者本地文件系统中。

  3. 数据更新
    由于 Hive 是针对数据仓库应用设计的,而数据仓库的内容是读多写少。因此,Hive 中不支持对数据的修改和添加,所有的数据都是在加载时确定好的。而数据库中的数据通常是需要经常进行修改的,因此可以使用 INSERT INTO … VALUES 添加数据,使用 UPDATE … SET 修改数据。

  4. 执行方式:
    Hive 中大多数查询的执行是通过 Hadoop 提供的 MapReduce 来实现的。而数据库通常有自己的执行引擎。

  5. 执行延迟:
    Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高。另外一个导致 Hive 执行延迟高的因素是 MapReduce 框架。由于 MapReduce 本身具有较高的延迟,因此在利用 MapReduce 执行 Hive 查询时,也会有较高的延迟。相对的,数据库的执行延迟较低。当然,这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势。

  6. 可扩展性
    由于 Hive 是建立在 Hadoop 之上的,因此 Hive 的可扩展性和 Hadoop 的可扩展性是一致的(世界上最大的Hadoop 集群在 Yahoo!,2009 年的规模在 4000 台节点左右)。而数据库由于 ACID 语义的严格限制,扩展行非常有限。目前最先进的并行数据库 Oracle 在理论上的扩展能力也只有 100 台左右。

  7. 数据规模
    由于 Hive 建立在集群上并可以利用 MapReduce 进行并行计算,因此可以支持很大规模的数据。而数据库支持的数据规模相对较小。

  8. 索引
    Hive 在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些Key 建立索引。Hive 要访问数据中满足条件的特定值时,需要暴力扫描整个数据,因此访问延迟较高。由于底层实现是 MapReduce 的原因, Hive 可以并行访问数据,因此即使没有索引,对于大数据量的访问,Hive 仍然可以体现出优势。数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据访问,数据库可以有很高的效率,较低的延迟。由于数据的访问延迟较高,决定了 Hive 不适合在线数据查询。
      值得一提的是,Hive 在 0.8 版本后加入了位图索引。Hive 索引原理为:在指定列上建立索引,生成一张索引表(Hive的一张物理表),记录以下三个字段:索引列的值、该值对应的 HDFS 文件路径、该值在文件中的偏移量。
    在执行索引字段查询时候,首先额外生成一个 MapReduce Job,根据对索引列的过滤条件,从索引表中过滤出索引列的值对应的 HDFS 文件路径及偏移量,输出到 HDFS 上的一个文件中,然后根据这些文件中的 HDFS 路径和偏移量,筛选原始 Input 文件,生成新的 Split 作为整个 Job 的 Split,达到不用全表扫描的目的。
      不过位图索引在3.0.0版本后移除了
      有了更适合Hive的物化视图

  9. 事务
    Hive 在 0.14 版本后开始支持事务,前提是文件格式必须为 orc 格式,同时必须分桶,还必须显式声明transactional=true。

那么有了Hadoop,为什么要使用Hive呢?

  1. 使用Hadoop学习成本较高,需要学习JAVA或者Python
  2. MapReduce实现复杂的查询逻辑时,开发难度相对较大
  3. 约束 Key 和 Value 的类型,自定义排序规则、自定义分区器等等
  4. 操作接口采用类似 SQL 的语法,提供快速开发的能力
  5. 免去了写 MapReduce 的过程,减少开发人员的学习成本
  6. 功能扩展方便

Hive的优点众多

  1. 操作接口采用类似 SQL 的语法,提供快速开发的能力(简单、容易上手)。
  2. 免去了写 MapReduce 的过程,减少开发人员的学习成本。
  3. Hive 的执行延迟比较高,因此 Hive 常用于离线数据分析,对实时性要求不高的场合。
  4. Hive 优势在于处理大数据,对于处理小数据没有优势,因为 Hive 的执行延迟比较高。
  5. Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
  6. 集群可自由拓展并且具有良好的容错性,节点出现问题 SQL 仍可完成执行。

但缺点同样存在

  1. Hive 的 HQL 表达能力有限,当逻辑需求特别复杂的时候,还是要借助 MapReduce
  • 迭代式算法无法表达
  • 数据挖掘方面不擅长
  1. Hive 操作默认基于 MapReduce 引擎,而 MapReduce 引擎与其它的引擎(如 Spark 引擎)相比,特点就是慢、延迟高、不适合交互式查询,所以 Hive 也有这个缺点(这里讲的是默认引擎,Hive 是可以更改成其他引擎的)
  2. Hive 自动生成的 MapReduce 作业,通常情况下不够智能化。
  3. Hive 调优比较困难,粒度较粗。

Hive的架构

首先从访问Hive的客户端来说

有三种方向

  1. 使用CLI
    这一般指的是Hive Shell的直连和Belline CLI的连接,这两者之间推荐使用Belline,因为它是通过HiveServer2来进行连接的,相较起直连来说,要更加的安全一些。
  2. JDBC/ODBC
    访问中间件 Thrift 软件框架,跨语言服务开发。DDL DQL DML,整体仿写一套 SQL 语句
  3. WEBUI
    访问器访问

元数据

元数据,数据的数据。元数据包括表名、表结构信息、表所属的数据库(默认是 default 库)、表的拥有者(权限信息)、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等。

元数据的存放一般需要借助于其他的数据载体(Derby 或 MySQL),默认存放在自带的 Derby 数据库(单用户局限性)中,推荐使用 MySQL 进行存储。连接数据库需要提供:uri、username、password、driver。

Hive 默认将元数据存储在 Derby 数据库中,但其仅支持单线程操作,若有一个用户在操作,其他用户则无法使用,造成效率不高;而且当在切换目录后,重新进入 Hive 会找不到原来已经创建的数据库和表,因此一般使用 MySQL 数据库存储元数据。
作用:
客户端连接 MetaStroe 服务,MetaStroe 服务再去连接 MySQL 数据库来存取元数据

有了MetaStroe 服务,就可以有多个客户端同时连接,而且这些客户端不需要知道 MySQL 数据库的用户名和密码,只需要连接MetaStroe 服务即可。

提高数据的安全性,避免被人直接顺着连接获取MySQL内的数据

Driver驱动,也就是将SQL转换为MR任务的关键步骤

  1. Parser:将 HQL 语句解析成抽象语法树(AST:Abstract Syntax Tree);
  2. Semantic Analyzer:将抽象语法树编译成查询块;
  3. Logic Plan Generator:将查询块转换成逻辑查询计划;
  4. Logic Optimizer:重写逻辑查询计划,优化逻辑执行计划(RBO);
  5. Physical Plan Gernerator:将逻辑计划转化成物理计划(MapReduce Jobs);
  6. Physical Optimizer:选择最佳的 Join 策略,优化物理执行计划(CBO)。
  7. Execution:最后根据优化后的物理执行计划生成底层代码,进行执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值