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的目录或者文件。
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进行执行(执行流程如下图所示)。