Hive入门、Hive vs SQL以及Hive的体系结构

Hive的入门以及安装

在之前的文章中介绍了MapReduce以及如何使用MapReduce实现一个WordCount的Demo。虽然是一个很简单的功能,但是不难发现,还是会去写很多的与MapReduce的代码。但是像这种MapReduce代码需要懂的程序员出才能搞定,而且后期维护比较困难。这个时候就不难发现有很多的问题存在:

1)对存在HDFS的文件或者HBase中的表进行查询时,需要手工写一大堆的MapReduce代码,只是为了实现一个查询的功能。

2)对于统计任务,只能由懂MapReduce的程序员才能实现,所以学习成本也是相对较高的。

3)耗时耗力,完全浪费了很多精力,没有将精力有效的释放出来。

在这个基础之上,Hive就随之诞生,它的本质其实还是MapReduce,是对MapReduce的封装后的一个更高一层应用,可以减少MapReduce的编写。而且最重要的是,Hive 是基于Hadoop的数据仓库工具,而在数据仓库中,SQL是最常用的分析工具,所以Hive的本质也是一个SQL解析引擎,也就是说我们可以通过直接写SQL的方式就能快速实现开发的目的,剩余的就交给Hive进行将SQL语句转译成MapReduce Job就完成我们的需求而,大大的节约的时间成本和精力。

Hive虽然也是使用SQL,但是有很多的概念和真正意义上的数据库还是有很大的差别。在Hive中的表只是一个纯逻辑的表,只是表的定义,即表的元数据,其本质就是Hadoop的目录或者文件。

Hadoop目录下的Hive数据库表

Hive表的元数据也是不会存在本地,而是依赖于Mysql,因此在使用Hive节点上需要安装Mysql,而且需要修改Hive的配置文件将其指向对应Mysql的数据库中。

通过Mysql连接客户端你可以清楚的看到,在Hive使用起来之后,会在你配置的数据库中创建一些关于表的元数据,包括表的字段、分区、格式、参数等内容。

表格的属性

 

每个表的字段信息

通过上面的图片,我们也可以了解到在Hive中实现了元数据与数据存储分离的效果,而且Hive可以直接将结构化的数据文件映射成一张数据库表。

当然对于Hive这种数据仓库工具,它有一个缺点:就是不支持对数据的改写和删除,即读多写少。 不建议进行频繁的修改或者删除操作,底层涉及到对海量数据进行处理,以免直接影响整个集群的性能。

下图十分形象说明了引入Hive实现wordCount和写原生的MapReduce两者之间的差别,很明显使用Hive的效率大幅度的提升。explode函数的是起到将行转列的作用,collect_list是起到列转行的作用。

 

Hive的安装过程十分简单,这里只说明一些注意的安装事项:

① 下载apache-hive-1.2.2-bin.tar.gz,并解压,在conf目录下,创建hive-site.xml配置文件。

② 配置环境变量:vim ~/.bashrc

③ 因为Hive需要Mysql的支持,即需要mysql连接的jar包,将mysql-connector-java-版本号-bin.jar拷贝到HIVE_HOME的lib目录下,以支持MySQL操作。最好在Mysql创建一个Hive的角色,并授相应的权限。

 

Hive SQL VS SQL

Hive SQL和SQL之间的不同之处如上图所示。首先数据存储的问题,SQL是存储在本地的文件系统中,HQL则是可以存储在HDFS、Hbase中。其次HQL具有可扩展性,即可以自己手动实现UDF、UDAF、UDTF的功能。

UDF——直接应用与select语句,常见的例如大小写转换。可以理解为一对一的关系。

UDAF——多对一的情况,常见于wordCount,Group by的阶段。

UDTF——一对多的情况

后面会写到如何自己手动实现一个UDF、UDAF或者UDTF的功能。

另外对于数据检查的读时模式与写时模式的理解:

读时模式是在Hive读取的时候才会进行数据的检查,进行字段解析和schema(数据表达式)、元数据、数据存储位置等内容,最大的优点就是加载数据非常迅速,在写的过程中并不需要解析数据。

写时模式就是在读取数据的时候进行优化,相应的检查例如索引、压缩、数据一致性、字段检查等等都在写的时候实现,因此造成写的速度非常慢。

Hive与传统的数关系型数据库相比,其实通过上面的对比,也可以分析出来,与之具有以下的不同:

1)存储文件的系统不同,Hive使用的是Hadoop的HDFS,而关系型数据库则是服务器本地的文件系统。

2)Hive使用的计算模型是MapReduce,而关系数据库则是自己设计的计算模型。

3)关系数据库实时性很强,Hive则是为海量数据做挖掘设计的,实时性很差。

4)Hive很容易扩展自己的存储能力和计算能力,这个是继承自Hadoop,而关系数据库在这个方面弱一点。

虽然Hive SQL和SQL各有各的不同之处,但是也都有自己的应用场景。例如SQL适用于实时查询的业务(粗粒度)的设计,而Hive SQL则是进行数据挖掘或者涉及到数据仓库就会使用。

Hive体系结构

体系架构图一

主要包括三个部分——客户端、Driver、MetaStore。

Cli:客户端,可以与Hive进行交互式执行SQL,直接与Drvier进行交互,就是我们常用的类似于CMD窗口的界面。

JDBC/ODBC:Hive提供了JDBC的驱动,作为Java的API,JDBC是通过Thift Server来接入,然后发送给DriverHive提供的Cli工具。

MetaStore:是一个独立的关系型数据中保存表模式和其他系统元数据。

Driver:通过驱动模块对需求的计算进行优化,然后按照指定的步骤执行(通常启动过个MR任务执行)

通过UI界面或者或者黑白窗口提交一个Client,进行任务的执行。首先UI会和Driver进行一个访问,访问过后进行一个编译(Compiler),编译的时候需要查询元数据(Metastore),如果没有元数据就会直接进行报错,比如select某一列,如果表中这一列的字段不存在,则应该直接报错列不存在。查询元数据其实会查询Mysql中的数据,通过Mysql查询到我们需要的数据之后,会交给Execution Engine,由它具体某一系列操作。当然也不是它直接执行,而是向JobTracker提交任务,JobTracker对资源管理和任务调度,即分发提交的任务到Map节点和Reduce节点。在Map和Reduce生成对应的Operation Tree,这里是需要数据的,之前的这些都是逻辑,所以需要从HDFS上获取数据,首先会和NameNode进行通讯,获取存有数据的DataNode,然后返回数据到Map和Reduce进行执行(执行流程如下图所示)。

 

猜你喜欢

转载自blog.csdn.net/qq_35363507/article/details/116739308