Hive:Hive 简介及工作原理

1. Hive 简介

  • Hive 是一款建立在 Hadoop 之上的开源数据仓库系统,可以将存储在 Hadoop 文件中的结构化、半结构化数据文件映射为一张数据库表,基于表提供了一种类似 SQL 的查询模型,称为 Hive 查询语言(HQL),用于访问和分析存储在 Hadoop 文件中的大型数据集。

1.1. Hive & Hadoop

Hive 利用 HDFS 存储数据,利用 MapReduce 计算引擎查询分析数据。

  • Hive 核心是将 HQL 转换为 MapReduce 程序,然后将程序提交到 Hadoop 群集执行。

1.2. Hive & MapReduce

  • 使用 Hadoop MapReduce 直接处理数据所面临的问题
    • 人员学习成本太高 需要掌握 java 语言
    • MapReduce 实现复杂,查询逻辑开发难度太大
  • 使用Hive处理数据的好处
    • 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)
    • 避免直接写 MapReduce,减少开发人员的学习成本
    • 支持自定义函数(UDF),功能扩展很方便
    • 背靠 Hadoop,擅长存储分析海量数据集
  • Hive 的最大的魅力在于用户专注于编写 HQL,Hive 将 HQL 转换成为 MapReduce 程序完成对数据的分析。

1.3. Hive 优点

  • 操作接口采用类 SQL 语法,避免了写 MapReduce 程序,简单易上手,减少开发人员学习成本;
  • 在数据处理方面,Hive 语句最终会生成 MapReduce 任务去计算,常用于离线数据分析,对数据实时性要求不高的场景;
  • 在数据存储方面,能够存储很大的数据集(HDFS),并且对数据完整性、格式要求并不严格(要求是结构化的就可以了);
  • 在延展性方面,Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函数;

1.4. Hive 缺点

  • Hive 的 HQL 本身表达能力有限,不能够进行迭代式计算,在数据挖掘方面也不擅长(当需求逻辑特别复杂时还需要借助于 Map Reduce)
  • Hive 操作默认基于 MapReduce 引擎,延迟高、不适用于交互式查询,因此智能化程度低,并且基于 SQL 调优困难、粒度较粗。
  • 我们也可以手动更改让 Hive 基于 Spark 引擎。

2. Hive 工作原理

2.1. Hive 工作流程

2.2. Hive 将数据文件映射成为一张表

  • 在 hive中 能够写 sql 处理的前提是针对表,而不是针对文件,因此需要将文件和表之间的对应关系描述记录清楚;
  • 映射信息专业的叫法称之为元数据信息(元数据是指用来描述数据的数据 metadata)。
    • 元数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。

2.2. Hive 解析 SQL 编译称为 MapReduce

  • 用户写完sql之后,hive需要针对sql进行语法校验,并且根据记录的元数据信息解读sql背后的含义,制定执行计划。
  • 并且把执行计划转换成 MapReduce 程序来具体执行,把执行的结果封装返回给用户。

3. Hive 架构

3.1. 用户接口

  • 包括 CLI、JDBC/ODBC、WebGUI。其中,CLI(command line interface)为shell命令行;Hive中的Thrift服务器允许;
  • 外部客户端通过网络与Hive进行交互,类似于JDBC或ODBC协议。WebGUI是通过浏览器访问Hive。

3.2. 元数据存储 Hive Metadata

  • Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
  • Hive Metadata 即 Hive 的元数据,包含用 Hive 创建的 database、table、表的位置、类型、属性,字段顺序类型等元信息。
  • 元数据存储在关系型数据库中。如 hive 内置的 Derby、或者第三方如 MySQL 等。

3.4. Driver 驱动程序

  • 包括语法解析器、计划编译器、优化器、执行器;
  • Driver 完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成;
  • 生成的查询计划存储在 HDFS 中,并在随后有执行引擎调用执行。

3.5. 执行引擎

  • Hive 本身并不直接处理数据文件,而是通过执行引擎处理。
  • 当下 Hive支持 MapReduce、Tez、Spark 3种执行引擎。

4. Metastore

4.1. Hive Metastore

  • Metastore 即元数据服务。Metastore服务的作用是管理metadata元数据,对外暴露服务地址,让各种客户端通过连接metastore服务,由metastore再去连接MySQL数据库来存取元数据。
  • 有了metastore服务,就可以有多个客户端同时连接,而且这些客户端不需要知道MySQL数据库的用户名和密码,只需要连接metastore 服务即可。某种程度上也保证了hive元数据的安全。

4.2. metastore 配置方式

  • metastore服务配置有3种模式:内嵌模式、本地模式、远程模式。
  • 区分3种配置方式的关键是弄清楚两个问题:
    • Metastore服务是否需要单独配置、单独启动;
    • Metadata是存储在内置的derby中,还是第三方RDBMS,比如MySQL。

4.3. metastore 远程模式

  • 在生产环境中,建议用远程模式来配置Hive Metastore。
  • 在这种情况下,其他依赖 hive 的软件都可以通过 Metastore 访问 hive。由于还可以完全屏蔽数据库层,因此这也带来了更好的可管理性/安全性。

4.4. HiveServer2 服务

  • 远程模式下 Hive 命令行工具 beeline 通过 Thrift 连接到单独的 HiveServer2 服务上,这也是官方推荐在生产环境中使用的模式。
  • HiveServer2 支持多客户端的并发和身份认证,旨在为开放 API 客户端如 JDBC、ODBC 提供更好的支持。

  • HiveServer2 通过 Metastore 服务读写元数据,在远程模式下,启动 HiveServer2 之前必须先首先启动 metastore服务。

    特别注意:远程模式下,Beeline客户端只能通过HiveServer2服务访问Hive。而bin/hive是通过Metastore服务访问的。

  • 具体关系如下:

5. Hive 与 MySQL 的区别

  • 查询语言不同
    • hive 是 hql 语言,mysql 是 sql 语言;
  • 数据存储位置不同
    • hive 是把数据存储到 hdfs,而 mysql 数据存储在自己的系统中;
  • 数据格式
    • hive 数据格式可以用户自定义,mysql 有自己的系统定义格式;
  • 数据更新
    • hive 不支持数据更新,只可以读,不可以写,sql 支持数据的读写;
  • 索引
    • hive 没有索引,因此查询数据的时候是通过 mapreduce 很暴力的把数据都查询一遍,也造成了 hive 查询数据速度很慢的原因,而 mysql 有索引;
  • 延迟性
    • hive 没有索引,因此查询数据的时候通过 mapreduce 很暴力 的把数据都查询一遍,也造成了 hive 查询数据速度很慢的原因,而 mysql 有索引;
  • 数据规模
    • hive 存储的数据量超级大,而 mysql 只是存储一些少量的业务数据;
  • 底层执行原理
    • hive 底层是用的 mapreduce,而 mysql 是 excutor 执行器;
  • 应用场景
    • Hive 只适合用来做海量离线数 据统计分析,也就是数据仓库。