hive基础入门与环境的搭建

一、初识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架构 《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基础入门与环境的搭建》 Hive的运行流程

Hive 依赖 HDFS 存储数据
利用 MapReduce 查询数据
所以说 Hive 是基于 Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce 计算框架。

4、Hive 和 RDBMS 的对比 《hive基础入门与环境的搭建》

总结: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

《hive基础入门与环境的搭建》

让配置文件立即生效:

source ~/.bash_profile

验证 Hive,Hive 没有提供 hive –version 这种方式查看版本,所以使用如下命令:

hive --help

《hive基础入门与环境的搭建》

到此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

《hive基础入门与环境的搭建》

替换 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

看到 如图情况,说明启动成功
《hive基础入门与环境的搭建》

使用quit退出hive

hive> quit;

在当前目录生成一个 derby 文件和一个 metastore_db 目录,这种存储方式的弊端是在同一个目录下同时只能有一个 Hive 客户端能使用数据库,否则会提示如下错误(这是一个很常见的错误):
《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

完成之后会在打印的信息中有这么一段,里边指明了初始密码的所在路径,记住这个路径,后边用密码的时候去里边找
《hive基础入门与环境的搭建》

安装客户端client:

[root@hadoop-01 software]# rpm -ivh MySQL-client-5.6.26-1.linux_glibc2.5.x86_64.rpm

《hive基础入门与环境的搭建》

开启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

《hive基础入门与环境的搭建》

修改登录密码,使用命令:set PASSWORD=PASSWORD('密码');,命令不区分大小写。
修改完成,退出MySQL,重新登录验证密码是否修改成功

mysql> set password=password('123456');

《hive基础入门与环境的搭建》

增加远程登录权限(主要是允许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基础入门与环境的搭建》

修改hive-env.sh文件,在里边把48行的注释取消,然后把值改成hadoop的安装目录,如图:
《hive基础入门与环境的搭建》

  1. 将 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

《hive基础入门与环境的搭建》

启动mysql服务

[cj@hadoop-01 ~]$ service mysql start

启动hive

[cj@hadoop-01 ~]$ hive

看到这样说明启动成功
《hive基础入门与环境的搭建》

启动hive之前一定要记得启动HDFS集群和YARN集群,因为hive是建立在它们之上的,如果没有启动这两个集群,则会报如下错误:
《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

《hive基础入门与环境的搭建》

(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

如图:
《hive基础入门与环境的搭建》

让配置文件立即生效

[cj@hadoop-03 conf]$ source ~/.bash_profile 

Hive 启动 hive thrift 服务端,使用命令:

[cj@hadoop-01 hive-1.2.1]$ hiveserver2 

如图:这里标明了操作状态
《hive基础入门与环境的搭建》

启动后命令行会一直监听不退出,然后我们再创建一个hadoop-01的连接,使用进程查看命令netstat -natp查看,我们可以看到它监听了10000端口:

《hive基础入门与环境的搭建》

然后在hadoop-03中执行 beeline 命令(在哪个路径下执行都可以):

[cj@hadoop-03 conf]$ beeline

默认端口为 10000,可通过 hive.server2.thrift.port 参数调整,beeline> !connect jdbc:hive2://hadoop-01:10000,这条命令之中,hadoop-01:mysql所在的节点,我的是把mysql装在了hadoop-01上,还有,在这里使用hadoop-01的前提是配置了/etc/hosts里边配置了地址映射(每台机器都需要)

《hive基础入门与环境的搭建》

执行beeline后的结果如图:
《hive基础入门与环境的搭建》

看到这样的结果就说明远程模式搭建可以了。

3、 Hive 的三种连接方式

1、CLI
2、HiveServer2/beeline
3、Web UI这种方式相对前两种来说,用得比较少,所以这里不做详细介绍。这个还需要额外的配置。

    原文作者:呀小白
    原文地址: https://www.jianshu.com/p/793140d020b8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