一、Hive的介绍
1、什么是Hive
Hive 是建立在 Hadoop 上的数据仓库基础构架。
它提供了一系列的工具,可以用来进行数据提取转化加载(ETL ),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 QL ,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。
Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后在Hadoop执行。
Hive的表其实就是HDFS的目录/文件,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在M/R Job里使用这些数据。
2、Hive的系统架构
2.1、Hive 的结构可以分为以下几部分:
- 用户接口:包括 CLI, Client, WUI
- 元数据存储。通常是存储在关系数据库如 mysql, derby 中
- 解释器、编译器、优化器、执行器
- Hadoop:用 HDFS 进行存储,利用 MapReduce 进行计算
- 用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是 CLI,Cli 启动的时候,会同时启动一个 Hive 副本。Client 是 Hive 的客户端,用户连接至 Hive Server。在启动 Client 模式的时候,需要指出 Hive Server 所在节点,并且在该节点启动 Hive Server。 WUI 是通过浏览器访问Hive。
- Hive 将元数据存储在数据库中,如 mysql、derby。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
- 解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行。
- Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含 * 的查询,比如 select * from tbl 不会生成 MapRedcue 任务)。
2.2、Hive 构建在 Hadoop 之上
- HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的
- 所有的数据都是存储在 Hadoop 中
- 查询计划被转化为 MapReduce 任务,在 Hadoop 中执行(有些查询没有 MR 任务,如:select * from table)
- Hadoop和Hive都是用UTF-8编码的
2.3、Hive 和普通关系数据库的异同
2.4、HIVE的数据存储
首先,Hive 没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。
其次,Hive 中所有的数据都存储在 HDFS 中,Hive 中包含以下数据模型:Table,External Table,Partition,Bucket。
- Hive 中的 Table 和数据库中的 Table 在概念上是类似的,每一个 Table 在 Hive 中都有一个相应的目录存储数据。例如,一个表 htduan,它在 HDFS 中的路径为:/ warehouse /htduan,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的 Table 数据(不包括 External Table)都保存在这个目录中。
- Partition 对应于数据库中的 Partition 列的密集索引,但是 Hive 中 Partition 的组织方式和数据库中的很不相同。在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中。例如:htduan 表中包含 dt 和 city 两个 Partition,则对应于 dt = 20100801, ctry = US 的 HDFS 子目录为:/ warehouse /htduan/dt=20100801/ctry=US;对应于 dt = 20100801, ctry = CA 的 HDFS 子目录为;/ warehouse /htduan/dt=20100801/ctry=CA
- Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件。将 user 列分散至 32 个 bucket,首先对 user 列的值计算 hash,对应 hash 值为 0 的 HDFS 目录为:/ warehouse /htduan/dt =20100801/ctry=US/part-00000;hash 值为 20 的 HDFS 目录为:/ warehouse /htduan/dt =20100801/ctry=US/part-00020
- External Table 指向已经在 HDFS 中存在的数据,可以创建 Partition。它和 Table 在元数据的组织上是相同的,而实际数据的存储则有较大的差异。
- Table 的创建过程和数据加载过程(这两个过程可以在同一个语句中完成),在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。
3、为什么选择Hive?
- 基于Hadoop的大数据的计算/扩展能力
- 支持SQL like查询语言
- 统一的元数据管理
- 简单编程
二、Hive的本地安装与部署
前言:因为Hive 构建在 Hadoop 之上,所以确保你的Hadoop集群正常运行
Hive的三种安装模式
- 内嵌模式:元数据保持在内嵌的derby模式,只允许一个会话连接
- 本地独立模式:在本地安装Mysql,把元数据放到mySql内
- 远程模式:元数据放置在远程的Mysql数据库
1、Hive的下载
下载地址http://www.apache.org/dyn/closer.cgi/hive/
这里我用的版本是apache-hive-2.3.4-bin.tar.gz
我使用的有关Hadoop生态圈的压缩包已经放在菜单栏工具中,可根据需要自行下载
2、Hive的安装
将下载好的Hive传输到你的Linux中,解压解压并且修改文件名
tar -zxvf ./apache-hive-2.3.4-bin.tar.gz -C /usr/local/
cd /usr/local/
sudo mv apache-hive-1.2.1-bin hive #将文件夹名改为hive
3、Hive的配置
3.1、配置环境变量
vim ~/.bashrc
source ~/.bashrc #重启文件
3.2、修改/usr/local/hive/conf
下的hive-site.xml
cd /usr/local/hive/conf
mv hive-default.xml.template hive-default.xml
上面命令是将hive-default.xml.template重命名为hive-default.xml;
然后,使用vim编辑器新建一个配置文件hive-site.xml,命令如下:
cd /usr/local/hive/conf
vim hive-site.xml
在hive-site.xml中添加如下配置信息:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?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>
<description>JDBC connect string for a JDBC metastore</description>
</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>
</configuration>
4、安装并配置mysql
这里我们采用MySQL数据库保存Hive的元数据,而不是采用Hive自带的derby来存储元数据。
4.1、安装mysql
具体安装可看https://blog.csdn.net/Ares_song/article/details/81221709
sudo apt-get update #更新软件源
sudo apt-get install mysql-server #安装mysql
安装过程会提示设置mysql root用户的密码,设置完成后等待自动安装即可。默认安装完成就启动了mysql。
4.2、启动mysql
service mysql start
4.3、检验mysql
sudo netstat -tap | grep mysql
4.4、进入mysql shell界面
mysql -u root -p
4.5、下载mysql jdbc包
下载地址:https://dev.mysql.com/downloads/connector/j/
或者使用命令下载驱动
wget http://downloads.mysql.com/archives/mysql-connector-java-5.0/mysql-connector-java-5.0.8.tar.gz
将下载的驱动包加压缩并拷贝到hive的lib目录下
tar -zxvf mysql-connector-java-5.0.8.tar.gz #解压缩
cp mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar /usr/local/hive/lib
4.6、启动并登陆mysql shell
service mysql start #启动mysql服务
mysql -u root -p #登陆shell界面
4.7、 新建hive数据库
create database hive;
#这个hive数据库与hive-site.xml中localhost:3306/hive的hive对应,用来保存hive元数据
4.8、配置mysql允许hive接入
mysql> grant all on *.* to root@localhost identified by '123456';
#将所有数据库的所有表的所有权限赋给hive用户,后面的hive是配置hive-site.xml中配置的连接密码
mysql> flush privileges; #刷新mysql系统权限关系表
5、启动hive
启动hive之前,请先启动hadoop集群。
start-all.sh #启动hadoop
hive #启动hive
在启动Hive时,有可能会出现Hive metastore database is not initialized的错误,这里给出解决方案。
解决Hive启动,Hive metastore database is not initialized的错误。出错原因:以前曾经安装了Hive或MySQL,重新安装Hive和MySQL以后,导致版本、配置不一致。解决方法是,使用schematool工具。Hive现在包含一个用于 Hive Metastore 架构操控的脱机工具,名为 schematool.此工具可用于初始化当前 Hive 版本的 Metastore 架构。此外,其还可处理从较旧版本到新版本的架构升级。所以,解决上述错误,你可以在终端执行如下命令:
schematool -dbType mysql -initSchema
执行后,再启动Hive,应该就正常了。
6、测试Hive
6.1、打开Navicat远程连接linux中的mysql
可以看到Hive数据库中的表
6.2、在Hive命令行中输入命令
create table test1(tid int,tname string);
在mysql中TBLS表中可以看到新增的信息
6.3、此时元数据连接Mysql成功
远程连接其实跟本地连接一样,只是配置文件中将Master改成远程mysql的ip地址
三、Hive的简单操作
在linux中输入hive进入hive的命令行
静默模式输入命令 hive -S
1、常用的CLI命令
1、清屏 ctrl+L或者!clear
2、查看数据仓库中的表 show tables;
3、查看数据仓库中的内置的函数 show functions;
4、查看表结构 desc [表名]
5、查看HDFS上的文件 dfs -ls /
6、执行操作系统的命令 !命令
7、执行HQL语句 select *** from ***
8、执行SQL的脚本 source SQL文件
不进入命令行 可以使用命令 hive -e ‘命令’
2、Hive的Web界面管理
启动方式
hive --service hwi &
端口号 9999
访问地址:<IP>:9999/hwi
这个Web界面还需要hwi的包。。这里知道就行了