01 引言
由于接下来需要用到Hive
的技术,从本篇开始,有关Hive
的学习笔记都会记录到《Hive》专栏。
接下来,开始我们愉快的Hive
学习之旅!
02 Hive概述
2.1 Hive定义
何为Hive
?在Apache官网是这样定义的:
有道翻译上述的英文,转换成中文的意思如下:
Apache Hive™
数据仓库软件可以方便地读取、写入和管理分布式存储中的大型数据集,并使用SQL
语法进行查询。
Hive
建立在Apache Hadoop™
之上,提供以下特性:
- 支持通过
SQL
轻松访问数据的工具,从而支持数据仓库任务,如提取/转换/加载(ETL
)、报告和数据分析;- 一种在各种数据格式上强加结构的机制;
- 访问直接存储在
Apache HDFS™
或其他数据存储系统(如Apache HBase™
)中的文件;- 通过
Apache Tez™
、Apache Spark™
或MapReduce
执行查询;- 使用
HPL-SQL
过程语言;- 通过
Hive LLAP
、Apache YARN
和Apache Slider
进行亚秒查询检索。
用自己的话来说就是:
Hive
是一个建立在Hadoop
之上的数据仓库软件;- 支持使用
HiveSQL
(类似SQL
的查询语言)对存储在HDFS
或HBase
中的数据进行分析和管理; - 支持创建数仓任务(
MapReduce
)来处理复杂的分析工作; - 允许用户编写自定义的函数
UDF
来查询数据。
再简洁点就是:Hive
是基于Hadoop
的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL
查询功能,进一步的本质就是《将HQL转化成MapReduce程序》。
2.2 Hive与传统关系型数据库的区别
对比项 | Hive | RDMB |
数据存储 | hadoop 的分布式文件系统 |
服务器本地的文件系统 |
计算模型 | MapReduce |
自己设计的计算模型 |
实时性 | 为海量数据做数据挖掘设计的,实时性差 | 为实时查询的业务进行设计,实时性好 |
扩展能力 | 因为继承hadoop ,很容易扩展自己的存储能力和计算能力 |
由于ACID 语义的严格限制,扩展行非常有限 |
具体行的操作 | 不支持对某个具体行的操作,对数据的操作只支持覆盖原数据和追加数据 | 支持 |
模式 | 【读时模式】:Hive 在加载数据时候不会对数据进行检查,也不会更改被加载的数据文件,而检查数据格式的操作是在查询操作时候执行 |
【写时模式】:关系数据库里,表的加载模式是在数据加载时候强制确定的(表的加载模式是指数据库存储数据的文件格式),如果加载数据时候发现加载的数据不符合模式,关系数据库则会拒绝加载数据 |
延时 | 【高】:Hive 在查询数据的时候,由于没有索引,需要扫描整个表,因此延迟较高 |
【低】:只针对数据规模较小的情况,当数据规模大到超过数据库的处理能力的时候,Hive 的并行计算显然能体现出优势 |
ANSI SQL | 不完全支持 | 支持 |
事务 | 不支持 | 支持 |
索引 | 不支持 | 支持 |
更新 | insert OVERWRITE\INTO TABLE |
UPDATE\INSERT\DELETE |
多表插入 | 支持 | 不支持 |
子查询 | 只能用在From 子句中 |
完全支持 |
视图 | Read-only | Updatable |
从上面的表格可以看出,Hive
与RDMB
数据库还是有点区别的,最明显的区别就是Hive
支持数据量庞大、分布式的场景。
03 Hive架构
贴上Hive
的架构图:
针对以上的架构图,对Hive
的每一块做一个介绍。
3.1 Client用户接口
从架构图可以看到,Client
的用户接口有4个分别为:
- CLI:CLI启动的时候,会同时启动一个Hive副本;
- WUI接口:是通过浏览器访问
Hive
; - JDBC客户端:封装了
Thrift
,java
应用程序,可以通过指定的主机和端口连接到在另一个进程中运行的hive
服务器; - ODBC客户端:
ODBC
驱动允许支持ODBC
协议的应用程序连接到Hive
。
Thrift
服务器:基于socket
通讯,支持跨语言。Hive Thrift
服务简化了在多编程语言中运行Hive
的命令。绑定支持C++
、Java
、PHP
、Python
和Ruby
语言。
3.2 Driver驱动
Driver
驱动里面的解释器、编译器、优化器完成HQL
查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS
中,并在随后有MapReduce
调用执行。
Driver
里面有如下几个组件:
- SqlParser解析器:将查询字符串
HSQL
转化为解析树表达式,这些字串可能是一条DDL
、DML
或查询语句; - Query optimizer优化器:通过逻辑策略构造多途径并以不同方式重写;
- Physical plan物理执行器(编译器):将字符串转化为策略
plan
(策略仅由元数据操作 和HDFS
操作组成,元数据操作只包含DDL
语句,HDFS
操作只包含LOAD
语句,对插入和查询而言,策略由MapReduce
任务中的具有方向的非循环图(directedacyclic graph
,DAG
)组成)。
这里描述Query optimizer
优化器的功能:
- 将多
multiple join
合并为一个multi-way join
;- 对
join
、group-by
和自定义的map-reduce
操作重新进行划分;- 消减不必要的列;
- 在表扫描操作中推行使用断言(
predicate
);- 对于已分区的表,消减不必要的分区;
- 在抽样(
sampling
)查询中,消减不必要的桶。
3.3 MapReduce分析计算
Driver
驱动模块里面生成的 查询计划(HSQL
) 转换成MapReduce
任务执行。
MapReduce
开发人员可以把自己写的 Mapper
和 Reducer
作为插件支持 Hive
做更复杂的数据分析。
3.6 Metastore元数据库
Hive
的数据由两部分组成:数据文件和元数据。
- 元数据用于存放
Hive
库的基础信息,它存储在关系数据库中,如mysql
、derby
。 - 元数据包括数据库信息,表的名字,表的列和分区及其属性,表的属性,表的数据所在目录等。
3.5 HDFS/HBase存储
Hive
的数据文件存储在HDFS
中,大部分的查询由 MapReduce
完成。
04 Hive 工作原理
经过上面架构图的描述,网上找了份Hive
的工作原理图,大家可以大致感受下:
因为本文是入门篇,所以这里不再详述,后续会编写相应的博客来描述它的工作原理。
05 文末
本文是不断的百度谷歌去搜索并经过自己的理解整理出来的文章,或许会有理解错误之处,欢迎各位童鞋留言评论,谢谢大家的阅读,本文完!