Hive教程(01)- 初识Hive

简介: Hive教程(01)- 初识Hive

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 LLAPApache YARNApache Slider进行亚秒查询检索。

用自己的话来说就是:

  • Hive是一个建立在Hadoop之上的数据仓库软件;
  • 支持使用HiveSQL(类似SQL的查询语言)对存储在HDFSHBase中的数据进行分析和管理;
  • 支持创建数仓任务(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

从上面的表格可以看出,HiveRDMB数据库还是有点区别的,最明显的区别就是Hive支持数据量庞大、分布式的场景。

03 Hive架构

贴上Hive的架构图:

针对以上的架构图,对Hive的每一块做一个介绍。

3.1 Client用户接口

从架构图可以看到,Client的用户接口有4个分别为:

  • CLI:CLI启动的时候,会同时启动一个Hive副本;
  • WUI接口:是通过浏览器访问 Hive
  • JDBC客户端:封装了Thriftjava应用程序,可以通过指定的主机和端口连接到在另一个进程中运行的hive服务器;
  • ODBC客户端ODBC驱动允许支持ODBC协议的应用程序连接到Hive

Thrift服务器:基于socket通讯,支持跨语言。Hive Thrift服务简化了在多编程语言中运行Hive的命令。绑定支持C++JavaPHPPythonRuby语言。

3.2 Driver驱动

Driver驱动里面的解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS 中,并在随后有MapReduce调用执行。

Driver里面有如下几个组件:

  • SqlParser解析器:将查询字符串HSQL转化为解析树表达式,这些字串可能是一条 DDLDML或查询语句;
  • Query optimizer优化器:通过逻辑策略构造多途径并以不同方式重写;
  • Physical plan物理执行器(编译器):将字符串转化为策略plan(策略仅由元数据操作 和 HDFS操作组成,元数据操作只包含DDL 语句,HDFS操作只包含 LOAD语句,对插入和查询而言,策略由 MapReduce任务中的具有方向的非循环图(directedacyclic graphDAG)组成)。

这里描述Query optimizer优化器的功能:

  • 将多 multiple join 合并为一个multi-way join
  • joingroup-by和自定义的 map-reduce操作重新进行划分;
  • 消减不必要的列;
  • 在表扫描操作中推行使用断言(predicate);
  • 对于已分区的表,消减不必要的分区;
  • 在抽样(sampling)查询中,消减不必要的桶。

3.3 MapReduce分析计算

Driver驱动模块里面生成的 查询计划(HSQL) 转换成MapReduce任务执行。

MapReduce 开发人员可以把自己写的 MapperReducer作为插件支持 Hive 做更复杂的数据分析。

3.6 Metastore元数据库

Hive的数据由两部分组成:数据文件和元数据。

  • 元数据用于存放Hive库的基础信息,它存储在关系数据库中,如mysqlderby
  • 元数据包括数据库信息,表的名字,表的列和分区及其属性,表的属性,表的数据所在目录等。

3.5 HDFS/HBase存储

Hive的数据文件存储在HDFS中,大部分的查询由 MapReduce完成。

04 Hive 工作原理

经过上面架构图的描述,网上找了份Hive的工作原理图,大家可以大致感受下:

因为本文是入门篇,所以这里不再详述,后续会编写相应的博客来描述它的工作原理。

05 文末

本文是不断的百度谷歌去搜索并经过自己的理解整理出来的文章,或许会有理解错误之处,欢迎各位童鞋留言评论,谢谢大家的阅读,本文完!

目录
相关文章
|
SQL Java 数据库连接
Hive教程(08)- JDBC操作Hive
Hive教程(08)- JDBC操作Hive
814 0
|
SQL 分布式计算 Java
Hive教程(07)- Hive自定义用户名密码验证(已开源)
Hive教程(07)- Hive自定义用户名密码验证(已开源)
318 0
|
SQL 分布式计算 Shell
Hive教程(05)- Hive命令汇总(上)
Hive教程(05)- Hive命令汇总(上)
233 0
|
SQL 存储 Java
Hive教程(09)- 彻底解决小文件的问题
Hive教程(09)- 彻底解决小文件的问题
589 0
|
SQL 分布式计算 HIVE
Hive教程(05)- Hive命令汇总(下)
Hive教程(05)- Hive命令汇总(下)
115 0
Hive教程(05)- Hive命令汇总(下)
|
SQL 存储 API
Flink教程(25)- Flink高级特性(FlinkSQL整合Hive)
Flink教程(25)- Flink高级特性(FlinkSQL整合Hive)
954 0
|
SQL 存储 Java
Hive教程(06)- Hive SerDe序列化与反序列化
Hive教程(06)- Hive SerDe序列化与反序列化
273 0
|
SQL 存储 Java
Hive教程(04)- Hive数据类型
Hive教程(04)- Hive数据类型
275 0
|
SQL 存储 关系型数据库
Hive教程(03)- Hive数据模型
Hive教程(03)- Hive数据模型
190 0