目录
9.1 数据仓库的概念
传统数据仓库面临的挑战
9.2 HIVE简介
Hive适用于数据仓库的特点
采用批处理方式处理海量数据
提供适合数据仓库操作的工具
Hadoop生态系统中Hive与其他部分的关系
Hive依赖于HDFS存储数据
Hive依赖于MapReduce处理数据
Pig可以作为Hive的部分替代工具
HBase提供数据的实时访问
Hive与传统数据库的对比分析
Hive在企业大数据分析平台中的应用
Hive系统架构
Hive组成模块
Hive对外用户访问接口模块
驱动模块(Driver)
元数据存储模块(Metastore)
Hive HA基本原理
9.3 SQL语句转换成MapReduce作业的基本原理
join的实现原理
group by的实现原理
Hive查询的具体执行过程
9.4 Impla
Imapa系统架构
Impalad
State Store
CLI
Impla查询执行过程
Impla与Hive的比较
Impla与Hive的不同点
Impala与Hive的相同点
数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支撑管理决策。企业基于数据仓库的分析结果来做出相关的经营决策。
数据仓库和传统数据库相比有个本质的区别:相对稳定。数据仓库当中的数据不会频繁发生变化或者根本不发生变化,数据源当中的数据抽取、转换、加载到数据仓库中后大多数情况下不会发生变更。数据仓库中存储了大量的历史数据。而传统数据库只能保留某一个时刻的状态信息。
数据仓库底层借助传统的关系型数据库进行存储。无法满足快速增长的海量数据存储需求;无法有效处理不同类型的数据(只能支持结构化数据);计算和处理能力不足(无法水平拓展,纵向扩展有限)。
Hive是一个构建于Hadoop顶层的数据仓库工具。
传统的数据仓库既是数据存储产品也是数据处理分析产品,能同时支持数据的存储和处理分析;但Hive本身不存储和处理数据,某种程度上可以看作是用户编程接口。
依赖分布式文件系统HDFS存储数据;
依赖分布式并行计算模型MapReduce处理数据;
定义了简单的类SQL 查询语言——HiveQL;
用户可以通过编写的HiveQL语句运行MapReduce任务;
是一个可以提供有效、合理、直观组织和使用数据的模型。
Hive需要把HiveQL语句转换成MapReduce任务进行运行; 数据仓库存储的是静态数据,对静态数据的分析适合采用批处理方式,不需要快速响应给出结果,而且数据本身也不会频繁变化。
Hive本身提供了一系列对数据进行提取、转化、加载(ETL)的工具,可以存储、查询和分析存储在Hadoop中的大规模数据; 非常适合数据仓库应用程序维护海量数据、对数据进行挖掘、形成意见和报告等。
HDFS作为高可靠性的底层存储,用来存储海量数据。
MapReduce对这些海量数据进行处理,实现高性能计算,用HiveQL语句编写的处理逻辑最终均要转化为MapReduce任务来运行。
Pig是一种数据流式语言处理框架,适合用于Hadoop和MapReduce平台查询半结构化数据集。常用于ETL过程的一部分,即将外部数据装载到Hadoop集群中,然后转换为用户期待的数据格式。
Pig与Hive应用场景的区别:Pig属于轻量级分析工具,适合做实时交互式分析,主要用于数据仓库的ETL环节;Hive主要用于数据仓库海量数据的批处理分析。
HBase一个面向列、分布式、可伸缩的数据库,它可以提供数据的实时访问功能,而Hive只能处理静态数据,主要是BI报表数据,所以HBase与Hive的功能是互补的,它实现了Hive不能提供功能。
Hive在很多方面和传统的关系数据库类似,但是它的底层依赖的是HDFS和MapReduce,所以在很多方面又有别于传统数据库。
Hive与传统数据库的区别主要体现在以下几个方面:
(1)数据插入:在传统数据库中同时支持导入单条数据和批量数据 ,而Hive中仅支持批量导入数据,因为Hive主要用来支持大规模数据集上的数据仓库应用程序的运行,常见操作是全表扫描,所以单条插入功能对Hive并不实用。
(2)数据更新:更新是传统数据库中很重要的特性,Hive不支持数据更新。Hive是一个数据仓库工具,而数据仓库中存放的是静态数据 ,所以Hive不支持对数据进行更新。
(3)索引:索引也是传统数据库中很重要的特性,Hive在hive 0.7版本后已经可以支持索引了。但Hive不像传统的关系型数据库那样有键的概念,它只提供有限的索引功能,使用户可以在某些列上创建索引来加速一些查询操作,Hive中给一个表创建的索引数据被保存在另外的表中。
(4)分区:传统的数据库提供分区功能来改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率。Hive也支持分区功能,Hive表组织成分区的形式,根据分区列的值对表进行粗略的划分,使用分区可以加快数据的查询速度。
(5)执行延迟:因为Hive构建于HDFS与MapReduce上,所以对比传统数据库来说Hive的延迟比较高,传统的SQL语句的延迟少于一秒 ,而HiveQL语句的延迟会达到分钟级。
(6)扩展性:传统关系数据库很难横向扩展,纵向扩展的空间也很 有限。相反Hive的开发环境是基于集群的,所以具有较好的可扩展性。
Hive在Facebook公司的应用
随着Facebook网站使用量的增加, 原有的基于Oracle关系型数据仓库已经无法满足激增的业务需求,Facebook公司开发构建在Hadoop集群上的数据仓库Hive,此时的数据处理过程描述如下:
1. Web服务器及内部服务(如搜索后台)产生日志数据;
2. Scribe服务器把几百个到上千个日志数据集存放在几个到几十个Filers(网络文件服务器)上;
3. 网络文件服务器上的大部分日志文件被复制存放在HDFS系统 中。并且维度数据也会每天从内部的MySQL数据库上复制到 这个HDFS系统中;
4. Hive为HDFS收集所有数据创建一个数据仓库,用户可以通过编写HiveQL语言创建各种概要信息和报表以及数据执行的历史分析,同时内部的MySQL数据库也可以从中获取处理后的数据;
5. 把需要实时联机访问的数据存放在Oracle RAC上。
CLI、HWI、JDBC、ODBC、Thrift Server等。
CLI:Hive自带的一个命令行界面;
HWI(Hive Web Interface):Hive的一个简单网页界面;
JDBC、ODBC:开放数据库连接接口,支持很多应用开发。
Thrift Server:基于Thrift架构开发的接口,允许外界通过该接口实现对Hive数据仓库的RPC调用。
包括编译器、优化器、执行器等。负责将HiveQL语句转换成一系列MapReduce作业。所有命令和查询都会进入到驱动模块,通过该模块对输入进行解析编译,对需求的计算进行优化,然后按照指定的步骤进行执行。
是一个独立的关系型数据库。通常是与MySQL数据库连接后创建的一个MySQL实例,也可以是 Hive自带的derby数据库实例。元数据存储模块中主要保存表模式和其他系统元数据,如表的名称、表的列及其属性、表的分区及其属性、表的属性、表中数据所在位置信息等。
Hive High Availability(高可用性Hive解决方案)
在Hadoop集群上构建的数据仓库将若干个Hive实例纳入一个资源池,由HAProxy提供一个接口,对Hive实例行访问,然后HAProxy依次询问Hive实例是否可用,执行逻辑可用性测试,如果通过逻辑可用性测试,则将外部请求转发给该Hive实例;如果测试失败,则将Hive实例加入黑名单,询问下一个Hive实例。每间隔一定的周期,HA Proxy会重新对列入黑名单的实例进行统一处理。由Hive处理后得到的各种数据信息,或存放在MySQL数据库中,或直接以报表的形式展现。
1)编写一个Map处理逻辑;
2)Map处理逻辑输入关系数据库的表;
3)输入的每行记录通过Map对它进行转换成键值对的形式,表user中记录(uid,name)映射为键值对(uid,<1,name>), 表order中记录(uid, orderid)映射为键值对(uid,<2,orderid>)。
4)在Shuffle、Sort阶段, (uid,<1,name>)和(uid,<2,orderid>)按键uid的值进行哈希,然后传送给对应的Reduce机器执行,并在该机器上按表的标记位对这些键值对进行排序按照键值对的key发送给不同的Reduce处理;
5)在Reduce阶段,对同一台Reduce机器上的键值对,根据表标记位对来自不同表的数据进行笛卡尔积连接操作,以生成最终的连接结果。
1)在Map阶段,表score中记录(rank,level)映射为键值对(
2)在Shuffle、Sort阶段, (
3)在Reduce阶段,对Reduce机器上的这些键值对,把具有相同键的所有count(rank,level)值进行累加生成最终结果。 (,2)+(,1)变为(A,1,3),(,1)变为(B,2,1)。
当用户向Hive输入一段命令或查询时,Hive需要与Hadoop交互工作来完成该操作。
首先驱动模块接收该命令或查询编译器;对该命令或查询进行编译解析;由优化器对该命令或查询进行优化计算;最后由执行器执行该命令或查询。
执行器通常的任务是启动一个或多个MapReduce任务,有时也不需要启动MapReduce任务,像执行包含*的操作(如select * from 表)时。
首先用户通过命令行CLI或其他Hive访问工具,向Hive输入一段命令或查询。
1)由Hive驱动模块中的编译器——Antlr语言识别工具,对用户输入的SQL语言进行词法和语法解析,将SQL语句转化为抽象语法树(AST Tree)的形式。
2)对该抽象语法树进行遍历,进一步转化成QueryBlock查询单元。因为抽象语法树的结构仍很复杂,不方便直接翻译为MapReduce算法程序,所以Hive把抽象语法树进一步转化为QueryBlock,其中QueryBlock是一条最基本的SQL语法组成单元,包括输入源、计算过程和输出三部分。
3)再对QueryBlock进行遍历,生成执行操作树(OperatorTree。 其中,OperatorTree由很多逻辑操作符组成,如TableScanOperator,SelectOperator,FilterOperator,JoinOperator,GroupByOperator,ReduceSinkOperator等。这些逻辑操作符可以在Map阶段和Reduce阶段完成某一特定操作。
4)通过Hive驱动模块中的逻辑优化器对OperatorTree进行优化。变换OperatorTree的形式,来合并多余的操作符,以减少MapReduce任务数量以及Shuffle阶段的数据量。
5)对优化后的OperatorTree进行遍历,根据OperatorTree中的逻 辑操作符生成需要执行的MapReduce任务。
6)启动Hive驱动模块中的物理优化器,对生成MapReduce任务进行优化,生成最终的MapReduce任务执行计划。
7)最后,由Hive驱动模块中的执行器,对最终的MapReduce任务进行执行。
说明:当启动MapReduce程序时,Hive本身是不会生成MapReduce算法程序的。需要通过一个表示“job执行计划”的XML文件驱动执行内置的、原生的Mapper和Reducer模块。Hive通过和JobTracker通信来初始化MapReduce任务,不必直接部署在JobTracker所在的管理节点上执行。通常在大型集群上,有专门的网关机来部署Hive工具。网关机的作用主要是远程操作和管理节点上的JobTracker通信,来执行任务。数据文件通常存储在HDFS上,HDFS由NameNode节点管理。
除了用CLI和HWI工具来访问Hive外,还可以采用以下几种典型外部访问工具:
1、Karmasphere是由Karmasphere公司发布的一个商业产品。可以直接访问Hadoop里面结构化和非结构化的数据,可以运用SQL及其他语言, 可以用于Ad Hoc查询和进一步的分析;还为开发人员提供了一种图形化环境,可以在里面开发自定义算法,为应用程序和可重复的生产流程创建实用的数据集。
2、Hue是由Cloudera公司提供的一个开源项目。是运营和开发Hadoop应用的图形化用户界面; Hue程序被整合到一个类似桌面的环境,以web程序的形式发布,对于单独的用户来说不需要额外的安装。
3、Qubole公司提供了“Hive即服务”的方式。托管在AWS平台,这样用户在分析存储在亚马逊S3云中的数据集时,就无需了解Hadoop系统管理;提供的Hadoop服务能够根据用户的工作负载动态调整服务器资源配置,实现随需计算。
Impala是由Cloudera公司开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase上的PB级大数据。Impala最开始是参照Dremel系统进行设计的,Impala的目的不在于替换现有的 MapReduce工具,而是提供一个统一的平台用于实时查询。
Impla的运行需要依赖于Hive的元数据,与Hive类似,Impala也可以直接与HDFS和HBase进行交互。 Hive底层执行使用的是MapReduce,所以主要用于处理长时间运行的批处理任务,例如批量提取、转化、加载类型的任务。Impala通过与商用并行关系数据库中类似的分布式查询引擎,可以直接从HDFS或者HBase中用SQL语句查询数据,从而大大降低了延迟(与Hive相比),主要用于实时查询。 Impala和Hive采用相同的SQL语法、ODBC驱动程序和用户接口。
Impala主要由Impalad(负责具体的相关查询任务),State Store(负责元数据管理和状态信息维护)和CLI(用户访问接口)三部分组成。
Impalad是Impala驻留在不同数据节点上的一个进程(计算向数据靠拢)。负责协调客户端提交的查询的执行,给其他impalad分配任务以及收集其他impalad的执行结果进行汇总;执行其他impalad给其分配的任务,主要就是对本地HDFS和HBase里的部分数据进行操作。
包含三个模块:Query Planner(查询计划器);Query Coordinator(查询协调器);Query Exec Engine(查询执行引擎),与HDFS的数据节点(HDFS DN)运行在同一节点上完全分布运行在 MPP(大规模并行处理系统)架构。
每个查询提交给系统后,State Store会创建一个statestored进程,跟踪集群中的Impalad的健康状态及位置信息用于查询调度;创建多个线程来处理Impalad的注册订阅和与各类Impalad保持心跳连接当State Store离线后,Impalad一旦发现State Store处于离线时,就会进入recovery 模式,并进行反复注册;当State Store重新加入集群后,自动恢复正常,更新缓存数据。
给用户提供查询使用的命令行工具;提供Hue、JDBC及ODBC的使用接口。
Impala采用与Hive相同的元数据、SQL语法、ODBC驱动程序和用户接口,这样做的主要原因是在使用同一公司Hadoop产品时,批处理和实时查询的平台是统 一的;
Impala中表的元数据存储采用的是Hive的元数据存储方式;State Store负责收集分布在集群中各个impalad进程的资源信息,用于查询的调度;
HDFS名称节点(HDFS NN)记录了每个文件中各个块所在的数据节点的位置信息。
当用户提交查询前,Impala先创建一个负责协调客户端提交的查询的Impalad进程,该进程会向Impala State Store提交注册订阅信息,State Store会创建一个statestored进程,statestored进程通过创建多个线程来处理Impalad的注册订阅信息。
1)用户通过CLI客户端提交一个查询到impalad进程,Impalad的Query Planner对SQL语句进行解析,生成解析树;然后,Planner把这个查询的解析树变成若干分片PlanFragment(一个大的查询拆分成若干子查询分发到不同节点上执行),发送到Query Coordinator(协调不同的节点查询不同分片汇总结果)。其中,PlanFragment由PlanNode组成的,能被分发到单独的节点上原子执行,每个PlanNode表示一个关系操作和对其执行优化需要的信息。
2)Coordinator通过从HDFS的名称节点中获取数据地址,从MySQL元数据库中获取元数据,以得到存储这个查询相关数据的所有数据节点。
3)Coordinator初始化相应impalad上的任务执行,即把查询任务分配给所有存储这个查询相关数据的数据节点。
4)Query Executor通过流式交换中间输出,并由Query Coordinator 汇聚来自各个impalad的结果。
5)Coordinator把汇总后的结果返回给CLI客户端。
1)Hive适合于长时间的批处理查询分析,而Impala适合于实时交互式SQL查询。
2)Hive依赖于MapReduce计算框架,执行计划组合成管道型的MapReduce任务模式进行执行,Impala把执行计划表现为一棵完整的执行计划树,可以更自然地分发执行计划到各个Impalad执行查询。
3)Hive在执行过程中,如果内存放不下所有数据,则会使用外存,以保证查询能顺序执行完成,而Impala在遇到内存放不下数据时,不会利用外存,所以Impala目前处理查询时会受到一定的限制。
1)Hive与Impala使用相同的存储数据池都支持把数据存储于HDFS和HBase中,其中HDFS支持存储TEXT、RCFILE、PARQUET、AVRO、ETC格式数据,HBase存储表中记录。
2)Hive与Impala使用相同的元数据。
3)Hive与Impala中对SQL的解释处理比较相似,都是通过词法分析生成执行计划。
Impala的目的不在于替换现有的MapReduce,弥补Hive做实时分析时延迟大的不足,把Hive与Impala组合使用效果最佳。先使用Hive进行数据转换处理,之后再使用Impala在Hive处理后的结果数据集上进行快速的数据分析。