您的位置:首页 > 大数据 > Hadoop

基于Hadoop的数据仓库Hive基础知识

2019-08-14 16:57 435 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/sinat_26811377/article/details/99579494

目录

一、概述

1.1 数据仓库概念

1.2 传统数据仓库的问题

1.3 Hive

1.4 Hive 与 Hadoop 生态系统中其他组件的关系

1.5 Hive 与传统数据库的对比

1.6 Hive 的部署和应用

二、Hive 系统架构

三、Hive 工作原理

3.1 SQL 语句转换成 MapReduce 作业的基本原理

3.2 Hive 中 SQL 查询转换成 MR 作业的过程

四、Hive HA 基本原理

五、Impala

5.1 Impala 简介

5.2 Impala 系统架构

5.3 Impala 查询执行过程

5.4 Impala 与 Hive的异同

Hive 是基于 Hadoop 的数据仓库工具,可对存储在 HDFS 上的文件中的数据集进行数据整理、特殊查询和分析处理,提供了类似于 SQL 语言的查询语言–HiveQL,可通过 HQL 语句实现简单的 MR 统计,Hive 将 HQL 语句转换成 MR 任务进行执行。

一、概述

1.1 数据仓库概念

数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反应历史变化(Time Variant)的数据集合,用于支持管理决策。

数据仓库体系结构通常含四个层次:数据源、数据存储和管理、数据服务、数据应用

数据源:是数据仓库的数据来源,含外部数据、现有业务系统和文档资料等;

数据集成:完成数据的抽取、清洗、转换和加载任务,数据源中的数据采用 ETL(Extract-Transform-Load)工具以固定的周期加载到数据仓库中。

数据存储和管理:此层次主要涉及对数据的存储和管理,含数据仓库、数据集市、数据仓库检测、运行与维护工具和元数据管理等。

数据服务:为前端和应用提供数据服务,可直接从数据仓库中获取数据供前端应用使用,也可通过 OLAP(OnLine Analytical Processing,联机分析处理)服务器为前端应用提供负责的数据服务。

数据应用:此层次直接面向用户,含数据查询工具、自由报表工具、数据分析工具、数据挖掘工具和各类应用系统。

1.2 传统数据仓库的问题

无法满足快速增长的海量数据存储需求,传统数据仓库基于关系型数据库,横向扩展性较差,纵向扩展有限

无法处理不同类型的数据,传统数据仓库只能存储结构化数据,企业业务发展,数据源的格式越来越丰富。

传统数据仓库建立在关系型数据仓库之上,计算和处理能力不足,当数据量达到 TB 级后基本无法获得好的性能。

1.3 Hive

Hive 是建立在 Hadoop 之上的数据仓库,由 Facebook 开发,在某种程度上可以看成是用户编程接口,本身并不存储和处理数据,依赖于 HDFS 存储数据,依赖 MR 处理数据。有类 SQL 语言 HiveQL,不完全支持 SQL 标准,例如不支持更新操作、索引和事务,其子查询和连接操作也存在很多限制。

Hive 把 HQL 语句转换成 MR 任务后,采用批处理的方式对海量数据进行处理。数据仓库存储的是静态数据,很适合采用 MR 进行批处理。Hive 还提供了一系列对数据进行提取、转换、加载的工具,可以存储、查询和分析存储在 HDFS 上的数据。

1.4 Hive 与 Hadoop 生态系统中其他组件的关系

Hive 依赖于 HDFS 存储数据,依赖 MR 处理数据;

Pig 可作为 Hive 的替代工具,是一种数据流语言和运行环境,适合用于在 Hadoop 平台上查询半结构化数据集,用于与 ETL 过程的一部分,即将外部数据装载到 Hadoop 集群中,转换为用户需要的数据格式;

HBase 是一个面向列的、分布式可伸缩的数据库,可提供数据的实时访问功能,而 Hive 只能处理静态数据,主要是 BI 报表数据,Hive 的初衷是为减少复杂 MR 应用程序的编写工作,HBase 则是为了实现对数据的实时访问。

1.5 Hive 与传统数据库的对比

1.6 Hive 的部署和应用

1.6.1 Hive 在企业大数据分析平台中的应用

