1 hive介绍与原理分析

1.1 hive的优缺点

优点:

  1. Hive 使用类SQL 查询语法, 最大限度的实现了和SQL标准的兼容,大大降低了传统数据分析人员处理大数据的难度
  2. 使用JDBC 接口/ODBC接口,开发人员更易开发应用;
  3. 以MR 作为计算引擎、HDFS 作为存储系统,为超大数据集设计的计算/ 扩展能力;
  4. 统一的元数据管理(Derby、MySql等),并可与Pig 、spark等共享;默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore

元数据:hive表所对应的字段、属性还有表所对应存储的HDFS目录

缺点:

  1. Hive 的HQL 表达的能力有限,比如不支持update、非等值连接、delete、insert 单条等;
  2. 由于Hive自动生成MapReduce 作业, HQL 调优困难;
  3. 粒度较粗,可控性差,是因为数据是读的时候进行类型的转换,关系型数据是在写入的时候就检查了数据的类型。
  4. hive生成MapReduce作业,高延迟,不适合实时查询。

1.2 与关系数据库的区别

  1. hive和关系数据库存储文件的系统不同,hive使用的是hadoop的HDFS(hadoop的分布式文件系统),关系数据库则是服务器本地的文件系统;
  2. hive使用mapreduce做运算,与传统数据库相比 运算数据规模要大得多;
  3. 关系数据库都是为实时查询的业务进行设计的,而hive则是为海量数据做数据挖掘设计的,实时性很差;实时性差导致hive的应用场景和关系数据库有很大的区别;
  4. Hive很容易扩展自己的存储能力和计算能力,这个是继承hadoop的,而关系数据库在这个方面要比Hive差很多。

Hive

RDBMS

查询语言

HQL

SQL

数据存储

HDFS

Raw Device or Local FS

执行

MapReduce

数据库引擎

数据存储校验

存储不校验

存储校验

可扩展性


有限

执行延迟



处理数据规模



1.3 hive的组成

服务端组件和客户端组件

hive可以存储什么数据 hive可以写存储过程吗_Hive

服务端组件:

  • Driver组件:该组件包括Complier、Optimizer和Executor,它的作用是将HiveQL(类SQL)语句进行解析、编译优化,生成执行计划,然后调用底层的MapReduce计算框架。
  • Metastore组件:元数据服务组件,这个组件存取Hive的元数据,Hive的元数据存储在关系数据库里,Hive支持的关系数据库有Derby和Mysql。作用是:客户端连接metastore服务,metastore再去连接MySQL数据库来存取元数据。
  • Thrift服务:Thrift是Facebook开发的一个软件框架,它用来进行可扩展且跨语言的服务的开发,Hive集成了该服务,能让不同的编程语言调用Hive的接口。

客户端组件:

  • CLI:Command Line Interface,命令行接口。
  • JDBC/ODBC:Hive架构的JDBC和ODBC接口是建立在Thrift客户端之上。
  • WEBGUI:Hive客户端提供了一种通过网页的方式访问Hive所提供的服务。这个接口对应Hive的HWI组件(Hive Web Interface),使用前要启动HWI服务

1.4 Hive查询的执行过程

hive可以存储什么数据 hive可以写存储过程吗_Hive_02

  1. Execute Query: hive界面如命令行或Web UI将查询发送到Driver(任何数据库驱动程序如JDBC、ODBC,等等)来执行。
  2. Get Plan: Driver根据查询编译器解析query语句,验证query语句的语法,查询计划或者查询条件。
  3. Get Metadata: 编译器将元数据请求发送给Metastore(数据库)。
  4. Send Metadata: Metastore将元数据作为响应发送给编译器。
  5. Send Plan: 编译器检查要求和重新发送Driver的计划。到这里,查询的解析和编译完成。
  6. Execute Plan: Driver将执行计划发送到执行引擎。
  1. Execute Job: hadoop内部执行的是mapreduce工作过程,任务执行引擎发送一个任务到资源管理节点(resourcemanager),资源管理器分配该任务到任务节点,由任务节点上开始执行mapreduce任务。
  2. Metadata Ops: 在执行引擎发送任务的同时,对hive的元数据进行相应操作。
  1. Fetch Result: 执行引擎接收数据节点(data node)的结果。
  2. Send Results: 执行引擎发送这些合成值到Driver。
  3. Send Results: Driver将结果发送到hive接口。