学习Hadoop——Hive 介绍

Hive简介

      1.由Facebook 开源,最初用于解决海量结构化的日志数据统计问题

       ETL(extraction-Transformation-Loading)工具

     2.构建在Hadoop 之上的数据仓库

       数据计算使用MR,数据存储使用HDFS

     3.Hive 定义了一种类型SQL查询语句—HQL,类似于SQL,但不完全相同

     4.通常用于进行高离线数据处理(采用Mapreduce)

     5.可认为是一个HQL->MR的解释翻译器

Hive 类似的开源系统—stinger 

Tez 是一个DAG的计算框架,在Mapreduce 基础上发展起来的,目前是Apache 顶级项目,下一代Hive 被称为‘stinger’ ,其底层得计算引擎由Tez 替换为Mapreduce。Tez相比于Mapreduce 具有众多优势:

(1).提供众多算子供用户使用

(2).将多个作业合并为一个作业,减少磁盘I/O读写

(3).充分利用内存资源

为什么使用Hive?

1.简单容易上手(提供了类SQL查询语言HQL)

2.为超大数据集设计计算/扩展能力HBase Schema 可以有多个Table ,MR为计算引擎,HDFS为存储系统

   统一元数据管理(Hcalalog)——可与Pig,Presto 等共享

Hive 体系概况

  1.Hive 架构

   使用Hive可以存储,查询和分析保存在Hadoop 中的大规模数据集,Hive 定义了简单的类SQL查询语言,称为HQL,它允许熟悉SQL的用户进行数据的查询,同时该语言也允许熟悉Mapreduce 开发者的用户编写自定义的RM函数来处理内建的Mapper和Reducer 无法完成的复杂的数据分析工作。

   Hive的结构可以分为4个部分:

   1.用户接口:包括CLI,Client,WUI

   2.元数据存储:通常是存储在关系型数据库如MYSQL,Derby中

   3.解释器,编译器,优化器,执行器

   4.Hadoop:使用HDFS 存储数据,利用Mapreduce 进行计算

   

    其中用户接口主要包括CLI,Client和WUI。最常用的是CLI, CLI 启动的时候,会同时启动一个Hive 副本。Client 是Hive 的客户端,用户可以连接Hive Server 。在启动Client过程中,需要指出Hive Server 所运行节点的位置信息。WUI支持通过浏览器方式访问Hive。

   Hive 将元数据存储在数据库中,如MYsql和Derby。Hive 中的元数据包括表的名称,表字段和区分及其属性,表的属性(是否为外部表等),以及表数据所在目录等。

解释器,编译器,优化器用来完成HQL查询语句从语法分析,词法分析,编译,优化以及查询计划的生成工作,其生成的查询计划存储在HDFS中,并在随后由Mapreduce 调用执行。

Hive 的数据存储在HDFS 中,大部分的查询由Mapreduce 调用完成。


2.Hive 和Hadoop 的关系

  Hive 构建在Hadoop之上

  1.HQL中对于查询语句的解释,优化,生成查询计划由Hive 完成的

  2.所有数据都是存储在Hadoop中

  3.查询计划都被转化为Mapreduce 任务后在Hadoop 中执行,(但有些查询没有MR任务,比如select * from table)

  4.Hadoop 和Hive 都是用UTF-8编码

3.Hive 和普通关系型数据库比较

Hive 和RDBMS 比较
对比项HiveRDBMS
查询语言HQLSQL
数据存储HDFS

Raw Device or Local FS 

or ASM

索引
执行MapreduceExcutor
执行延迟
处理数据规模较小

  由于SQL被广泛应用于数据仓库系统中,针对Hive 的特性设计的类SQL 的查询语言HQL,可以使用SQL开发的开发者能够快速方便的在Hive上进行开发。

Hive建立在Hadoop 之上,所有的Hive 数据都是存储在HDFS中,而RDBMS数据库则将数据保存在裸机,操作系统或者特定的文件系统中

Hive 中没有定义专门的数据格式,数据格式可以由用户自行定义,用户定义数据格式时需要指定三个属性:列分隔符,行分隔符以及读取文件数据的方法。(Hive 中默认有三个文件格式:TextFile,SequenceFile 以及RCFile).由于在加载数据过程中不需要从用户数据格式到Hive 定义的数据格式的转换,因此Hive 在加载的过程中,不会对数据本身进行任何修改,而是将数据内容复制或者移动到相应的HDFS目录中。但是在关系型数据库中,不同的数据库有着不同的存储引擎,这些存储引擎定义了各个专业的数据格式。因此,数据库加载数据的过程会比较耗时。

