hive

1.1 hive简介

1.1.1 什么是hive?

hive是一个构建在Hadoop上的数据仓库工具(框架),可以将结构化的数据文件映射成一张数据表,并可以使用类似sql的方式来对这样的数据文件进行读、写以及管理(包括元数据)。Hive SQL 简称HQL。hive的执行引擎可以是MR、Spark、tez。

如果执行引擎是MapReduce的话,hive会将Hql翻译成MR进行数据的计算。 用户可以使用命令行工具或JDBC驱动程序来连接到hive。

1.1.2 为什么使用hive

因为直接使用Map Reduce,需要面临一下问题:

  • 人员学习成本高
  • 项目周期要求太短
  • Map Reduce实现复杂查询逻辑开发难度大

1.1.3 hive的优缺点

1.1.3.1 hive的优点

  1. 学习成本低
  2. 可扩展性好
  3. 适合做离线分析处理(OLAP)
  4. 延展性好
  5. 良好的容错性
  6. 统计管理

1.1.3.2 hive的缺点

  1. hive的HQL表达能力有限
  2. hive的效率比价低

1.2 hive架构和原理

1.2.1 hive的架构

  1. 用户连接接口
    CLI:是指Shell命令行
    JDBC/ODBC:是指hive的Java实现,与传统数据库JDBC类似。
    WebUI:是指可通过浏览器访问hive。
  2. thriftserver

hive的可选组件,此组件是一个软件框架服务,允许客户端使用包括Java、c++、Ruby和其他多种语言,通过编程的方式远程访问hive。

  1. 元数据

hive将元数据存储在数据库中,如MySQL、derby。hive中的元数据包括(表名、表所属的数据库名、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等)

  1. 驱动器(Driver)
  • 解析器(SQLParser):

将HQL字符串转换成抽象的语法树AST,这一步一般都用第三方工具库完成,比如antlr:对AST进行语法分析,比如表是否存在、SQL语义是否有误。

  • 编译器(Compiler):

对HQL语句进行词法、语法、语义的编译(需要跟元数据关联),编译完成后会生成一个执行计划。hive上就是编译成mapreduce的job。

  • 优化器(Optimizer):

将执行计划进行优化,减少不必要的列、使用分区、使用索引等。优化job。

  • 执行器(Executer):

将优化后的执行计划提交给Hadoop的yarn上执行。提交job。

  1. hadoop

Jobtracker是hadoop1.x中的组件,它的功能相当于:Resourcemanager+AppMaster

TaskTracker相当于Nodemanager + yarnchild

Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成

注意:

  • 包含*的全表查询,比如select * from table 不会生成MapRedcue任务
  • 包含*的limit查询,比如select * from table limit 3 不会生成MapRedcue任务

1.2.2 hive的工作原理

  1. 用户提交查询等任务给Driver。
  2. 驱动程序将Hql发送编译器,检查语法和生成查询计划。
  3. 编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。
  4. 编译器Compiler得到元数据信息,对任务进行编译,先将HiveQL转换为抽象语法树,然后将抽象语法树转换成查询块,将查询块转化为逻辑的查询计划,重写逻辑查询计划,将逻辑计划转化为物理的计划(MapReduce), 最后选择最佳的策略。
  5. 将最终的计划提交给Driver。到此为止,查询解析和编译完成。
  6. Driver将计划Plan转交给ExecutionEngine去执行。
  7. 在内部,执行作业的过程是一个MapReduce工作。执行引擎发送作业给JobTracker,在名称节点并把它分配作业到TaskTracker,这是在数据节点。在这里,查询执行MapReduce工作。
    7.1 与此同时,在执行时,执行引擎可以通过Metastore执行元数据操作。
  8. 执行引擎接收来自数据节点的结果。
  9. 执行引擎发送这些结果值给驱动程序。
  10. 驱动程序将结果发送给Hive接口。

1.2.3 hive和Hadoop的关系

  • hive本身其实没有多少功能,hive就相当于在Hadoop上面包了一个壳子,就是对Hadoop进行了一次封装。
  • hive的存储是基于hdfs/hbase的,hive的计算是基于mapreduce。

1.3 hive与传统型数据库的区别

  1. Hive采用了类SQL的查询语言HQL,因此很容易将Hive理解为数据库。其实从结构上来看,Hive和数据库除了拥有类似的查询语言,再无类似之处。
  2. 数据库可以用在OLTP的应用中,但是Hive是为数据仓库而设计的,清楚这一点,有助于从应用角度理解Hive的特性。
  3. Hive不适合用于联机事务处理(OLTP),也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。Hive 的特点是可伸缩(在Hadoop 的集群上动态的添加设备),可扩展、容错、输入格式的松散耦合。Hive 的入口是DRIVER ,执行的SQL语句首先提交到DRIVER驱动,然后调COMPILER解释驱动,最终解释成MapReduce 任务执行,最后将结果返回。
  4. MapReduce 开发人员可以把自己写的 Mapper 和 Reducer 作为插件支持 Hive 做更复杂的数据分析。 它与关系型数据库的 SQL 略有不同,但支持了绝大多数的语句(如 DDL、DML)以及常见的聚合函数、连接查询、条件查询等操作。

1.3.1 hive和MySQL的比较

  • mysql用自己的存储存储引擎,hive使用的hdfs来存储。
  • mysql使用自己的执行引擎,而hive使用的是mapreduce来执行。
  • mysql使用环境几乎没有限制,hive是基于hadoop的。
  • mysql的低延迟,hive是高延迟。
  • mysql的handle的数据量较小,而hive的handle数据量较大。
  • mysql的可扩展性较低,而hive的扩展性较高。
  • mysql的数据存储格式要求严格,而hive对数据格式不做严格要求。
  • mysql可以允许局部数据插入、更新、删除等,而hive不支持局部数据的操作。