第一部分
什么是Hive:
Hive是基于Hadoop之上的数据仓库,数据存放在HDFS上,它同样可以通过ETL来进行数据的抽取、转换和加载。同时Hive可以自己开发Mapreduce程序来完成本身不能提供的数据处理操作。Hive本身就是一个SQL的解析引擎,他将SQL 语句转成Mapreduce任务在hadoop之上执行。
什么是数据仓库:
数据仓库是一个面向主题的,集成的,不可更新的,随时间不变化的数据集合,它用于支持企业或组织的决策分析处理。
针对数据仓库的概念的解释:首先数据仓库中的数据是面向主题的,也就是这些数据的都是为了描述同一类事情,同时它的数据主要用于查询操作,不会对数据仓库中的数据进行删除和更新操作。
OLTP: 联机事务处理(面向的是事务,需要实时的更新操作,银行转账)
OLAP: 联机分析处理(面向历史数据,进行数据的分析与挖掘,主要面向查询,不会做更新和插入数据,推荐系统)
注意:
在搭建数据仓库的过程最常用的两种模型就是:星型模型和雪花模型,雪花模型是在星型模型上发展出来的。什么是星型模型,比如一个商品的推荐系统,主题应该是商品,但是围绕商品的有客户信息、厂家信息、促销信息等很多信息,这样就组成了一个星型模型。但是客户信息中也存在客户的家庭的信息、地址信息等。这样再关联的话就是一个雪花模型了。
第二部分
Hive的体系结构:
Hive将元数据存储在数据库中(metastore),这个数据库支持mysql、derby等数据库中。Hive默认是存储在derby数据库中。
Hive的元数据有哪些? 包括表的名字、表的列和分区及其属性,表的属性包括是否为外部表等,表的数据所在目录等。
首先Hive是基于Hadoop的,所以hive的数据会使用HDFS进行保存,同时hive的查询操作也是转化成hadoop的MapReduce操作,所以在hive中会存在一个Hive Driver:包括编译器、解析器和优化器。
在Hive的驱动之前有访问接口、jdbc以及WebConsole等方式进行操作。当然hive的元信息是存放在关系型数据库中的。
HQL的执行过程:
解释器、编译器、优化器完成HQL查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在HDFS中,并在随后的Mapreduce调用执行。
第三部分
Hive的安装:
Hive的官网地址: hive.apache.org apache 的历史工程发布页面在: archive.apache.org,在这个页面下可以找到hive工程。这里使用的是0.13版本。
Hive的安装之前需要先将hadoop安装好,hive有三种安装方式:嵌入模式、本地模式、远程模式。
嵌入模式:Hive将元信息存储在Hive自带的Derby数据库中。但是这种操作方式存在一些缺陷: 1. 只允许创建一个连接,也就是只允许一个用户操作hive 2. 多用于Demo
在安装hive之前需要先安装hadoop,然后把hive的压缩包解压,在bin目录下执行./hive进入hive的启动脚本,这种方式就是使用的嵌入式模式启动hive,会在当前目录下生成一个metastore_db的目录,这个就是元信息目录。
本地模式:Hive将元信息存储在mysql数据库中,mysql数据库与hive运行在同一台物理机上。这种方式可以允许多个用户操作hive,可以用于开发和测试。
远程模式:(推荐使用这种方式)hive将元信息存储在mysql数据库中,mysql数据库与hive运行在不同的物理机上。
元信息存储在远程的mysql中。进入远程mysql中,mysql -u … -p … , 进入后使用create database hive创建一个hive数据库来保存元数据。
在hive解压后,把mysql的驱动jar包上传到hive的lib目录中。这样hive才能操作mysql数据库。然后需要更改hive的配置文件。在conf中创建一个hive-site.xml文件,文件的内容如下:
javax.jdo.option.ConnectionURL
jdbc:mysql://ip:3306/hive
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
javax.jdo.option.ConnectionUserName
root
javax.jdo.option.ConnectionPassword
root
当配置文件设置完后以后,就可以启动hive了。
第四部分
Hive的管理
使用hive的脚本直接进入hive,或者 hive –service cli
cli常用的命令:
- 清屏:ctrl + l 或者 !clear;
- 查看数据仓库中的表: show tables;
- 查看数据仓库中的函数:show functions;
- 查看表结构: desc 表名;
- 查看hdfs上的文件列表: dfs -ls /user 查看hadoop上/user上的文件
- 执行linux命令: !命令
- 执行HQL语句:select * from test;当执行这个语句的时候是不会开启一个MapReduce任务的,因为这个是获取全部的数据,获取全部的数据只需要把所有的数据读取出来就可以了,并不需要启动一个任务。但是在执行select name from test;查询某一个字段的信息的时候就需要启动一个MapReduce任务了。
- 可以执行一个sql脚本:source /root/test.sql 这个语句就是启动一个执行sql脚本。这种方式就是和mysql执行外部的信息一样。
- hive -S 进入hive启动任务不会产生调试信息,直接产生MapReduce的结果。
- hive -e 执行sql语句。hive -e ‘show tables’;这样的执行就直接在linux的命令行操作就行,并不需要进入hive的交互式中执行。
Web界面方式:
启动方式: #hive –service hwi & 在0.13.0中并没有包含web管理的war包,需要自己编译。
下载hive源码包,并且解压源码包,然后进入源码路径下的hwi目录,使用:jar cvfM0 hive-hwi-0.13.0.war -C web/ . 这样就会打成一个war包,把这个war包拷贝到hive的lib目录下,同时需要修改hive-site.xml 配置文件,这个修改可以在wiki上看到。
hive.hwi.listen.host
0.0.0.0
This is the host address the Hive Web Interface will listen on
hive.hwi.listen.port
9999
This is the port the Hive Web Interface will listen on
hive.hwi.war.file
lib/hive-hwi-0.13.0.war
This is the WAR file with the jsp content for Hive Web Interface
这个就可以使用hive –service hwi启动web服务了,但是在访问这个web应用的时候,浏览器还是报出了500的错误。这个问题需要拷贝jdk的tools.jar 拷贝到hive的lib目录下。
这个时候就可以打开这个web界面了。
hive的远程服务
启动hive的远程服务的命令如下: hive –service hiveserver & 如果要使用jdbc连接hive进行操作,这个时候就需要开启hive的远程服务。
第五部分
Hive的数据类型
基本数据类型:
tinyint/smallint/int/bigint 整数类型
float/double 浮点类型
boolean 布尔类型
string/varchar/char 字符串类型复杂数据类型:
array:数组类型,由一系列相同的数据类型的元素组成
map:集合类型,包含key->value键值对,可以通过key来访问元素。
struct:结构类型,可以包含不同数据类型的元素,这些元素可以通 过“点语法”的方式来得到所需要的元素。
create table student (
age int,
name string,
grade array);
插入的时候就是: {1, wangmin, [10,20,30]};
create table student1 (
sid int,
sname string,
grade map);
插入数据的时候: {1,wangmin,<'大学语文', 85>}
create table studnet3(
sid int,
sname string,
grades array
- 时间类型:
Date: 日期(年月日)
Timestamp: 是unix的一个时间偏移量
select unix_timestamp(); 查看系统的时间偏移量
第六部分
Hive的数据存储
基于HDFS,没有专门的数据存储格式
Hive的数据模型:
表可以分成以下几种:
- Table 内部表
- Partition 分区表
- External Table 外部表
- Bucket Table 桶表
create table t1
(tid int, tname string, age int);
create table t2
(tid int, tname string age int);
localtion '/mytable/hive/t2';
create table t3
(tid int, tname string, age int)
row format delimited fields terminated by ',';
create table t4
as
select * from sample_date;
create table t5
row format delimited fields terminated by ','
as
select * from sample_data;
分区表:
create table partition_table
(sid int, sname string)
partitioned by (gender string)
row format delimited fields terminated by ',';
创建这张表的时候就是以gender进行分区 分区表能够加快查询效率