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(‘zhangsan’或”zhangsan”)
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之间的工作流程):
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接口