Hive教程
一、Hive简介
1.1、什么是 Hive ?
Hive 是一个基于 Hadoop 文件系统之上的数据仓库架构。它为数据仓库的管理提供了许多功能:数据 ETL (抽取、转换和加载)工具、数据存储管理和大型数据集的查询和分析能力。同时 Hive 还定义了类 SQL的语言 – Hive QL. Hive QL 允许用户进行和 SQL 相似的操作,它可以将结构化的数据文件映射为一张数据库表,并提供简单的 SQL 查询功能。还允许开发人员方便地使用 Mapper 和 Reducer 操作,可以将 SQL 语句转换为 MapReduce 任务运行,这对 MapReduce 框架来说是一个强有力的支持。
1.2、Hive 体系结构
Hive 是 Hadoop 中的一个重要子项目,从下图我们就可以大致了解 Hive 在 Hadoop 中的位置和关系。
上图描述 Hadoop EcoSystem 中的各层系统。而 Hive 本身的体系结构如下:
-
从图中我们可以看出 Hive 其基本组成可以分为:
- 用户接口,包括 CLI, JDBC/ODBC, WebUI
- 元数据存储,通常是存储在关系数据库如 MySQL, Derby 中
- 解释器、编译器、优化器、执行器
- Hadoop, 用 HDFS 进行存储,利用 MapReduce 进行计算
1.3、Hive 与关系数据库的区别
Hive 在很多方面与传统关系数据库类似(例如支持 SQL 接口),但是其底层对 HDFS 和 MapReduce 的依赖意味着它的体系结构有别于传统关系数据库,而这些区别又影响着 Hive 所支持的特性,进而影响着 Hive 的使用。
- 我们可以列举一些简单区别:
- Hive 和关系数据库存储文件的系统不同,Hive 使用的是 Hadoop 的HDFS(Hadoop的分布式文件系统),关系数据库则是服务器本地的文件系统;
- Hive 使用的计算模型是 MapReduce,而关系数据库则是自己设计的计算模型;
- 关系数据库都是为实时查询的业务进行设计的,而 Hive 则是为海量数据做数据挖掘设计的,实时性很差;实时性的区别导致 Hive 的应用场景和关系数据库有很大的不同;
- Hive 很容易扩展自己的存储能力和计算能力,这个是继承 Hadoop 的,而关系数据库在这个方面要差很多。
1.4、Hive 应用场景
-
通过对 Hive 与传统关系数据库的比较之后,其实我们不难得出 Hive 可以应用于哪些场景。
-
Hive 构建在基于静态批处理的 Hadoop 之上,Hadoop 通常都有较高的延迟并且在作业提交和调度的时候需要大量的开销。因此,Hive 不适合在大规模数据集上实现低延迟快速的查询。
-
Hive 并不适合那些需要低延迟的应用,例如,联机事务处理(OLTP)。Hive 查询操作过程严格遵守 Hadoop MapReduce 的作业执行模型,Hive 将用户的 HiveQL 语句通过解释器转换为 MapReduce 作业提交到 Hadoop 集群上,Hadoop 监控作业执行过程,然后返回作业执行结果给用户。Hive 并非为联机事务处理而设计,Hive 并不提供实时的查询和基于行级的数据更新操作。
-
Hive 的最佳使用场合是大数据集的批处理作业,例如,网络日志分析。
1.5、Hive 的数据存储
-
Hive 的存储是建立在 Hadoop 文件系统之上的。Hive 本身没有专门的数据存储格式,也不能为数据建立索引,因此用户可以非常自由地组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符就可以解析数据了。
-
Hive 中主要包括 4 种数据模型:
表(Table)
、外部表(External Table)
、分区(Partition)
以及桶(Bucket)
。 -
Hive 的表和数据库中的表在概念上没有什么本质区别,在 Hive 中每个表都有一个对应的存储目录。而外部表指向已经在 HDFS 中存在的数据,也可以创建分区。Hive 中的每个分区都对应数据库中相应分区列的一个索引,但是其对分区的组织方式和传统关系数据库不同。桶在指定列进行 Hash 计算时,会根据哈希值切分数据,使每个桶对应一个文件。
1.6、Hive 的元数据存储
- 由于 Hive 的元数据可能要面临不断地更新、修改和读取操作,所以它显然不适合使用 Hadoop 文件系统进行存储。目前 Hive 把元数据存储在 RDBMS 中,比如存储在 MySQL, Derby 中。这点我们在上面介绍的 Hive 的体系结构图中,也可以看出。
二、Hive 环境介绍
- 与 Hadoop 类似,Hive 也有 3 种运行模式:
-
1.内嵌模式
将元数据保存在本地内嵌的 Derby 数据库中,这是使用 Hive 最简单的方式。但是这种方式缺点也比较明显,因为一个内嵌的 Derby 数据库每次只能访问一个数据文件,这也就意味着它不支持多会话连接。 -
2.本地模式
这种模式是将元数据保存在本地独立的数据库中(一般是 MySQL),这就可以支持多会话和多用户连接了。 -
3.远程模式
此模式应用于 Hive 客户端较多的情况。把 MySQL 数据库独立出来,将元数据保存在远端独立的 MySQL 服务中,避免了在每个客户端都安装 MySQL 服务从而造成冗余浪费的情况。
-
2.1、安装准备
-
1、下载安装 hive
首先打开终端切换到 hadoop 用户下:su -l hadoop #密码为hadoop
Hive 是基于 Hadoop 文件系统之上的数据仓库。因此,安装 Hive 之前必须确保 Hadoop 已经成功安装。本次我们使用 Hive 1.2.1 版本。Hive 1.2.1 可以在 Hadoop V2.7.x 以上环境中工作。下载
apache-hive-1.2.1-bin.tar.gz
后,对其进行解压:tar zxvf apache-hive-1.2.1-bin.tar.gz
下载地址:hive-1.2.1 -
2、配置系统环境变量
- 修改/etc/profile 文件和.bashrc文件
sudo vim /etc/profile
# Hive environment export HIVE_HOME=/opt/apache-hive-1.2.1-bin export PATH=$PATH:$HIVE_HOME/bin
- 修改/etc/profile 文件和.bashrc文件
-
3、hadoop 集群启动
- 先进入的/opt/hadoop-2.7.3/sbin 目录下,再启动 hdfs
$ cd /opt/hadoop-2.7.3/sbin $ hdfs namenode -format #namenode初始化 $ ./start-all.sh # 启动hadoop
- 验证 hdfs 是否启动成功
1、输入jps
查看相关进程是否存在
2、输入hadoop dfs -fs /
确定能否链接成功
- 先进入的/opt/hadoop-2.7.3/sbin 目录下,再启动 hdfs
2.2、本地模式
现在我们替换默认的 Derby 数据库为 MySQL 数据库。
2.2.1、下载安装 MySQL
-
mysql安装教程:地址
-
创建 hive 数据库:
mysql -u root -p #没有密码直接回车即可 create database hive; #创建hive数据库 grant all on hive.* to 'hive'@'localhost' identified by 'hive'; #创建用户hive
虽然 MySQL 已经默认安装,但我们还需要下载一个 MySQL 的 JDBC 驱动包。这里使用的是 mysql-connector-java-5.1.32-bin.jar,助攻文件需要复制到 $HIVE_HOME/lib 目录下面。
-
这里我们提供了 mysql-connector-java-5.1.32.jar 的下载链接,需要的同学可以自行下载:
wget https://labfile.oss.aliyuncs.com/courses/38/mysql-connector-java-5.1.32.rar
2.2.2、修改 hive-site.xml 配置文件
-
最后,依然是修改 $HIVE_HOME/conf 下的 hive-site.xml 文件,把默认的 Derby 修改为 MySQL :
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value> <!-- 这里自己搓自己的mysql的ip地址 --> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>hive</value> <!-- 这里搓自己的mysql账号和密码 --> </property> </configuration>
2.2.3、启动 Hive
-
初始化 hive 元数据库:
schematool -dbType mysql -initSchema
-
启动 Hive 的方式如下:
cd /opt/apache-hive-1.2.1-bin/bin hive
2.3、内嵌模式
2.3.1、修改hive-site.xml
-
先切换到对应的目录下操作:
cd /opt/apache-hive-1.2.1-bin/conf/ ls
$ sudo cp hive-default.xml.template hive-site.xml
-
hive-site.xml 的主要配置有以下,不需要修改:
hive.metastore.warehouse.dir 该参数指定了 Hive 的数据存储目录,默认位置在 HDFS 上面的 /user/hive/warehouse 路径下。
hive.exec.scratchdir 该参数指定了 Hive 的数据临时文件目录,默认位置为 HDFS 上面的 /tmp/hive 路径下。
-
同时我们还要修改 Hive 目录下 /conf/hive-env.sh 文件(请根据自己的实际路径修改),该文件默认也不存在,同样是拷贝它的模版来修改
cat hive-env.sh
2.3.2、创建必要目录
-
前面我们看到 hive-site.xml 文件中有两个重要的路径,切换到 hadoop 用户下查看 HDFS (需要先启动 Hadoop)是否有这些路径:
$ hadoop dfs -ls /
没有发现上面提到的路径,因此我们需要自己新建这些目录,并且给它们赋予用户写(W)权限。$ hadoop dfs -mkdir /user $ hadoop dfs -mkdir /user/hive $ hadoop dfs -mkdir /user/hive/warehouse $ hadoop dfs -mkdir /tmp $ hadoop dfs -mkdir /tmp/hive $ hadoop dfs -chmod 777 /user/hive/warehouse $ hadoop dfs -chmod 777 /tmp/hive
-
检查是否新建成功 hadoop dfs -ls / 以及 hadoop dfs -ls /user/hive/ :
2.3.3、修改 io.tmpdir 路径
-
同时,要修改 hive-site.xml 中所有包含 ${system:java.io.tmpdir} 字段的 value ,可以自己新建一个目录来替换它,例如 /home/hadoop/hive/iotmp 。(以下是一个修改示例,其他的同理)
# 将 <value>${system:java.io.tmpdir}/${system:user.name}</value> # 改成 <value>/home/hadoop/hive/iotmp</value>
-
并且需要在/home/hadoop/下建立相应的目录
$ mkdir /home/hadoop/hive
-
如果不修改这个目录,你很可能会出现如下错误:
vim 下 / 表示搜索,后面跟你的关键词,比如搜索 hello,则为 /hello , 再回车即可), 同样注意修改写权限
2.3.4、运行 Hive
-
前面我们已经提到过,内嵌模式使用默认配置和 Derby 数据库,所以无需其它特别修改直接运行 hive(确保 Hadoop 已经先启动)。完整步骤如下:
cd .. cd bin/ schematool -dbType derby -initSchema # 初始化hive的元数据库 hive #启动hive