当前企业中部署的大数据分析平台,除 Hadoop 的基本组件 HDFS 和 MR 外,还结合使用 Hive、Pig、HBase、Mahout,从而满足不同业务场景需求。

上图是企业中一种常见的大数据分析平台部署框架 ,在这种部署架构中:

  • Hive 和 Pig 用于报表中心,Hive 用于分析报表,Pig 用于报表中数据的转换工作
  • HBase 用于在线业务,HDFS 不支持随机读写操作,而 HBase 正是为此开发,可较好地支持实时访问数据。
  • Mahout 提供一些可扩展的机器学习领域的经典算法实现,用于创建商务智能(BI)应用程序。

二、Hive 系统架构

下图显示 Hive 的主要组成模块、Hive 如何与 Hadoop 交互工作、以及从外部访问 Hive 的几种典型方式。

Hive 主要由以下三个模块组成:

  • 用户接口模块,含 CLI、HWI、JDBC、Thrift Server 等,用来实现对 Hive 的访问。CLI 是 Hive 自带的命令行界面;HWI 是 Hive 的一个简单网页界面;JDBC、ODBC 以及 Thrift Server 可向用户提供进行编程的接口,其中 Thrift Server 是基于 Thrift 软件框架开发的,提供 Hive 的 RPC 通信接口。
  • 驱动模块(Driver),含编译器、优化器、执行器等,负责把 HiveQL 语句转换成一系列 MR 作业,所有命令和查询都会进入驱动模块,通过该模块的解析变异,对计算过程进行优化,然后按照指定的步骤执行。
  • 元数据存储模块(Metastore),是一个独立的关系型数据库,通常是与 MySQL 数据库连接后创建的一个 MySQL 实例,也可以是 Hive 自带的 Derby 数据库实例。此模块主要保存表模式和其他系统元数据,如表的名称、表的列及其属性、表的分区及其属性、表的属性、表中数据所在位置信息等。

喜欢图形界面的用户,可采用几种典型的外部访问工具:Karmasphere、Hue、Qubole 等。

三、Hive 工作原理

3.1 SQL 语句转换成 MapReduce 作业的基本原理

3.1.1 用 MapReduce 实现连接(join)操作

假设连接(join)的两个表分别是用户表 User(uid,name) 和订单表 Order(uid,orderid),具体的 SQL 命令:

[code]SELECT name, orderid FROM User u JOIN Order o ON u.uid=o.uid

上图描述了连接操作转换为 MapReduce 操作任务的具体执行过程。

  • 首先,在 Map 阶段,User 表以 uid 为 key,以 name 和表的标记位(这里 User 的标记位记为 1)为 value,进行 Map 操作,把表中记录转换生成一系列 KV 对的形式。比如,User 表中记录 (1,Lily) 转换为键值对 (1,<1,Lily>),其中第一个“1” 是 uid 的值,第二个 “1” 是表 User 的标记位,用来标示这个键值对来自 User 表;同样,Order 表以 uid 为 key,以 orderid 和表的标记位(这里表 Order 的标记位记为 2)为值进行 Map 操作,把表中的记录转换生成一系列 KV 对的形式;
  • 接着,在 Shuffle 阶段,把 User 表和 Order 表生成的 KV 对按键值进行 Hash,然后传送给对应的 Reduce 机器执行。比如 KV 对 (1,<1,Lily>)、(1,<2,101>)、(1,<2,102>) 传送到同一台 Reduce 机器上。当 Reduce 机器接收到这些 KV 对时,还需按表的标记位对这些键值对进行排序,以优化连接操作;
  • 最后,在 Reduce 阶段,对同一台 Reduce 机器上的键值对,根据 “值”(value)中的表标记位,对来自表 User 和 Order 的数据进行笛卡尔积连接操作,以生成最终的结果。比如键值对(1,<1,Lily>) 与键值对 (1,<2,101>)、(1,<2,102>) 的连接结果是(Lily,101)、(Lily,102)。

 3.1.2 用 MapReduce 实现分组(group by)操作

 假设分数表 Score(rank, level),具有 rank(排名)和 level(级别)两个属性,需要进行一个分组(Group By)操作,功能是把表 Score 的不同片段按照 rank 和 level 的组合值进行合并,并计算不同的组合值有几条记录。SQL 语句命令如下:

