Hive 概念

  • 简介
  • Hive 特点
  • Hive 架构
  • MetaStore 组件
  • Hive 执行流程
  • Hive 与传统数据库相比
  • 创建 Hive 表
  • 分区表和分桶表
  • Hive 优化

简介

什么是 Hive

Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类似于 SQL 的查询功能功能

为什么使用 Hive

直接使用 hadoop 所面临的问题:

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

为什么要使用 Hive:

  • 操作接口采用类 SQL 语法,提供快速开发的能力
  • 避免了去写 MapReduce,减少开发人员的学习成本
  • 扩展功能很方便

Hive 特点

  • 可扩展

    Hive 可以自由的扩展集群的规模,一般情况下不需要重启服务

  • 延展性

    Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数

  • 容错性

    良好的容错性,节点出问题,SQL 仍可完成执行

Hive 架构

hive 架构

服务端主件

  1. 用户接口:Client

    CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)

  2. 元数据:Metastore

    • single user mode:

      默认安装在 hive 的机器上,hive 是使用 derby 内数据库保存 hive 的元数据,这样是不可以并发调用 hive 的

    • multiuser node :

      通过网络连接到一个数据库中,是最经常使用到的模式,假设使用本机 mysql 服务器存储元数据

    • remote server mode:

      用于非 java 客户端访问元数据库,在服务器端启动一个 MetaStoreServer,客户端利用 Thrift 协议通过 MetaStoreServer 访问元数据库

  3. 存储介质:Hadoop

    Hive 使用 HDFS 进行存储,使用 MapReduce 进行计算

  4. 驱动器:Driver

    该组件包括Complier、Optimizer 和 Executor,它的作用是将我们写的 HiveQL(类SQL)语句进行解析、编译优化,生成执行计划,然后调用底层的 mapreduce 计算框架。

客户端组件

  1. CLI:

    command line interface,命令行接口

  2. Thrift 客户端:

    hive 架构的许多客户端接口是建立在 thrift 客户端之上,包括 JDBC 和 ODBC 接口

  3. WebUI:

    hive 客户端提供了一种通过网页的方式访问 hive 所提供的服务,这个接口对应 hive 的 hwi(hive-web-interface),使用前需要启动 hwi 服务

MetaStore 组件

Hive 的 MetaStore 组件是 hive 元数据集中存放地。MetaStore 组件包括两个部分:

  1. MetaStore 服务
  2. 后台数据的存储

后台数据存储的介质就是关系数据库,hive 默认的嵌入式磁盘数据库 derby,还有 mysql 数据库。MetaStore 服务是建立在后台数据存储介质之上,并且可以和 hive 服务是安装在一起的,运行在同一个 JVM 进程当中。

但也可以将 MetaStore 服务从 Hive 中剥离出来,单独放在一个集群中,为这个集群安装防火墙,提供安全服务,保证元数据安全,客户端只需要通过防火墙认证连接到元数据即可,保证了 hive 的稳定性,也提高了效率

Hive 执行流程

Hive 执行流程

Hive 与传统数据库相比

Hive RDBMS
查询语言 HQL SQL
数据存储 HDFS Raw Device or Local FS
执行 MapReduce Excutor
执行延迟
处理数据规模
索引 0.8 版本后加入位图索引,紧凑索引 有复杂的索引

总结:hive 具有 sql 数据库的外表,但应用场景完全不同,hive 只适合用来做批量数据统计分析

其他比较

  • 读时模式 VS 写时模式

    在传统数据里,插入数据时,表的模式是强制确定了的,如果不符合,就不允许插入,在写入时检查数据被称为“写时模式”

    hive 对数据的验证不在加载数据时进行,而在查询时进行,称为“读时模式”

    写时模式有利于提升查询性能,数据库可以对列进行索引,并对数据库进行压缩,但是加载数据库就会消耗更多的时间

  • 更新、事务

    hive 的表更新是通过把数据变换后放入新表实现的

    HDFS 不提供就地文件更新,所以,插入、更新和删除操作因引起的变化都被保存在一个较小的增量文件中,由 metastore 在后台运行的 MapReduce 作业定期将增量的文件合并到 “基表” 中。这些功能只能在事务的背景环境下才能使用(hive 0.13.0 版本引入事务)

  • 索引

    • 紧凑索引:存储每个值的 HDFS 的块号,不是存储文件内的偏移量,不会占用过多的磁盘空间
    • 位图索引:使用压缩的位集合来存储具有某个特殊值的行,通常用于具有少取值可能的列

创建 Hive 表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 表中的字段和数据类型
create table person(
id int,
name string,
age int,
fav array<string>,
addr map<string, string>
)
// 表的简介
comment 'This is the person table'
// 定义这张表使用的数据文件格式,这里指定为 txt 类型
row format delimited fields terminated by '\t'
collection items terminated by '-'
map keys terminated by ':'
stored as textfile;
  • row format delimited fields terminated by ‘\t’

    定义每一个字段的分隔符,这里 ‘\t’ 表示以 Tab 作为分隔符分隔每行字段

  • collection items terminated by ‘-‘

    定义集合中每个对象的分隔符,fav 字段是 String 类型的数组,以 ‘-‘ 为分隔符,分隔每个字符串

  • map keys terminated by ‘:’

    定义 Map 类型键值对的分隔符,这里指定为 txt 类型

分区表和分桶表

Hive的分区表和分桶表的区别

Hive 优化

hive优化

坚持原创技术分享,您的支持将鼓励我继续创作!