Hive简介:
Hive 是基于 Hadoop 构建的一套数据仓库分析系统,它提供了丰富的 SQL 查询方式来分析存储在 Hadoop 分布式文件系统中的数据, 可以将结构化的数据文件映射为一张数据库表,并提供完整的 SQL 查询功能,可以将 SQL 语句转换为 MapReduce 任务进行运行,通过自己的 SQL 去 查询分析需要的内容,这套 SQL 简称 Hive SQL。其底层实现是:将SQL语句转换为MapRecuce程序任务执行对应的查询功能(Yarn集群启动)。
为什么要使用hive?
用户只需要在Hive中建立表和结构化数据之间的映射,就可以是实现各类复杂的数据查询统计功能,而这些功能通过编写MapReduce实现起来比较复杂,编写效率也不高。况且编写MR程序门槛也高,得有一定的编程功底。
实现同样的查询统计功能,Hive只要简单的SQL语句(通过Hive框架转换为对应的MapReduce程序,并对其优化,最后提交Hadoop运行。),而编写MapReduce程序往往需要很长时间才能实现,若经验不足,编写的程序运行效率往往不高。
Hive的使用场景:
Hive 的查询任务往往转换为MR程序提交Hadoop集群运行,那就不能指望快速响应,所以不适合那些需要低延迟的应用:联机事务处理(OLTP),web应用中查询模块的后台实现(往往要求秒级响应)。
Hive往往做为数据仓库管理的工具,数据仓库中的数据往往很少进行更改,或者不更改,可以用来做联机分析处理(OLAP);
Hive往往用来处理GB,TB,PB级别的数据离线分析查询,所以查询结果在20分钟左右响应结果是正常的。
Hive 体系结构如下:
客户端接口:
有基于命令行的:CLI (单用户模式,多用户模式);
通过Hive提供的 JAVA JDBC/ODBC API通过 Thrift提供的服务(Thrift Server)提交查询任务;
通过HIVE提供的web项目管理监控HIVE(下载对应程序拷贝到HIVE里):Web UI
元数据库
用来管理Hive中数据库,表及对应的HDFS映射目录等等信息;(往往用MySQL作为元数据信息管理)
Driver
是Hive客户端和Hadoop集群之间工作的桥梁纽带。Hive客户端的请求通过Driver组件转换为最终的提交Hadoop集群运行的MR任务。
包括:解析器,编译器,MR任务优化器,执行器(辑执行计划转换成物理执行计划,如:生成MR,Spark任务等)
Hive架构:
Hive的体系结构可以分为以下几部分:
1、用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是CLI,Cli启动的时候,会同时启动一个Hive副本。Client是Hive的客户端,用户连接至Hive Server。在启动 Client模式的时候,需要指出Hive Server所在节点,并且在该节点启动Hive Server。 WUI是通过浏览器访问Hive。
2、元数据:Metastore
元数据包括:表名、表所属的数据库(默认是default)、表的拥有者、列/分区字段、表的类型(是否是外部表)、表的数据所在目录等;
默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore。Hive将元数据存储在数据库中,如mysql、derby。
3、驱动器:Driver
(1)解析器(SQL Parser):将SQL字符转换成抽象语法树AST,这一步一般使用都是第三方工具库完成,比如antlr,对AST进行语法分析,比如表是否存在,字段是否存在,SQL语句是否有误
(2)编译器(Physical Plan):将AST编译生成逻辑执行计划
(3)优化器(Query Optimizer):对逻辑执行计划进行优化
(4)执行器(Execution):把逻辑执行计划转换成可以运行的物理计划,对于Hive来说,就是MR/Spark
4、Hive的数据存储在HDFS中,大部分的查询、计算由MapReduce完成(包含*的查询,比如select * from tbl不会生成MapRedcue任务)。
执行流程:
MapReduce 开发人员可以把自己写的 Mapper 和 Reducer 作为插件支持 Hive 做更复杂的数据分析。 它与关系型数据库的 SQL 略有不同,但支持了绝大多数的语句(如 DDL、DML)以及常见的聚合函数、连接查询、条件查询等操作。
Hive 不适合用于联机(online) 事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。Hive 的特点是可 伸缩(在Hadoop 的集群上动态的添加设备),可扩展、容错、输入格式的松散耦合。Hive 的入口是DRIVER ,执行的 SQL 语句首先提交到 DRIVER 驱动,然后调用 COMPILER 解释驱动, 最终解释成 MapReduce 任务执行,最后将结果返回。
hive安装配置:
1.拷贝下载包到Hadoop集群中的任意一台服务器上进行解压。
如:tar -zxvf apache-hive-2.1.1-bin.tar.gz
mv apache-hive-2.1.1-bin hive
2.配置Hive,创建修改hive-site.xml文件
cd /opt/mysoft/hive/conf
mv hive-env.sh.template hive-env.sh
vi hive-env.sh //修改启动配置项:
//若当前机器上已经配置了JAVA_HOME环境变量,则可以省略(一般都配置过了)
export JAVA_HOME=/opt/mysoft/jdk
export HADOOP_HOME=/opt/mysoft/hadoop
export HIVE_CONF_DIR=/opt/mysoft/hive/conf
export HIVE_AUX_JARS_PATH=/opt/mysoft/hive/bin
3.进入到hive/conf目录下,创建hive-site.xml配置文件(连接mysql数据,前提要先安装mysql)
configuration>
<property>
<name> javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost:3306/myHive?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>Username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>123456</value>
<description>password to use against metastore database</description>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
</configuration>
4.把mysql驱动jar包(mysql-connector-java-5.1.41-bin.jar)放到hive/lib目录下
5.初始化Hive (Hive2以后要求先初始化)
.bin/schematool -initSchema -dbType mysql
6.启动Hive
./bin/hive