一、初识Hive
1、Hive简介
(1) 什么是Hive?
Hive是基于Hadoop的一个数据仓库
可以将结构化的数据文件映射为一张数据表,并提供类SQL查询功能,Hive底层是将SQL语句转换为MapReduce任务运行
(2)为什么使用Hive?
- 直接使用Hadoop的问题
(1)人员学习成本高,写MapReduce程序时,就得要求学习人员对java有一定的了解,这就多增加了一门课程的学习难度。
(2)项目周期要求太短,一般来说,项目不是有太多的时间让你去现学然后再来做,所以这就增加了初学者的难度。
(3)MapReduce 实现复杂查询逻辑开发难度太大
- Hive的优势
(1)操作接口采用类 SQL 的语法,提供快速开发的能力
(2)避免写 MapReduce,减少开发人员的学习成本
(3)功能扩展很方便
2、Hive架构
对架构的解释
1、用户接口
CLI:Shell 终端命令行,最常用(学习、调试、生产)
JDBC/ODBC:是 Hive 的 Java 实现,与传统数据库 JDBC 类似, 用户(开发员、运维人员) 通过这连接至 Hive Server
Web UI:通过浏览器访问 Hive,方式是ip:9999/hwi?
2、Thrift Server(跨语言服务)
3、Metastore(元数据存储)
1、什么是元数据?
通俗的讲,就是存储在 Hive 中的数据的描述信息。
2、Hive 的元数据包括什么?
表的名字、表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。
3、默认存在哪里?
MetaStore 默认存在自带的 Derby 数据库中
缺点:不适合多用户操作,数据存储目录不固定。数据库跟着 Hive 走(也就是说在哪启动hive,derby数据库就在哪),极度不方便管理。
解决方案:通常将其存在我们自己创建的 MySQL 库中(本地 或 远程)
4、解析器(驱动Driver)Hive的核心
组成结构:
编译器(Compiler)
优化器(Optimizer)
执行器(Executor)
Driver 组件完成 HQL 查询语句从词法分析、语法分析、编译、优化以及逻辑执行计划的生成。生成的逻辑执行计划存储在 HDFS 中,并随后由 MapReduce 调用执行 。
执行流程:
输入一条 HQL 查询语句(select * from table)
解析器对这条 HQL 语句进行语法分析
编译器对这条 HQL 语句生成 HQL 的执行计划
优化器生成最佳的 HQL 的执行计划
执行器执行这条最佳 HQL 语句
HiveQL 通过命令行或者客户端提交,经过 Compiler 编译器,运用 MetaStore 中的元数据进行类型检测和语法分析,生成一个逻辑方案(logical plan),然后通过优化处理,产生一个 MapReduce 任务。
3、Hive 与 Hadoop 的关系
Hive 依赖 HDFS 存储数据
利用 MapReduce 查询数据
所以说 Hive 是基于 Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce 计算框架。
4、Hive 和 RDBMS 的对比
总结:Hive 具有 SQL 数据库的外表,但应用场景完全不同, Hive 适合用来做批量海量数据统计分析,也就是数据仓库。
5、Hive 的数据存储
数据存储位置:HDFS
数据格式:没有定义专门的数据存储格式,数据格式可由用户指定,只需要在创建表的时候指定三个属性:
列分隔符
:空格、"\t"等
行分隔符
:"\n"
读取文件数据的方法(默认为 TextFile)
TextFile
为默认格式,存储方式为行存储。
SequenceFile
二进制文件,以<key,value>的形式序列化到文件中,存储方式为行存储。
RCFile
存储方式为按行分块,每块按照列存储。
数据模型
db
:数据库
在 HDFS 中表现为 ${hive.metastore.warehouse.dir} 目录下一个文件夹(默认值为/user/hive/warehouse)
table
:普通表(内部表)
在 HDFS 中表现所属 db 目录下一个文件夹
external table
:外部表
与 table 类似,不过其数据存放位置可以在任意指定路径
partition
:分区
在 HDFS 中表现为 table 目录下的子目录
bucket
:分桶
在 HDFS 中表现为同一个表目录下根据 hash 散列之后的多个文件,会根据不同的文件把数据放到不同的文件中
二、Hive 环境搭建
1、Hive 三种运行模式
1、内嵌模式
元数据保存在本地内嵌的 Derby 数据库,这是使用 Hive 最简单的方式。
这种方式缺点也比较明显,因为一个内嵌的 Derby 数据库每次只能访问一个数据文件,这也就意味着它不支持多会话连接。并且数据存储目录不固定,数据库跟着 Hive 走,极度不方便管理。
2、本地模式这种方式一般作为公司内部同时使用 Hive
元数据保存在本地独立的数据库中(一般是 MySQL)
多用户的模式,允许多个用户连接到一个数据库
前提:每个用户必须要有对 MySQL 的访问权利,即用户需要知道 MySQL 的用户名和密码。
3、远程模式
此模式应用于 Hive 客户端较多的情况
把 MySQL 数据库独立出来,将元数据保存在远程独立的数据库中(一般是 MySQL)避免了在每个客户端都安装 MySQL 服务从而造成冗余浪费的情况
多用户的模式
好处:无需知道 MySQL 的用户名和密码
2、Hive的安装
(1)前期准备
1)保证 Hadoop 集群搭建成功并启动
Hadoop集群的搭建参考:https://www.jianshu.com/p/f9aaeabc4ad4
2)下载 Hive 安装包并上传至 Linux 服务器
下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hive/
官网:https://hive.apache.org/
或者在网盘下载:https://pan.baidu.com/s/1oJGOVtpKx1MaUFIe2w8SyA
使用命令上传下载的文件apache-hive-1.2.1-bin.tar
到Linux
我在桌面上建立了一个software目录,hadoop安装的时候也放在这里了。这里也将hive上传并安装到此目录。
[cj@hadoop-01 software]$ rz
3)解压 Hive 安装包
[cj@hadoop-01 software]$ tar -zxvf apache-hive-1.2.1-bin.tar.gz
解压后hive包的名字很长,为了方便使用,我先改个名字,改成
hive-1.2.1
[cj@hadoop-01 software]$ mv apache-hive-1.2.1-bin hive-1.2.1
4)配置环境变量
要配置环境变量,需要知道hive的家目录(即解压在哪里了),可以通过以下方式获得,进入解压hive的目录,再进入hive,然后使用pwd得到的值就是我们配置环境变量时需要的结果
注意:每个人的路径不一样,需要根据自己的Hive的实际解压路径来确定,我的是/home/cj/Desktop/software/hive-1.2.1
[cj@hadoop-01 software]$ cd hive-1.2.1/
[cj@hadoop-01 hive-1.2.1]$ pwd
/home/cj/Desktop/software/hive-1.2.1
把自己pwd得到的这个路径/home/cj/Desktop/software/hive-1.2.1
复制下来,以便配置环境变量对的时候使用
编辑配置文件,使用命令:
vim ~/.bash_profile
将将以下内容添加到配置文件的底部
export HIVE_HOME=/home/cj/Desktop/software/hive-1.2.1
export PATH=$PATH:$HIVE_HOME/bin
让配置文件立即生效:
source ~/.bash_profile
验证 Hive,Hive 没有提供 hive –version 这种方式查看版本,所以使用如下命令:
hive --help
到此hive的基础配置完成,接下来是三种模式的搭建
(2)三种运行模式
1、内嵌模式安装
(1)切换到 HIVE_HOME/conf 目录下,修改 hive-env.sh 配置文件:
[cj@hadoop-01 ~]$ cd Desktop/software/hive-1.2.1/conf/
会发现里边是没有hive-env.sh
,只有一个hive-env.sh.template
,使用cp命令复制一份并命名成hive-env.sh
[cj@hadoop-01 conf]$ cp hive-env.sh.template hive-env.sh
(2)在 hive-env.sh 中添加 Hadoop 安装目录:
这个是根据自己的hadoop的安装目录来确定的,我的是/home/cj/Desktop/software/hadoop-2.6.5
如果不记得hadoop的安装路径,可以通过下边的命令来查
[cj@hadoop-01 conf]$ echo $HADOOP_HOME
/home/cj/Desktop/software/hadoop-2.6.5
或者直接查看~/.bash_profile
文件,里边的HADOOP_HOME=
后边的值就是hadoop的安装路径,把这个路径复制下来。方便配置hive-env.sh
的时候使用
把hadoop的安装目录添加到hive-env.sh
中
[cj@hadoop-01 conf]$ vim hive-env.sh
替换 Hadoop 安装包中的 jline
Hadoop(%HADOOP_HOME%/share/hadoop/yarn/lib)集群的 jline-0.9.94.jar 包版本过低,替换成 %HIVE_HOME%/lib 中的 jline-2.12.jar 包即可。
注意:所有的节点都得替换,不是只有安装 Hive 的节点
使用如下命令来复制hive中jline到hadoop中
[cj@hadoop-01 lib]$ cd ~/Desktop/software/hive-1.2.1/lib/
[cj@hadoop-01 lib]$ cp jline-2.12.jar ~/Desktop/software/hadoop-2.6.5/share/hadoop/yarn/lib/
然后删除hadoop中的jline-0.9.94.jar
,hadoop集群中的所有机器上都需要删除jline-0.9.94.jar
,并替换成jline-2.12.jar
[cj@hadoop-01 lib]$ cd ~/Desktop/software/hadoop-2.6.5/share/hadoop/yarn/lib/
[cj@hadoop-01 lib]$ rm -rf jline-0.9.94.jar
删除另外两个节点上的jline-0.9.94.jar
[cj@hadoop-02 ~]$ cd ~/Desktop/software/hadoop-2.6.5/share/hadoop/yarn/lib/
[cj@hadoop-02 lib]$ rm -rf jline-0.9.94.jar
[cj@hadoop-03 ~]$ cd ~/Desktop/software/hadoop-2.6.5/share/hadoop/yarn/lib/
[cj@hadoop-03 lib]$ rm -rf jline-0.9.94.jar
然后再把hive中的jline拷贝到另外两个节点的~/Desktop/software/hadoop-2.6.5/share/hadoop/yarn/lib/
目录下
[cj@hadoop-01 lib]$ scp -r jline-2.12.jar cj@hadoop-02:$PWD
[cj@hadoop-01 lib]$ scp -r jline-2.12.jar cj@hadoop-03:$PWD
这里直接使用主机名的前提是配置了hosts文件,如果没有,就直接用主机的ip。
使用 Hive 的三种连接方式之一:CLI 启动 Hive
[cj@hadoop-01 ~]$ hive
看到 如图情况,说明启动成功使用quit退出hive
hive> quit;
在当前目录生成一个 derby 文件和一个 metastore_db 目录,这种存储方式的弊端是在同一个目录下同时只能有一个 Hive 客户端能使用数据库,否则会提示如下错误(这是一个很常见的错误):这样,内嵌模式就算是搭建完成了。
2、本地模式安装
(1)安装 MySQL
检查以前是否安装过 MySQL,若有则卸载:
查找:rpm -qa | grep -i mysql
[cj@hadoop-01 ~]$ rpm -qa | grep -i mysql
mysql-libs-5.1.73-7.el6.x86_64
卸载:rpm -e --nodeps mysql-libs-5.1.73-7.el6.x86_64
如果直接用普通用户权限卸载是会出如下错误的。
[cj@hadoop-01 ~]$ rpm -e --nodeps mysql-libs-5.1.73-7.el6.x86_64
error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Permission denied)
用su命令提升为root权限,然后再卸载
[root@hadoop-01 cj]# rpm -e --nodeps mysql-libs-5.1.73-7.el6.x86_64
删除老版本 MySQL 的开发头文件和库:
注意:卸载后 /var/lib/mysql(数据库文件的存放目录) 中的数据及 /etc/my.cnf(配置文件) 不会删除, 确定没用后就手工删除。
[cj@hadoop-01 ~]$ rm -rf /usr/lib/mysql
[cj@hadoop-01 ~]$ rm -rf /usr/include/mysql
[cj@hadoop-01 ~]$ rm -f /etc/my.cnf
[cj@hadoop-01 ~]$ rm -rf /var/lib/mysql
准备安装包,上传至Linux服务器并解压:
安装包的下载地址:https://pan.baidu.com/s/1g6cW73kWlfMZBilPTL8tNg
下载好之后就上传到Linnux,这里还是传到我的~/Desktop/software里边的
解压文件
[cj@hadoop-01 software]$ tar -xvf MySQL-5.6.26-1.linux_glibc2.5.x86_64.rpm-bundle.tar
安装服务端Server:
安装的时候得切到root用户
[root@hadoop-01 software]# rpm -ivh MySQL-server-5.6.26-1.linux_glibc2.5.x86_64.rpm
完成之后会在打印的信息中有这么一段,里边指明了初始密码的所在路径,记住这个路径,后边用密码的时候去里边找
安装客户端client:
[root@hadoop-01 software]# rpm -ivh MySQL-client-5.6.26-1.linux_glibc2.5.x86_64.rpm
开启MySQL服务:
root
权限
[root@hadoop-01 software]# service mysql start
Starting MySQL.. SUCCESS!
登录MySQL,初始密码在
/root/.mysql_secret
这个文件里:
查看密码,结合密码登录数据库,使用命令:mysql -u<用户名> -p<密码>
[root@hadoop-01 mysql]# cat /root/.mysql_secret
# The random password set for the root user at Thu Nov 15 19:25:39 2018 (local time): I6ZR7ypIGxvmHmhr
[root@hadoop-01 mysql]# mysql -uroot -pI6ZR7ypIGxvmHmhr
修改登录密码,使用命令:
set PASSWORD=PASSWORD('密码');
,命令不区分大小写。
修改完成,退出MySQL,重新登录验证密码是否修改成功
mysql> set password=password('123456');
增加远程登录权限(主要是允许xx用户在Hive安装主机上进行远程登陆),执行以下三个命令:
mysql> grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
mysql> grant all privileges on *.* to 'root'@'hadoop-01' identified by '123456' with grant option;
mysql> flush privileges;
命令释义:
grant 权限1,权限2,…权限n on 数据库名称 . 表名称 to 用户名@用户地址 identified by '密码';
当权限1,权限2,…权限n 被 all privileges 或者 all 代替,表示赋予用户全部权限。select, insert, update, delete, create, drop, index, alter, grant,references, reload, shutdown, process, file 等 14 个权限。
数据库名称 . 表名称
:被*.*
代替时,表示赋予用户操作服务器上所有数据库所有表的权限。
用户名@用户地址 :用户地址可以是 localhost,也可以是 ip 地址、主机名、域名。也可以用%
(任何主机)地址连接。'root'@'hadoop01'含义就是允许 root 用户在 hadoop-01(Hive 安装主机) 进行远程登陆,并设置 root 用户的密码为 123456。
with grant option:用于对象授权。使用 with grant option,被授权用户可将所获得的权限再次授予其它用户或角色。
flush privileges:告诉服务器重新加载授权表。
(2)修改 Hive 配置(切回普通用户)
1)修改 Hive 配置文件(路径
/home/cj/Desktop/software/hive-1.2.1/conf
),每个人的路径不一样,根据实际路径来,使用命令:
[cj@hadoop-01 conf]$ vim hive-site.xml
在里边加入如下的内容
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop-01:3306/hivedb?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>
对各字段的解释:
javax.jdo.option.ConnectionURL:JDBC连接字符串
javax.jdo.option.ConnectionDriverName:JDBC的driver
javax.jdo.option.ConnectionUserName:登录数据库的用户名
javax.jdo.option.ConnectionPassword:登录数据库的密码
修改hive-env.sh文件,在里边把48行的注释取消,然后把值改成hadoop的安装目录,如图:
- 将 MySQL 的驱动包(mysql-connector-java-5.1.40-bin.jar)放到 %HIVE_HOME%/lib 目录下,我的是
/home/cj/Desktop/software/hive-1.2.1/lib
,作用是方便远程连接mysql。
下载地址:https://pan.baidu.com/s/1hGGhb6ehf27TflcE5vsg9Q
准备好jar包后,直接进入这个目录,用rz命令上传即可。
[cj@hadoop-01 lib]$ rz
启动mysql服务
[cj@hadoop-01 ~]$ service mysql start
启动hive
[cj@hadoop-01 ~]$ hive
看到这样说明启动成功3、远程模式安装
(1)简介
这种模式需要使用 HIVE_HOME/bin 目录下提供的 beeline+hiveserver2 配合使用才可以。
其原理就是将 metadata 作为一个单独的服务进行启动。各种客户端通过 beeline 来连接,连接之前无需知道数据库的用户名和密码。
(2)安装步骤:
首先把hadoop-01上的hive的安装包拷贝到hadoop-03的相同目录上,我的所有服务器上都在桌面上建了相同的目录
~/Desktop/software
,所以就拷贝到这个目录下,使用如下命令:
[cj@hadoop-01 software]$ scp -r hive-1.2.1/ cj@hadoop-03:$PWD
等待复制完成,然后可以在hadoop-03上看到hive的目录
hive-1.2.1
(1) 因其连接之前无需知道数据库的用户名和密码,所以在
/home/cj/Desktop/software/hive-1.2.1/conf
下的配置文件 hive-site.xml 中只需要配置以下两项即可,其他步骤和本地模式一样:
这里需要注意的是因为我们把hive和mysql都装在了同一台服务器上,所谓远程连接,我们需要把mysql拷贝一份到其他的服务器,这里是以hadoop-03作为远程连接的机器。
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop-01:3306/hivedb?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>
</configuration>
(2)配置环境变量
~/.bash_profile
,把hive的安装目录添加进去,使用pwd获得全路径。
[cj@hadoop-03 conf]$ pwd
/home/cj/Desktop/software/hive-1.2.1/conf
[cj@hadoop-03 conf]$ vim ~/.bash_profile
把以下两个添加到.bash_profile的后边
export HIVE_HOME=/home/cj/Desktop/software/hive-1.2.1
export PATH=$PATH:$HIVE_HOME/bin
如图:让配置文件立即生效
[cj@hadoop-03 conf]$ source ~/.bash_profile
Hive 启动 hive thrift 服务端,使用命令:
[cj@hadoop-01 hive-1.2.1]$ hiveserver2
如图:这里标明了操作状态
启动后命令行会一直监听不退出,然后我们再创建一个hadoop-01的连接,使用进程查看命令
netstat -natp
查看,我们可以看到它监听了10000端口:
然后在hadoop-03中执行 beeline 命令(在哪个路径下执行都可以):
[cj@hadoop-03 conf]$ beeline
执行beeline后的结果如图:默认端口为 10000,可通过 hive.server2.thrift.port 参数调整,
beeline> !connect jdbc:hive2://hadoop-01:10000
,这条命令之中,hadoop-01:mysql所在的节点,我的是把mysql装在了hadoop-01上,还有,在这里使用hadoop-01的前提是配置了/etc/hosts里边配置了地址映射(每台机器都需要)
看到这样的结果就说明远程模式搭建可以了。
3、 Hive 的三种连接方式
1、CLI
2、HiveServer2/beeline
3、Web UI这种方式相对前两种来说,用得比较少,所以这里不做详细介绍。这个还需要额外的配置。