[code]SELECT rank,level,count(*) as value FROM score GROUP BY rank,level

上图描述分组操作转化为 MapReduce 任务的具体执行过程。

  • 首先,在 Map 阶段,对表 Score 进行 Map 操作,生成一系列 KV 对,其键为 <rank, level>,值为 “拥有该 < rank, level > 组合值的记录的条数”。比如,Score 表的第一片段中有两条记录 (A,1),所以进行 Map 操作后,转化为键值对 (<A,1>,2);
  • 接着在 Shuffle 阶段,对 Score 表生成的键值对,按照 “键” 的值进行 Hash,然后根据 Hash 结果传送给对应的 Reduce 机器去执行。比如,键值对 (<A,1>,2)、(<A,1>,1) 传送到同一台 Reduce 机器上,键值对 (<B,2>,1) 传送另一 Reduce 机器上。然后,Reduce 机器对接收到的这些键值对,按 “键” 的值进行排序;
  • Reduce 阶段,把具有相同键的所有键值对的 “值” 进行累加,生成分组的最终结果。比如,在同一台 Reduce 机器上的键值对 (<A,1>,2) 和(<A,1>,1)Reduce 操作后的输出结果为(A,1,3)。

3.2 Hive 中 SQL 查询转换成 MR 作业的过程

当 Hive 接收到一条 HQL 语句后,需要与 Hadoop 交互工作来完成该操作。HQL 首先进入驱动模块,由驱动模块中的编译器解析编译,并由优化器对该操作进行优化计算,然后交给执行器去执行。执行器通常启动一个或多个 MR 任务,有时也不启动(如 SELECT * FROM tb1,全表扫描,不存在投影和选择操作)

上图是 Hive 把 HQL 语句转化成 MR 任务进行执行的详细过程。

  • 由驱动模块中的编译器–Antlr 语言识别工具,对用户输入的 SQL 语句进行词法和语法解析,将 HQL 语句转换成抽象语法树(AST Tree)的形式;
  • 遍历抽象语法树,转化成 QueryBlock 查询单元。因为 AST 结构复杂,不方便直接翻译成 MR 算法程序。其中 QueryBlock 是一条最基本的 SQL 语法组成单元,包括输入源、计算过程、和输入三个部分;
  • 遍历 QueryBlock,生成 OperatorTree(操作树),OperatorTree 由很多逻辑操作符组成,如 TableScanOperator、SelectOperator、FilterOperator、JoinOperator、GroupByOperator 和 ReduceSinkOperator 等。这些逻辑操作符可在 Map、Reduce 阶段完成某一特定操作;
  • Hive 驱动模块中的逻辑优化器对 OperatorTree 进行优化,变换 OperatorTree 的形式,合并多余的操作符,减少 MR 任务数、以及 Shuffle 阶段的数据量;
  • 遍历优化后的 OperatorTree,根据 OperatorTree 中的逻辑操作符生成需要执行的 MR 任务;
  • 启动 Hive 驱动模块中的物理优化器,对生成的 MR 任务进行优化,生成最终的 MR 任务执行计划;
  • 最后,有 Hive 驱动模块中的执行器,对最终的 MR 任务执行输出。

Hive 驱动模块中的执行器执行最终的 MR 任务时,Hive 本身不会生成 MR 算法程序。它通过一个表示 “Job 执行计划” 的 XML 文件,来驱动内置的、原生的 Mapper 和 Reducer 模块。Hive 通过和 JobTracker 通信来初始化 MR 任务,而不需直接部署在 JobTracker 所在管理节点上执行。通常在大型集群中,会有专门的网关机来部署 Hive 工具,这些网关机的作用主要是远程操作和管理节点上的 JobTracker 通信来执行任务。Hive 要处理的数据文件常存储在 HDFS 上,HDFS 由名称节点(NameNode)来管理。

四、Hive HA 基本原理

在实际应用中,Hive 也暴露出不稳定的问题,在极少数情况下,会出现端口不响应或进程丢失问题。Hive HA(High Availablity)可以解决这类问题。

