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架构

对架构的解释
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 依赖 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的安装目录,如图:
  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

启动mysql服务

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

启动hive

[cj@hadoop-01 ~]$ hive

看到这样说明启动成功

启动hive之前一定要记得启动HDFS集群和YARN集群,因为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

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

执行beeline后的结果如图:

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

3、 Hive 的三种连接方式

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容