Hive架构介绍

目录

hive的架构

hive数据模型

Metastore(元数据)

motivation(动机)

metadata objects(元数据对象)

Metastore架构

metastore接口

Hive查询语言

Compiler

Optimizer

Hive API


 

原文地址:https://cwiki.apache.org/confluence/display/Hive/Design#Design-HiveArchitecture

 

hive的架构

       如图所示,hive主要包括如下模块:

  • UI

       用于向系统提交查询请求的接口。

  • Driver(驱动)

       该组件用于接收查询请求,它实现了会话操纵句柄,并且提供了基于jdbc/odbc的执行接口。

  • Compiler(编译器)

       该模块用来解析请求,对不同请求模块和语句进行语法分析,最后借助元数据中的表和分区信息来生成执行计划。

  • Metastore(元数据存储)

       该模块用于存储表和分区的结构信息,包括列和列类型信息的数据,序列化和反序列化程序,这些程序用于读取hdfs文件数据。

  • Execution-engine(执行引擎)

       该组件运行编译器生成的执行计划,注意该执行计划是一个有向无环图。执行引擎会解析执行计划的依赖关系,并且在合适的系统组件中执行。

Hive架构介绍_第1张图片

       上图展示了系统的典型流程,其步骤如下:

       1.ui调用驱动的执行接口;

       2.驱动会为该请求创建一个会话句柄,并且将该请求发送至编译器以生成执行计划;

       3/4. 编译器从元存储中获取必要的元数据,这些元数据可以检查请求树的表达式类型,并且可以预测无用的分区并过滤;

       5. 编译器生成的计划是一个有向无环图,每个阶段是一个map/reduce任务,或者是一个元数据操作,或者是一个hdfs上的操作。对于map/reduce阶段,该计划包含一个map 操作树和reduce操作树。

       6/6.1/6.2/6.3. 执行引擎将这些执行计划发送给相应的组件执行。在每个任务中(map/reduce)中,反序列化程序和中间输出用于读取hdfs文件行数据,并且这些数据会被传输给相关联的执行树。一旦输出完成,它会通过序列化器写入临时hdfs文件中(适用于不需要reduce的map任务)。临时文件主要用于后续的mr任务。对于dml操作来说,最终的临时文件会被移动到表指定的位置。这种方案可以确保系统不会读取到脏数据(hdfs中的文件重命名是一种原子操作)。

       7/8/9. 对于请求来说,临时文件的内容会被执行引擎读取并返回给驱动。

hive数据模型

  • Tables(表)

       和关系型数据库中的表十分类似,可以进行过滤,投影,连接或者是求并集等操作。不同的是,表中的数据是在hdfs中进行存储的。hive也支持外表的概念,外表可以建立在hdfs中已存在的文件或者文件夹之上,只是需要向外表提供文件的位置。表中的行数据同关系型数据库中的概念是类似的,也是由特定类型的列组成的。

  • Partitions(分区)

       每个表都支持一个或者多个分区,用于决定数据的存储方式。例如,一个拥有日期列ds的数据表T,它会将数据存储在

/ds=的目录中。基于查询的预测分析,我们可以过滤部分的分区,比如一个查询有这样一个条件: T.ds = '2008-09-01' ,那么这时候只需要从hdfs的文件夹“
/ds=2008-09-01/ ”下面进行查询。

  • Buckets(桶)

       在分区中的数据可以根据列的hash值被分配到不同的桶中,每个桶是位于分区目录下特定的一个文件。桶使得系统能够更好地根据样本数据评估查询。同时,桶可以基于样本数据对查询做更好的评估。(??怎么评估??)

       除了支持一些基本类型(整形,浮点型,字符串,日期和布尔类型)之外,hive也支持数组和字典。此外,用户也可以根据基本类型、集合或者自定义类型进行其他类型的定义。具有类型的系统和SerDe和对象检查接口是强关联的,用户可以实现这些接口,并且使用相应的检查器来创建他们自己的SerDe来操作hdfs中的文件。当涉及到其他数据格式和更丰富的类型,这两类接口提供了必要的钩子来扩展hive的功能。内置的检查器(比如ListObjectInspector,StructObjectInspector和MapObjectInspector)可以以扩展的方式实现更丰富的类型。Hive还提供了例如索引和大小函数,可以更好地创建map和array类型。小数点操作用于解析嵌套的类型,比如a.b.c=1用于检查a中的b的c是否等于1。

 

Metastore(元数据)

