大数据系统——Hive-A Warehousing Solution Over a Map-Reduce Framework论文分享

1.背景

这篇文章本身就不长,总共三页半,作者来自Facebook数据基础架构团队。下面正式介绍。
传统的数据集存储方案成本过高,Hadoop则可以作为替代方案:在大规模廉价的商用机器上进行大规模数据存储。Hadoop上可以运行MapReduce,但是mapreduce编程模型的级别非常低,难以维护和重用。
大数据系统——Hive-A Warehousing Solution Over a Map-Reduce Framework论文分享_第1张图片
Hive是一种基于Hadoop构建的开源数据仓库解决方案。Hive支持类似SQL的声明性语言查询–HiveQL,它们被编译为在Hadoop上执行的map-reduce作业。此外,HiveQL支持将自定义map-reduce脚本插入查询中。Hive还包括一个类型系统,支持包含基本类型的表,数组和映射的集合,以及相同的嵌套组合。底层IO库可以扩展为以自定义格式查询数据。Hive还包括一个包含模式和统计信息的系统目录Hive-Metastore,它在数据探索和查询优化中很有用。在Facebook中,Hive仓库包含数千个表,其中包含超过700 TB的数据,并且被100多个用户广泛用于报告和临时分析。

2.数据模型

Hive的数据组织为:

  1. Tables(表):类似于关系型数据库中的表。每个表都有一个相应的HDFS目录。HDFS文件系统目录类似于Linux,以“/”为根目录。表中的数据被序列化并存储在该目录中的文件中。用户可以将表与基础数据的序列化格式相关联。Hive提供内置的序列化格式,主要是利用压缩和延迟反序列化(lazy de-serialization)。用户还可以通过定义用Java编写自定义序列化和反序列化方法(称为SerDe‘s)来添加对新数据格式的支持。每个表的序列化格式存储在系统目录中,并在查询编译和执行期间由Hive自动使用。 Hive还支持存储在HDFS,NFS或本地目录中的外部表。
  2. 分区(partitions):每个表可以有一个或多个分区,用于确定表目录的子目录中的数据分布。假设表T的数据在目录/ wh / T中。如果T有列ds和ctry,则具有特定ds值20090101和ctry值US的数据将存储在目录/ wh / T / ds = 20090101 / ctry = US中的文件中。
  3. 存储桶(buckets):每个分区中的数据可以依次根据表中列的hash划分为存储桶。每个存储桶都作为文件存储在分区目录中。桶排序即为:buckets sort。

Hive支持原始列类型(整数,浮点数,泛型字符串,日期和布尔值)和可嵌套集合类型:数组和map。用户还可以通过编程方式定义自己的类型。

3.查询语言

Hive提供了一种类似SQL的查询语言,称为HiveQL,它支持的select,project,join,aggregate,union all和sub-queries。 HiveQL支持数据定义(DDL)语句,以创建具有特定序列化格式以及分区和分段列的表。用户可以从外部源加载数据,并分别通过加载(load)和插入(insert)数据操作(DML)语句将查询结果插入到Hive表中。 HiveQL当前不支持更新和删除现有表中的行。HiveQL支持多表插入,用户可以使用单个HiveQL语句对同一输入数据执行多个查询。Hive通过共享输入数据的扫描来优化这些查询。HiveQL非常易于扩展,它支持用Java实现的用户定义列转换(user defined column transformation,UDF)和聚合(user defined aggregation,UDAF)功能。此外,用户可以使用简单的基于行的流接口嵌入以任何语言编写的自定义map-reduce脚本,从标准输入读取行并将行写出到标准输出。这种灵活性需要将行转换为字符串。

4.hive架构

