Hive 初识

HIve是什么?

Hive是一个基于Hadoop的数据仓库工具,提供了方便查询和管理海量数据的能力,它可以把结构化的数据文件转化为一张数据库表,并存储在HDFS上(也可以存储在本地磁盘上),用户可以通过自定义的SQL语句来查询存储在HDFS上的数据。具有高延迟性,适合用于海量数据的统计分析。

它是怎么通过SQL查询HDFS上的数据的?

通过SQL查询HDFS上的数据,需要将SQL转为相应的MR程序来执行计算。它是怎么将SQL转化为MR成的呢?

客户端通过接口(JDBC、ODBC、Thrift)提交SQL语句给Hive,Hive服务端接收到SQL后,会先对SQL语句进行解析,解析时会从Metastore中获取相关的元数据信息(包括表的名称、表的列、分区、索引、是否为外部表、表的数据所在目录等)做语法、语义检查,优化等,生成执行计划,然后根据执行计划创建相应的Job,并把这些Job提交给JobTracker执行,在提交Job时,还要提取元数据信息关联的具体数据,这些元数据信息也会被发送到namenode节点。然后JobTracker将Job拆分为多个Task来执行,并将执行结果返回或写入HDFS中。 

它的数据是怎么存储的?

Hive中的数据都是存储在HDFS上的,没有固定的存储格式,用户可以根据数据源的格式来自定义Hive表中数据的存储格式,只需在创建表时指定行的分隔符和列的分隔符即可,如果有复杂类型的集合(array、map、strut),还需要为每个集合类型指定相应的分隔符。这样,在查询时,Hive就可以根据每个列的存储格式来解析数据。

Hive的数据模型主要有:数据库(Database)、表(Table)、分区(Partition)、桶(Bucket)

Database:在Hive中,Database本质上就是就一个文件目录或一个命名空间,用于组织表。对于一个多团队和多用户的大集群来说,可以避免不同数据库之间表名的冲突问题。

Table:Hive的Table是Database目录下的一个子目录,一个Table对应一个目录,表中的数据都存放在该目录下。表分为内部表(Managed Table)和外部表(External Table),两者的区别为外部表不受Hive管理,即外部表的数据不会被存储到数据仓库的目录下,在删除表时,对于外部表只是删除与其相关的元数据信息,而表的数据不会被删除,对于内部表,表数据和相关元数据都会被删除。

PatItion:每一个的Partition为表目录下的一个子目录,每个分区的数据放在其分区目录下。

Bucket:就是对指定列计算hash值,根据hash值切分数据,每一个Bucket对应一个文件。使用Bucket可以提高并行查询的能力。将 user 列分散至 32 个 bucket,首先对 user 列的值计算 hash,对应 hash 值为 0 的 HDFS 目录为:/wh/pvs/ds=20090801/ctry=US/part-00000;hash 值为 20 的 HDFS 目录为:/wh/pvs/ds=20090801/ctry=US/part-00020。

Hive的体系结构

用户接口:CLI、Thrift、HWI

CLI:是一个和Hive通过命令行交互的接口。

HWI(Hive Web Interface):Web接口,可以通过浏览器访问Hive。

Thrift:提供了可以从不同编程语言编写的客户端访问Hive的接口,支持身份验证和多用户并发访问。

Metastore

用于存储Hive表的元数据信息,包括表的名称、列名、分区、索引、是否为外部表,以及表的数据所在目录等。默认它是和Hive Server运行在同一JVM中,并包含一个嵌套的Derby数据库。但是在同一时刻,只能有一个Hive会话访问Derby数据库,所以通常是使用MySQL数据库来存储元数据信息。

驱动(Driver):编译器、优化器、执行器

用户提交SQL给HIve,由Driver负责解析SQL,在解析时会加载相关的元数据信息,生成执行计划,然后生成Job交给Hadoop运行,然后Driver将结果返回给用户。

编译器:Hive的核心,负责SQL语句的语法、语义解析,生成查询计划。

1、语义解析器(ParseDriver),将查询字符串转换成解析树表达式;

2、语法解析器(SemanticAnalyzer),将解析树转换成基于语句块的内部查询表达式;

3、逻辑计划生成器(Logical Plan Generator),将内部查询表达式转换为逻辑计划,这些计划由逻辑操作树组成,操作符是Hive的最小处理单元,每个操作符处理代表一      道HDFS操作或者是MR作业;

4、查询计划生成器(QueryPlan Generator),将逻辑计划转化成物理计划(MR Job)。

生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行

优化器:优化器是一个演化组件,当前它的规则是:列修剪,谓词下压。

执行器:编译器将操作树切分成一个Job链(DAG),执行器会顺序执行其中所有的Job;如果Task链不存在依赖关系,可以采用并发执行的方式进行Job的执行。

Hadoop

Hive的数据是存储在HDFS上的,表的一个分区对应表目录下的一个子目录,每个桶(Bucket)对应表目录下的一个文件。

Hive和数据库的对比:

两者的使用场景不同:Hive适用于离线的数据分析,而数据库适用于在线联机的事务处理。
1、使用的查询语言:Hive使用了一个类似Sql的查询语言Hql
2、数据存储的位置:Hive是建立在Hadoop之上的,它的数据都是存储在HDFS上的。而数据库的数据则是存储在本地文件系统中,或是块设备中。
3、数据格式:Hive并没有定义严格的数据格式,在数据加载的过程中,也不对数据格式校验,只是将数据内容复制或移动到相应的HDFS目录中。而数据库,不同的数据库则有不同的数据存储引擎,存储的数据格式也不相同,且数据是按严格的格式存储的,所以,在加载数据的过程会比较耗时。
4、数据的更新:Hive是针对数据仓库设计的,一般是读多写少,所以Hive并不支持数据的更新操作,所有的数据在加载时就确定好的。而数据库中的数据则是经常需要更新的。
5、索引、事务:由于Hive在加载时不对数据做任何处理,也不会对任何字段建立索引,但由于MarReduce的并行访问数据,因此即使没有索引,对于大数据量的访问,Hive还是可以体现出其优势的。
6、执行:Hive大多数的查询时通过Hadoop的MapReduce来实现的,而数据库则是由其执行引擎执行的。
7、延迟性:Hive具有较高的延迟性,而数据库的延迟较低。

HIve优缺点

优点:Hive作为一个基于Hadoop的数据仓库工具,提供了简单的SQL查询功能,简化了MapReduce的编写操作,适用于大数据集的批处理作业,例如,网络日志分析。

缺点:Hive的HQL表达能力有限,对于较复杂的运算HQL不易表达;另外,Hive具有高延迟性,不适合那些低延迟的应用,如:OLTP系统。它不提供实时的查询和基于行级的数据更新操作,




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值