motivation(动机)

       元数据提供了两种比较重要但经常被忽视的特性:数据抽象和数据发现。如果没有数据抽象,使用者在提交请求的时候必须提供数据格式的信息,抽取和加载信息等。在hive中,这些信息在表创建的时候就会存储,并且可以在以后重复查询使用,在这一点上和传统的数据仓库系统非常类似。第二种特性即数据发现,它可以使得用户发现仓库中的特定数据和数据之间的相关性。我们可以利用这些元数据来开发一些相关工具,来曝光相关的数据。hive通过提供元数据仓库来提供这两种特性,该仓库和hive查询系统是强关联的,这使得数据和元数据可以同步更新。

metadata objects(元数据对象)

  • 数据库--是表的域名,在未来它可以作为一个控制单元存在。其中“default”库是专门为那些没有提供库名的表设置的。
  • 表--表的元数据包括列的列表,拥有者,存储以及Serde信息等。他也可以容纳用户指定的kv数据。存储信息包括基础数据的位置,文件的输入输出格式以及桶信息。Serde元数据包括序列化和反序列化的类的实现,以及实现这些类的其他资源等。所有这些信息都可以在表创建的时候就提供。
  • 分区--每个分区有自己的列,Serde和存储信息。

Metastore架构

       Metastore是一个一数据库或者备份存储为对象的存储。数据库是使用一种称作orm解决方案实现的。使用关系型数据库来存储这种数据的好处是为元数据的查询性提供了很好的实现。使用单独的数据存储而不是hdfs也会带来一些坏处,比如同步性和可伸缩行等。另外,hdfs并不能支持对文件进行实时的更新。

       Metastore可以使用多种方式进行配置:远程或者是本地内嵌的。如果使用远程方式,metastore就是一个thrift服务,这种模式对于非java的客户端是有用的。使用内嵌模式,hive客户端直接通过jdbc链接metastore,这种模式可以让我们维护较少的系统。

metastore接口

metastore通过提供thrift接口来帮助用户查询hive元数据信息。

 

Hive查询语言

       HiveQL是一种类似于sql共hive使用的查询语言。它在表创建,数据加载和查询表等方面非常类似于sql。HiveQL同时允许用户创建他们自己的mr脚本。这些脚本可以用任何基于行的流接口语言来编写,从标准输入读取并且写到标准输出。这种灵活性是以降低性能为代价来实现的,带来的好处是行可以和字符串相互转换。但是,我们发现用户因为可以随意的选择他们的语言,也就不会非常在意性能。HiveQL的另一种特性是它支持同时插入多表,用户可以基于相同的输入,使用一个HiveQL来实现多种查询。Hive会优化这些查询以共享输入数据,并最终使得查询的推吐量提升了好几个数量级。更多关于hiveql语言的语法参看语言手册。

 

Compiler

  • Parser--将查询字符串转变为分析树表示。
  • Semantic Analyser--用于将分析树转换为内部查询,该表现形式仍然是基于块而不是运算树。同时,该步会同时验证列名,同时类似于*的扩展也会执行。同时,类型检查和任何的隐式转换都会在该步执行。如果表是一个分区表,那么该表相关的表达式都会收收集起来,以便后续过滤分区。如果查询指定了采样数据,那么也会收集采样数据以便稍后使用。
  • Logic Plan Generator--用于将内部查询表达式转换为逻辑计划,该计划由一个运算树组成。有些运算符是关系代数运算符,例如filte、join等。但是有些运算符是hive使用的,用于将该计划转换成一系列的map-reduce任务。其中一种运算符是reduceSink操作符,会出现在map-reduce中。此步骤还包括优化程序,用于转化该计划以提升性能。其中部分转换包括:将一系连接操作转换为一次并行的连接,对groupby操作的map端执行部分聚合。分两个阶段执行group-by操作,以避免reducer端的数据倾斜问题。每个运算符包含一个可序列化对象的描述符。
  • Query Plan Generator--将逻辑计划转换为一系列的map-reduce任务。操作树是递归遍历的,它会被分解为一系列的map-reduce可序列化的任务,这些任务后续会被提交到hadoop的map-reduce框架中。reduceSink操作符位于map-reduce的边界,其描述符包含reduce键。reduceSink中的reducation键用作map-reduce中的reduction。如果指定了查询,则计划由所需的示例/分区组成。计划被序列化并写入文件。

Optimizer

       optimizer会执行更多的计划转换,它是一个不断发展的组件。截至2011年,它是rules-based,并且只执行了以下操作:列过滤和谓词下推。但是,基础设施不断优化,其他的优化工作也在进行,比如map端的连接也在优化。(Hive 0.11添加了几个连接优化。)

       可以将优化器增强为基于成本的优化器。

 

Hive API

在Hive api overview提供了各种公开的api。

 

你可能感兴趣的:(hive,hive,架构,partition,bucket)