图中展示了hive架构的主要组件及其与hadoop的交互。
大数据系统——Hive-A Warehousing Solution Over a Map-Reduce Framework论文分享_第2张图片
主要有以下组件:
外部接口(External Interfaces):Hive提供命令行接口CLI和web UI 和程序语言接口JDBC和ODBC。
Thrift Server:Hive有一个非常简单的客户端API来执行HiveQL语句。Thrift是跨语言服务的框架,其中用一种语言(如Java)编写的服务器也可以支持其他语言的客户端。使用不同语言生成的Thrift Hive客户端用于构建公共驱动程序,如JDBC(java),ODBC(C ++)以及用php,perl,python等编写的脚本驱动程序。
Metastore:是系统目录。其他组件都与Metastore交互。
Driver:driver在编译,优化和执行期间管理HiveQL语句的生命周期。在从thrift服务器或其他接口接收HiveQL语句时,它会创建一个会话句柄,稍后用于跟踪执行时间,输出行数等统计信息。
Compiler:compiler在收到HiveQL语句时由driver调用。编译器将此语句转换为由mapreduce作业的DAG组成的计划。
Execution Engine:driver以拓扑顺序将各个map-reduce作业从DAG提交到执行引擎。Hive目前使用Hadoop作为其执行引擎。

  1. Metastore:Metastore是系统目录,其中包含有关存储在Hive中的表的元数据。这个元数据在表创建期间指定,每次在HiveQL中引用表时重新引用。
    Metastore包含以下对象:
    Database:是表的名称空间。数据库’default’用于用户没有提供数据库名称时使用。
    Table:表的元数据包含列及其类型,所有者,存储和SerDe信息的列表。它还可以包含任何用户提供的键和值数据;此工具可用于存储将来的表统计信息。存储信息包括基础文件系统中表格数据的位置,数据格式和分段信息。SerDe元数据包括序列化器和反序列化器方法的实现类以及该实现所需的任何支持信息。
    Partition:每个分区都有自己的列和存储信息。这可以在将来用于支持Hive仓库中的模式演变。
    Metastore存储系统应该进行随机读取和修改优化,像HDFS这样的文件系统不适用,因为它顺序扫描而非随机访问。因此,Metastore使用传统的关系数据库(如MySQL,Oracle)或文件系统(如本地,NFS,AFS)而不使用HDFS。
  2. Compiler:驱动程序使用HiveQL字符串调用编译器,该字符串可以是DDL,DML或查询语句之一。编译器将字符串转换为计划。该计划仅包含DDL语句中的元数据操作,以及LOAD语句中的HDFS操作。 对于插入语句和查询,该计划由map-reduce作业的有向环图(DAG)组成。
    Parser(解析器):Parser将查询字符串转化为解析树
    Semantic Analyzer(语义分析器):将解析树转换为基于块的内部查询表示。从Metastore中检索输入表的模式信息。使用此信息,验证列名称,扩展select *并进行类型检查,包括添加隐式类型转换。
    Logical plan Generator(逻辑计划生成器):将内部查询表示转换为逻辑计划,逻辑计划由逻辑运算符树组成。
    Optimizer(优化器):传入逻辑计划,通过多种方式重写:如,将共享连接键的多个连接组合到单个多向连接中,从而组合一个map-reduce作业。
    Physcial Plan Generator(实际规划生成器):将逻辑计划转换为实际执行计划,由mapreduce作业组成。它为逻辑计划中的每个标记操作符创建了一个新的map-reduce作业: repartition和union all。然后,它将标记之间包含的逻辑计划的部分分发给map-reduce作业的映射器和缩减器。

下图为一个执行的plan:
大数据系统——Hive-A Warehousing Solution Over a Map-Reduce Framework论文分享_第3张图片

5.未来工作

Hive构建于hadoop之上。独特的底层存储和执行引擎使得hive必须按照hadoop的特点进行规划。HiveQL当前只接受SQL的一个子集作为有效查询,未来会努力使HiveQL包含更多SQL语法。Hive目前只有一个简单的基于规则的优化器,只有少量简单的规则,计划构建基于成本的优化器和自适应优化技术,以提出更有效的计划。同时正在探索柱状存储和更智能的数据放置,以提高扫描性能。
下一篇:zookeeper:wait-free coordination for Internet-scale System

你可能感兴趣的:(数据仓库,sql,大数据,hive)