在 Hive HA 中,在 Hadoop 集群上构建的数据仓库是由多个 Hive 实例进行管理的,这些 Hive 实例被纳入到一个资源池中,由 HAProxy 提供统一的对外接口。客户端的查询请求,首先访问 HAProxy,由 HAProxy 对访问请求进行转发。HAProxy 收到请求后,会轮询资源池中可用的 Hive 实例,执行逻辑可用性测试。

如果某个 Hive 实例逻辑可用,就会把客户端的访问请求转发到 Hive 实例上;

如果某个实例不可用,就把它放入黑名单,并继续从资源池中取出下一个 Hive 实例进行逻辑可用性测试。

对于黑名单中的 Hive,Hive HA 会每隔一段时间进行统一处理,首先尝试重启该 Hive 实例,如果重启成功,就再次把它放入资源池中。

由于 HAProxy 提供统一的对外访问接口,因此,对于程序开发人员来说,可把它看成一台超强 “Hive”。

五、Impala

5.1 Impala 简介

Impala 由 Cloudera 公司开发,提供 SQL 语义,可查询存储在 Hadoop 和 HBase 上的 PB 级海量数据。Hive 也提供 SQL 语义,但底层执行任务仍借助于 MR,实时性不好,查询延迟较高。

Impala 作为新一代开源大数据分析引擎,最初参照 Dremel(由 Google 开发的交互式数据分析系统),支持实时计算,提供与 Hive 类似的功能,在性能上高出 Hive3~30 倍。Impala 可能会超过 Hive 的使用率能成为 Hadoop 上最流行的实时计算平台。Impala 采用与商用并行关系数据库类似的分布式查询引擎,可直接从 HDFS、HBase 中用 SQL 语句查询数据,不需把 SQL 语句转换成 MR 任务,降低延迟,可很好地满足实时查询需求。

Impala 不能替换 Hive,可提供一个统一的平台用于实时查询Impala 的运行依赖于 Hive 的元数据(Metastore)。Impala 和 Hive 采用相同的 SQL 语法、ODBC 驱动程序和用户接口,可统一部署 Hive 和 Impala 等分析工具,同时支持批处理和实时查询。

5.2 Impala 系统架构

上图是 Impala 系统结构图,虚线模块数据 Impala 组件。Impala 和 Hive、HDFS、HBase 统一部署在 Hadoop 平台上。Impala 由 Impalad、State Store 和 CLI 三部分组成。

  • Implalad:是 Impala 的一个进程,负责协调客户端提供的查询执行,给其他 Impalad 分配任务,以及收集其他 Impalad 的执行结果进行汇总。Impalad 也会执行其他 Impalad 给其分配的任务,主要是对本地 HDFS 和 HBase 里的部分数据进行操作。Impalad 进程主要含 Query Planner、Query Coordinator 和 Query Exec Engine 三个模块,与 HDFS 的数据节点(HDFS DataNode)运行在同一节点上,且完全分布运行在 MPP(大规模并行处理系统)架构上。
  • State Store:收集分布在集群上各个 Impalad 进程的资源信息,用于查询的调度,它会创建一个 statestored 进程,来跟踪集群中的 Impalad 的健康状态及位置信息。statestored 进程通过创建多个线程来处理 Impalad 的注册订阅以及与多个 Impalad 保持心跳连接,此外,各 Impalad 都会缓存一份 State Store 中的信息。当 State Store 离线后,Impalad 一旦发现 State Store 处于离线状态时,就会进入恢复模式,并进行返回注册。当 State Store 重新加入集群后,自动恢复正常,更新缓存数据。
  • CLI:CLI 给用户提供了执行查询的命令行工具。Impala 还提供了 Hue、JDBC 及 ODBC 使用接口。

