Hive是基于Hadoop的数据仓库工具,可对存储在HDFS上的文件中的数据进行数据整理、特殊查询和分析处理,提供了相似于SQL语言的查询语言-HiveSQL,可经过HQL语句实现简单的MR统计,Hive将HQL语句转换成MR任务进行执行。前端
1-1 数据仓库概念算法
数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反应历史变化(Time Variant)的数据集合,用于支持管理决策。sql
数据仓库体系结构一般含四个层次:数据源、数据存储和管理、数据服务、数据应用。
数据源:是数据仓库的数据来源,含外部数据、现有业务系统和文档资料等;数据集成:完成数据的抽取、清洗、转换和加载任务,数据源中的数据采用ETL(Extract-Transform-Load)工具以固定的周期加载到数据仓库中。数据存储和管理:此层次主要涉及对数据的存储和管理,含数据仓库、数据集市、数据仓库检测、运行与维护工具和元数据管理等。数据服务:为前端和应用提供数据服务,可直接从数据仓库中获取数据供前端应用使用,也可经过OLAP(OnLine Analytical Processing,联机分析处理)服务器为前端应用提供负责的数据服务。数据应用:此层次直接面向用户,含数据查询工具、自由报表工具、数据分析工具、数据挖掘工具和各种应用系统。
数据库
1-2 传统数据仓库的问题
1)没法知足快速增加的海量数据存储需求,传统数据仓库基于关系型数据库,横向扩展性较差,纵向扩展有限。编程
2)没法处理不一样类型的数据,传统数据仓库只能存储结构化数据,企业业务发展,数据源的格式愈来愈丰富。服务器
3)传统数据仓库创建在关系型数据仓库之上,计算和处理能力不足,当数据量达到TB级后基本没法得到好的性能。
架构
1-3 Hiveapp
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与传统数据库的对比
当前企业中部署的大数据分析平台,除Hadoop的基本组件HDFS和MR外,还结合使用Hive、Pig、Hbase、Mahout,从而知足不一样业务场景需求。
上图是企业中一种常见的大数据分析平台部署框架 ,在这种部署架构中:
1)Hive和Pig用于报表中心,Hive用于分析报表,Pig用于报表中数据的转换工做。
2)HBase用于在线业务,HDFS不支持随机读写操做,而HBase正是为此开发,可较好地支持实时访问数据。
3)Mahout提供一些可扩展的机器学习领域的经典算法实现,用于建立商务智能(BI)应用程序。
下图显示Hive的主要组成模块、Hive如何与Hadoop交互工做、以及从外部访问Hive的几种典型方式。
Hive主要由如下三个模块组成:
1)用户接口模块,含CLI、HWI、JDBC、Thrift Server等,用来实现对Hive的访问。
CLI是Hive自带的命令行界面;HWI是Hive的一个简单网页界面;JDBC、ODBC以及Thrift Server可向用户提供进行编程的接口,其中Thrift Server是基于Thrift软件框架开发的,提供Hive的RPC通讯接口。
2)驱动模块(Driver),含编译器、优化器、执行器等,负责把HiveQL语句转换成一系列MR做业,全部命令和查询都会进入驱动模块,经过该模块的解析变异,对计算过程进行优化,而后按照指定的步骤执行。
3)元数据存储模块(Metastore),是一个独立的关系型数据库,一般与MySQL数据库链接后建立的一个MySQL实例,也能够是Hive自带的Derby数据库实例。此模块主要保存表模式和其余系统元数据,如表的名称、表的列及其属性、表的分区及其属性、表的属性、表中数据所在位置信息等。
假设链接(join)的两个表分别是用户表User(uid,name)和订单表Order(uid,orderid),具体的SQL命令:
select name,orderid from User u join Order o on u.uid=o.uid;
上图描述了链接操做转换为MapReduce操做任务的具体执行过程。
首先,在Map阶段,
1)User表以uid为key,以name和表的标记位(这里User的标记位记为1)为value,进行Map操做,把表中记录转换生成一系列KV对的形式。好比,User表中记录(1,Lily)转换为键值对(1,<1,Lily>),其中第一个“1”是uid的值,第二个“1”是表User的标记位,用来标示这个键值对来自User表;
2)一样,Order表以uid为key,以orderid和表的标记位(这里表Order的标记位记为2)为值进行Map操做,把表中的记录转换生成一系列KV对的形式;
3)接着,在Shuffle阶段,把User表和Order表生成的KV对按键值进行Hash,而后传送给对应的Reduce机器执行。好比KV对(1,<1,Lily>)、(1,<2,101>)、(1,<2,102>)传送到同一台Reduce机器上。当Reduce机器接收到这些KV对时,还需按表的标记位对这些键值对进行排序,以优化链接操做;
4)最后,在Reduce阶段,对同一台Reduce机器上的键值对,根据“值”(value)中的表标记位,对来自表User和Order的数据进行笛卡尔积链接操做,以生成最终的结果。好比键值对(1,<1,Lily>)与键值对(1,<2,101>)、(1,<2,102>)的链接结果是(Lily,101)、(Lily,102)。
3-1-2 用MR实现分组操做
假设分数表Score(rank, level),具备rank(排名)和level(级别)两个属性,须要进行一个分组(Group By)操做,功能是把表Score的不一样片断按照rank和level的组合值进行合并,并计算不一样的组合值有几条记录。SQL语句命令以下:
select rank,level,count(*) as value from score group by rank,level;
上图描述分组操做转化为MapReduce任务的具体执行过程。
1)首先,在Map阶段,对表Score进行Map操做,生成一系列KV对,其键为<rank, level>,值为“拥有该<rank, level>组合值的记录的条数”。好比,Score表的第一片断中有两条记录(A,1),因此进行Map操做后,转化为键值对(<A,1>,2);
2)接着在Shuffle阶段,对Score表生成的键值对,按照“键”的值进行Hash,而后根据Hash结果传送给对应的Reduce机器去执行。好比,键值对(<A,1>,2)、(<A,1>,1)传送到同一台Reduce机器上,键值对(<B,2>,1)传送另外一Reduce机器上。而后,Reduce机器对接收到的这些键值对,按“键”的值进行排序;
3)在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任务进行执行的详细过程。
1)由驱动模块中的编译器–Antlr语言识别工具,对用户输入的SQL语句进行词法和语法解析,将HQL语句转换成抽象语法树(AST Tree)的形式;
2)遍历抽象语法树,转化成QueryBlock查询单元。由于AST结构复杂,不方便直接翻译成MR算法程序。其中QueryBlock是一条最基本的SQL语法组成单元,包括输入源、计算过程、和输入三个部分;
3)遍历QueryBlock,生成OperatorTree(操做树),OperatorTree由不少逻辑操做符组成,如TableScanOperator、SelectOperator、FilterOperator、JoinOperator、GroupByOperator和ReduceSinkOperator等。这些逻辑操做符可在Map、Reduce阶段完成某一特定操做;
3)Hive驱动模块中的逻辑优化器对OperatorTree进行优化,变换OperatorTree的形式,合并多余的操做符,减小MR任务数、以及Shuffle阶段的数据量;遍历优化后的OperatorTree,根据OperatorTree中的逻辑操做符生成须要执行的MR任务;启动
4)Hive驱动模块中的物理优化器,对生成的MR任务进行优化,生成最终的MR任务执行计划;
5)最后,有Hive驱动模块中的执行器,对最终的MR任务执行输出。
Hive驱动模块中的执行器执行最终的MR任务时,Hive自己不会生成MR算法程序。它经过一个表示“Job执行计划”的XML文件,来驱动内置的、原生的Mapper和Reducer模块。Hive经过和JobTracker通讯来初始化MR任务,而不需直接部署在JobTracker所在管理节点上执行。一般在大型集群中,会有专门的网关机来部署Hive工具,这些网关机的做用主要是远程操做和管理节点上的JobTracker通讯来执行任务。Hive要处理的数据文件常存储在HDFS上,HDFS由名称节点(NameNode)来管理。
JobTracker/TaskTracker NameNode/DataNode
在实际应用中,Hive也暴露出不稳定的问题,在极少数状况下,会出现端口不响应或进程丢失问题。Hive HA(High Availablity)能够解决这类问题。
在Hive HA中,在Hadoop集群上构建的数据仓库是由多个Hive实例进行管理的,这些Hive实例被归入到一个资源池中,由HAProxy提供统一的对外接口。客户端的查询请求,首先访问HAProxy,由HAProxy对访问请求进行转发。HAProxy收到请求后,会轮询资源池中可用的Hive实例,执行逻辑可用性测试。
1)若是某个Hive实例逻辑可用,就会把客户端的访问请求转发到Hive实例上;
2)若是某个实例不可用,就把它放入黑名单,并继续从资源池中取出下一个Hive实例进行逻辑可用性测试。
3)对于黑名单中的Hive,Hive HA会每隔一段时间进行统一处理,首先尝试重启该Hive实例,若是重启成功,就再次把它放入资源池中。
因为HAProxy提供统一的对外访问接口,所以,对于程序开发人员来讲,可把它当作一台超强“Hive”。