一、前言
1.特别的计算模型:MapReduce
- 其可以将任务分割成多个处理单元,然后分散到一群家用或者服务器级别的硬件机器上,从而降低成本,并提供水平可伸缩性。
- 这个计算模型下面组件被称为Hadoop分散式文件系统(HDFS)
- 这个系统是可拔插的
2.Hive出现的原因
- 用户希望从现有的数据库基础框架转移到Hadoop上
- 而这个框架是基于传统关系型数据库和接口查询语句(SQL)的,为了解决这个问题,出现了Hive
3.Hive出现了查询语句:
- Hive查询语句(HiveQL或HQL)
- 查询存储在Hadoop中的数
4.SQL知识分布广泛的一个原因:
- 它有效地、合理地、且直观地组织和使用数据模型。
5.Hive应用:
- Hive可以将大多数查询转换为MapReduce任务(job),进而在介绍一个令人熟悉的SQL抽象的同时,拓展了Hadoop的可扩展性。
- Hive最适合数据仓库的应用程序,使用该应用程序进行相关的静态分析,不需要快速响应给出结果,而且数据本身 频繁变化。
6.Hive不是一个完整的数据库:
- Hive不支持记录级别的更新、插入或删除
- 用户可以通过查询生成新表或者将查询结果导入到文件中
- Hive查询延时比较严重
7.Hive不支持(OLTP)联机事务处理
- Hive不支持OLTP(联机事务处理)所需要的关键功能,更接近于一个OLAP(联机分析技术)工具。但是并没有满足OLAP中的”联机“部分,至少目前没有满足。由于延时严重。
8.Hive最适合数据仓库的应用程序
- 可以维护海量数据,而且可以对数据进行挖掘,然后形成意见和报告
二、介绍
1.Hive是什么?
1).MapReduce开发:
- 开发调试麻烦,只能使用Java开发,需要对hadoop的底层及api比较了解才能开发出复杂的代码
2).HQL:
- Hive是基于Hadoop的一个数据仓库。
- 可以将结构化的数据文件映射成为一张数据库表,并提供完整的SQL查询功能。
- 可以将SQL语句转化为MapReduce任务进行。
- 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
- Hive是建立在 Hadoop 上的数据仓库基础架构。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。
- Hive 定义了简单的类 SQL 查询语言,称为 HiveQL,它允许熟悉 SQL 的用户查询数据。
- 同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
- Hive不支持在线事务处理,也不支持行级的插入和更新和删除。
3).数据仓库简介
- 数据仓库,是为企业所有级别的决策制定过程,提供所有类型数据支持的战略集合。
- 它是单个数据存储,出于分析性报告和决策支持目的而创建。
- 需要业务智能的企业,提供指导业务流程改进、监视时间、成本、质量以及控制。
2.Hive的安装配置
首先需要hadoop的支持,启动好hadoop
下载:从apache官网下载新版本hive,要注意和hadoop版本的匹配。
支持:
需要对应版本jdk的支持
需要安装并运行hadoop安装:
将下载好的hive安装包上传到linux中。
解压:tar -zxvf apache-hive-1.2.0-bin.tar.gz启动:
进入hive/bin目录,直接运行hive命令,即可进入hive提示符。
hive不需要任何配置就可以运行,因为它可以通过HADOOP_HOME环境变量获知hadoop的配置信息。可能的安装冲突解决:
问题描述:
在使用hadoop2.5.x环境下,启动hive发现报错:java.lang.IncompatibleClassChangeError: Found class jline.Terminal, but interface was expected
问题分析:
造成这个错误的原因是因为jline.Terminal这个类有错误。
解决方法:
复制hive/lib/jline-2.12.jar替换hadoop/share/hadoop/yarn/lib中的jline-0.9.x.jar,重启hadoop和hive即可。
或
直接将hadoop升级到更高版本,如2.7.x中已经解决此问题。
3.HIVE入门
$show databases;
执行后发现默认有一个库default
$show tables;
发现没有任何表,证明不use其他库时,默认就是default库。
$create database tedu;
发现在hdfs中多出了/user/hive/warehouse/tedu.db目录
结论1: hive中的数据库对应hdfs中/user/hive/warehouse目录下以.db结尾的目录。
$use tedu;
$create table student (id int,name string);
$show tables;
$desc student;
$show create table student;
发现正确创建出来了表。
发现在hdfs中多出了/user/hive/warehouse/tedu.db/sutdent目录
结论2: hive中的表对应hdfs/user/hive/warehouse/[db目录]中的一个目录
$load data local inpath '../mydata/student.txt' into table student;
发现/user/hive/warehouse/tedu.db/sutdent下多出了文件
$select * from student;
发现查出的数据不正确,原因是建表时没有指定分隔符。默认的分隔符是空格。
$create table student2 (id int,name string) row format delimited fields terminated by '\t';
$load data local inpath '../mydata/student.txt' into table student2;
$select * from student2;
发现正确查询出了数据。
结论3: hive中的数据对应当前hive表对应的hdfs目录中的文件。
$select count(*) from student;
发现执行了mapreduce作业,最终现实了结果
结论4: hive会将命令转换为mapreduce执行。
$use default;
$create table teacher(id int,name string);
发现在hive对应的目录下多出了 tedu.db 文件夹,其中包含user文件夹。
结论5: hive默认的default数据库直接对应/user/hive/warehouse目录,在default库中创建的表直接会在该目录下创建对应目录。
4.HIVE配置mysql metastore
1). hive中除了保存真正的数据以外还要额外保存用来描述库、表、数据的数据,称为hive的元数据。这些元数据又存放在何处呢?
- 如果不修改配置hive默认使用内置的derby数据库存储元数据。
- derby是apache开发的基于java的文件型数据库。
- 可以检查之前执行命令的目录,会发现其中产生了一个metastore.db的文件,这就是derby产生的用来保存元数据的数据库文件。
2) derby数据库
- derby数据库仅仅用来进行测试,真正使用时会有很多限制。
- 最明显的问题是不能支持并发。
- 经测试可以发现,在同一目录下使用无法同时开启hive,不同目录下可以同时开启hive但是会各自产生metastore.db文件造成数据无法共同访问。
- 所以真正生产环境中我们是不会使用默认的derby数据库保存hive的元数据的。
hive目前支持derby和mysql来存储元数据。
3)配置hive使用mysql保存元数据信息:
删除hdfs中的/user/hive
hadoop fs -rmr /user/hive
复制hive/conf/hive-default.xml.template为hive-site.xml
cp hive-default.xml.template hive-site.xml
在