5.3 Impala 查询执行过程

  • 注册和订阅。当用户提交查询前,Impala 先创建一个 Impalad 进程来负责协调客户端提交的查询,该进程会向 State Store 提交注册订阅信息,State Store 会创建一个 statestored 进程,statestored 进程通过创建多个线程来处理 Impalad 的注册订阅信息。
  • 提交查询。通过 CLI 提交一个查询到 Impalad 进程,Impalad 的 Query Planner 对 SQL 语句解析,生成解析树;Planner 将解析树变成若干 PlanFragment,发送到 Query Coordinator。其中 PlanFragment 由 PlanNode 组成,能被分发到单独的节点上执行,每个 PlanNode 表示一个关系操作和对其执行优化需要的信息。
  • 获取元数据与数据地址。Query Coordinator 从 MySQL 元数据库中获取元数据(即查询需要用到哪些数据),从 HDFS 的名称节点中获取数据地址(即数据被保存到哪个数据节点上),从而得到存储这个查询相关数据的所有数据节点。
  • 分发查询任务。Query Coordinator 初始化相应的 Impalad 上的任务,即把查询任务分配给所有存储这个查询相关数据的数据节点。
  • 汇聚结果。Query Executor 通过流式交换中间输出,并由 Query Coordinator 汇聚来自各个 Impalad 的结果。
  • 返回结果。Query Coordinator 把汇总后的结果返回给 CLI 客户端。

5.4 Impala 与 Hive的异同

数据存储:使用相同的存储数据池,都支持把数据存储于HDFS, HBase。

元数据:两者使用相同的元数据

SQL解释处理:比较相似都是通过词法分析生成执行计划

执行计划
Hive: 依赖于MapReduce执行框架,执行计划分成map->shuffle->reduce->map->shuffle->reduce…的模型。如果一个Query会被编译成多轮MapReduce,则会有更多的写中间结果。由于MapReduce执行框架本身的特点,过多的中间过程会增加整个Query的执行时间。
Impala: 把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad执行查询,而不用像Hive那样把它组合成管道型的map->reduce模式,以此保证Impala有更好的并发性和避免不必要的中间sort与shuffle。

数据流
Hive: 采用的方式,每一个计算节点计算完成后将数据主动推给后续节点
Impala: 采用的方式,后续节点通过getNext主动向前面节点要数据,以此方式数据可以流式的返回给客户端,且只要有1条数据被处理完,就可以立即展现出来,而不用等到全部处理完成,更符合SQL交互式查询使用。

内存使用:
Hive: 在执行过程中如果内存放不下所有数据,则会使用外存,以保证Query能顺序执行完。每一轮MapReduce结束,中间结果也会写入HDFS中,同样由于MapReduce执行架构的特性,shuffle过程也会有写本地磁盘的操作。
Impala: 在遇到内存放不下数据时,当前版本1.0.1是直接返回错误,而不会利用外存,以后版本应该会进行改进。这使用得Impala目前处理Query会受到一定的限制,最好还是与Hive配合使用。Impala在多个阶段之间利用网络传输数据,在执行过程不会有写磁盘的操作(insert除外)。

调度:
Hive: 任务调度依赖于Hadoop的调度策略
Impala: 调度由自己完成,目前只有一种调度器simple-schedule,它会尽量满足数据的局部性,扫描数据的进程尽量靠近数据本身所在的物理机器。调度器目前还比较简单,在SimpleScheduler::GetBackend中可以看到,现在还没有考虑负载,网络IO状况等因素进行调度。但目前Impala已经有对执行过程的性能统计分析,应该以后版本会利用这些统计信息进行调度吧。

容错:
Hive: 依赖于Hadoop的容错能力
Impala: 在查询过程中,没有容错逻辑,如果在执行过程中发生故障,则直接返回错误(这与Impala的设计有关,因为Impala定位于实时查询,一次查询失败,再查一次就好了,再查一次的成本很低)。但从整体来看,Impala是能很好的容错,所有的Impalad是对等的结构,用户可以向任何一个Impalad提交查询,如果一个Impalad失效,其上正在运行的所有Query都将失败,但用户可以重新提交查询由其它Impalad代替执行,不会影响服务。对于State Store目前只有一个,但当State Store失效,也不会影响服务,每个Impalad都缓存了State Store的信息,只是不能再更新集群状态,有可能会把执行任务分配给已经失效的Impalad执行,导致本次Query失败。

适用面:
Hive: 复杂的批处理查询任务,数据转换任务
Impala:实时数据分析,因为不支持UDF,能处理的问题域有一定的限制,与Hive配合使用,对Hive的结果数据集进行实时分析。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: