介绍

使用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的原理架构一

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