由于Hive 是针对数据仓库应用设计的,而数据仓库的特点是读多写少,因此Hive 不支持对数据的改写和添加,所有的数据都是在加载时确定好的。而关系型数据库中的数据通常是需要经常频繁修改。因此可以使用INSERT INTO ... VALUES 添加数据,使用UPDATE ...SET 修改数据。

Hive 在加载数据过程中不会对数据进行任何处理,甚至不会对数据进行扫描,因此也没有对数据中的某些key 建立索引。Hive 要访问数据中满足条件的定值时,需要完整扫描整个数据集,因此访问延迟较高。由于Mapreduce 的引入,Hive 可以进行访问数据集,因此即使没有索引,对于大数据的访问,Hive 任然可以体现出整体性能优势。而在关系型数据库中,通常会针对一个或者几个列建立索引,因此对于少量的特定条件的数据访问,关系型数据库可以实现较高的效率,较低得延时。Hive 由于数据的访问延迟较高,就决定了不适合在线数据查询。

Hive 大多数查询的执行通过Hadoop 提供的Mapreduce 来实现,而关系型数据库通常使用各自的专有执行引擎。

Hive 在查询数据的时候,由于没有索引,就需要扫描整个表,因此延迟较高。另外一个导致Hive 执行延迟高的原因是Mapreduce 框架,由于Mapreduce 本身就具有较高的延迟,因此在利用Mapreduce 执行Hive 查询时,较高的延迟就变得必然了。相对而言,关系型数据库的执行延迟较低,这个低是以数据规模较小为前提,当数据规模大到超过数据库的处理能力的时候,这个时候Hive 的并行计算优势就体现了。

由于Hive 是建立在Hadoop 之上,因此Hive 的可扩展性和Hadoop 的可扩展性是一致的,而关系型数据库由于ACID 语义的严格限制,其扩展型非常有限。

Hive 支持大规模的数据;数据库支持数据规模较小。

Hive 元数据库

  Hive 将元数据存储在RDBMS 中,一般常用的有Mysql 和Derby。Hive 的元数据默认使用Derby 作为DB,Derby作为轻量级DB,它在开发,测试过程中使用比较方便。

MYSQL和PostgreSQL是两个比较常用的开源数据库系统,多用来替换Derby

Hive 创建表的过程应该应该是:

  1.解释用户提交Hive 语句,对其进行解析,分解为表,字段,分区等Hive 对象。

  2.解析到信息构建对应的表,字段,分区表等对象,从SEQUENCE_TABLE 中构建对象的新ID,并与构建对象信息(名称,类型)一同通过DAO 方法写入到与元数据表中去。

实际上常见RDBMS 都是通过这种方法组织的,典型的如PostgreSQL,其系统表中和Hive 元数据一样暴露了这些id 信息(oid,cid 等),而oracle 等商业化的系统则隐藏了这些功能。

Hive 的数据存储

  Hive 没有专门数据存储格式,也没有为数据建立索引,用户可以自由组织Hive 中的表,只需要在创建表的时候告诉Hive 数据库的列分隔符和行分隔符即可,然后Hive 就可以解析数据了。Hive 中所有数据都存储在HDFS中,Hive 包含的数据模型由Table,External Table,Partition,Bucket。

Hive中Table 和关系型数据库中的Table 在概念上的类似的,Hive 中每一个Table 都有一个相应的目录存储其数据。例如,一个fruit ,它在HDFS中的路径为/warehouse/fruit, 其中,warehouse是在Hive-site.xml 中${Hive.matastore.warehouse.dir}指定的数据仓库目录,所有的Table 数据(不包括External Table)都保存在这个目录中。

Partition 对应于关系型数据库中Partition 列的索引,但是Hive 中Partition 的组织方式和数据库中很大不同。在Hive中,表的一个Partition 对应于表下一个目录,所有的Partition 数据都存储在对应目录里。

Buckets 对指定列计算hash,根据hash 值分组数据,目的是为了并行处理,每一个Bucket 对应一个文件。

External Table 是指向已经在HDFS 中存在的数据,为它创建Partition 。External Table 和Table 在元数据的组织上是相同的,而实际数据的存储则存在较大的差异。

Table 在加载数据的过程中,实际数据会被移动到数据仓库目录中,之后对数据访问将会直接在数据仓库目录中完成。删除表时,表中数据和元数据将会被同时删除。

External Table 的加载数据和创建表要同时完成(CREATE EXTERNAL  TABLE .... LOCATION ),实际的数据时存储在LOCATION 后面指定的HDFS 路径中,而不会移动到数据仓库目录中。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值