Hive的特点、架构、数据模型等介绍

Hive的定义:

Hive是建立在 Hadoop 上的数据仓库基础构架

提供了一系列的工具,可以用来进行数据提取转化加载(ETL)是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制

 

Hive的特点:

Hive 不适合那些需要低延迟的应用,例如,联机事务处理(OLTP),设计模式遵循联机分析处理(OLAP

Hive 不提供实时查询和基于行级的数据更新操作

Hive 的最佳使用场合是大数据集的批处理作业

Hive提供了一套类SQL的语言(HiveQL or HQL)用于执行查询类SQL 的查询方式将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行

Hive 的数据存储在Hadoop 兼容的文件系统(例如,Amazon S3、HDFS)

Hive 不支持对数据的改写和添加,所有的数据都是在加载的时候确定的

hive数据加载过程采用“读时模式”,传统的关系型数据库在进行数据加载时,必须验证数据格式是否符合表字段定义,如果不符合,数据将无法插入至数据库表中,即采用“写时模式”。

 

Hive的架构(五部分):

用户接口(User Interface)主要有三个:Web UI 、command line和HiveHD Insight(在Windows服务器)

元数据:Hive 将元数据metadata存储在数据库中,如 mysql、derby元数据包含:表的信息、databases信息、表的列信息、字段类型信息和HDFS mapping(映射);

HQL处理引擎(HiveQL Process Engine):HiveQL类似于SQL,用于查询转移的模式信息。它是对MapReduce程序的传统方法的替换之一

执行引擎(Execution Engine):HQL处理引擎和MapReduce的连接部分是Hive执行引擎。执行引擎处理查询,并生成与MapReduce结果相同的结果

HDFS or HBASE:Hadoop分布式文件系统或HBASE是将数据存储到文件系统中的数据存储技术。

 

hive的数据类型:

基本数据类型

    tinyint --- byte(1)

    smalint --- short(2)

    int --- int(4)   

    bigint --- long(8)   

    boolean --- boolean  true或false

    float --- float(4)

    double --- double(8)

    string --- string(zhangsanzhangsan

    timestamp --- timestamp 时间戳,精确到纳秒

    binary --- byte[]  字节数组         

集合数据类型

        struct --- object 对象类型,可以通过字段名.元素名来访问  struct('name','age')

        map --- map 一组键值对的元组  map('name','zhangsan','age','23')

        array --- array 数组  array('name','age')

        union       组合  

案例:

    创建表:

        create table studentinfo(

name string,

favorite array<string>,

course map<string,float>,

address struct<city:string,street:string>

);

查询语法:

select s.name,s.favorite[0],s.course["english"],s.address.city from studentinfo s;   

 

hive的数据存储:

1、Hive 没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。

默认hive通过^A(\001)、^B(\002)、^C(\003)分别对列、(array和struct)、map进行匹配;创建表时,可以通过以下命令进行设置:

    row format delimited fields terminated by '\001'

    collection items terminated by '\002'

    map keys terminated by '\003'

    lines terminated by '\n'

2、Hive 中所有的数据都存储在 HDFS 中,Hive 中包含以下数据模型:管理或内部表(Table),外部表(External Table),分区(Partition),桶(Bucket)

3、hive为创建的数据库生成了相对应的目录(*.db),目录在{hive.metastore.warehouse.dir}属性下,同时,数据库中的管理Table将以目录中的子目录进行存储;default默认数据库除外!Table在加载数据的过程中,实际数据会被移动到数据仓库目录中删除表时,表中的数据和元数据将会被同时删除。

例如,一个数据库hive下的一个表 pvs,它在 HDFS 中的路径为:/wh/hive.db/pvs,

其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的数据仓库的目录

4、External Table 指向已经在 HDFS 中存在的数据,可以创建 Partition。

create external table if not exists stocks (

exchange1 string,symbol string,ymd string,price_open float,price_high float,price_low float,price_close float,volume int,price_adj_close float)

[partitioned by ]

row format delimited fields terminated by ',' location '/data/stocks';

5、在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中。

例如:pvs 表中包含 ds 和 city 两个 Partition,

则对应于 ds = 20090801, ctry = US 的 HDFS 子目录为:/wh/hive.db/pvs/ds=20090801/ctry=US;

对应于 ds = 20090801, ctry = CA 的 HDFS 子目录为;/wh/hive.db/pvs/ds=20090801/ctry=CA

6、hive中的Buckets和hadoop中的reduce个数相同。 对指定列计算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件。

例如:将 user 列分散至 32 个 bucket,首先对 user 列的值计算 hash,

对应 hash 值为 0 的 HDFS 目录为:/wh/hive.db/pvs/ds=20090801/ctry=US/part-00000;

hash 值为 20 的 HDFS 目录为:/wh/hive.db/pvs/ds=20090801/ctry=US/part-00020               

 

Hive工作原理(Hive 和Hadoop之间的工作流程):

Hive的特点、架构、数据模型等介绍

 

1.执行查询操作:Execute Query

hive接口将查询发送给driver以执行

2.获取计划任务:Get Plan

Driver借助查询编译器解析查询,检查语法和查询计划或查询需求

3.获取元数据信息:Get Metadata

编译器将元数据请求发送到Metastore(任何数据库)。

4.发送元数据:Send Metadata

Metastore将元数据作为对编译器的响应发送出去。

5.发送计划任务:Send Plan

编译器检查需求并将计划重新发送给Driver。到目前为止,查询的解析和编译已经完成

6.执行计划任务:Execute Plan

Driver将执行计划发送到执行引擎。

7.执行Job任务:Execute Job

在内部,执行任务的过程是MapReduce Job。执行引擎将Job发送到ResourceManager, ResourceManager位于Name节点中,并将job分配给datanode中的NodeManager。在这里,查询执行MapReduce任务.

7.1.元数据操作:Metadata Ops

在执行的同时,执行引擎可以使用Metastore执行元数据操作。

8.拉取结果集:Fetch Result

执行引擎将从datanode上获取结果集;

9.发送结果集至driver:Send Results

执行引擎将这些结果值发送给Driver。

10.driver将result发送至interface:Send Results

Driver将结果发送到Hive接口