Hive
hive的简介
什么是Hive?
- Hive 是基于 Hadoop 的一个数据仓库工具
- 可以将结构化的数据文件映射为一张数据库表
- 并提供类 SQL 查询功能, Hive 底层是将 SQL 语句转换为 MapReduce 任务运行
为什么 使用 Hive?
- 直接使用 Hadoop 面临的问题
(1)人员学习成本太高
(2)项目周期要求太短
(3)MapReduce 实现复杂查询逻辑开发难度太大 - Hive 优势
(1)操作接口采用类 SQL 的语法,提供快速开发的能力
(2)避免写 MapReduce,减少开发人员的学习成本
(3)功能扩展很方便
Hive 架构
Hive 架构图
- 1,用户接口
CLI:Shell 终端命令行,最常用(学习、调试、生产)
JDBC/ODBC:是 Hive 的 Java 实现,与传统数据库 JDBC 类似, 用户(开发员、运维人员) 通过这连接至 Hive Server
Web UI:通过浏览器访问 Hive - 2,Thrift Server(跨语言服务)
Thrift 是 Facebook 开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发, Hive 集成了该服务,能让不同的编程语言调用 Hive 的接口。 - 3,Metastore(元数据存储)
- 元数据是什么?
通俗的讲,就是存储在 Hive 中的数据的描述信息。 - Hive 的元数据包括什么?
表的名字、表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。 - 默认存在哪里?
MetaStore 默认存在自带的 Derby 数据库中
缺点:不适合多用户操作,数据存储目录不固定。数据库跟着 Hive 走,极度不方便管理。 - 解决方案
通常将其存在我们自己创建的 MySQL 库中(本地 或 远程)
- 元数据是什么?
- 4,解析器(驱动Driver)
-
组成结构
编译器(Compiler)
优化器(Optimizer)
执行器(Executor)Driver 组件完成 HQL 查询语句从词法分析、语法分析、编译、优化以及逻辑执行计划的生成。生成的逻辑执行计划存储在 HDFS 中,并随后由 MapReduce 调用执行 。
- 执行流程
(1)输入一条 HQL 查询语句(select * from table)
(2)解析器对这条 HQL 语句进行语法分析
(3)编译器对这条 HQL 语句生成 HQL 的执行计划
(4)优化器生成最佳的 HQL 的执行计划
(5)执行器执行这条最佳 HQL 语句HiveQL 通过命令行或者客户端提交,经过 Compiler 编译器,运用 MetaStore 中的元数据进行类型检测和语法分析,生成一个逻辑方案(logical plan),然后通过优化处理,产生一个 MapReduce 任务。
- 执行流程
-
Hive与Hadoop的关系
Hive 依赖 HDFS 存储数据,利用 MapReduce 查询数据,所以说 Hive 是基于 Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce 计算框架。
Hive 和 RDBMS 的对比
总结:Hive 具有 SQL 数据库的外表,但应用场景完全不同, Hive 适合用来做批量海量数据统计分析,也就是数据仓库。
Hive 的数据存储
-
1,数据存储位置
HDFS -
2,数据格式
没有定义专门的数据存储格式,数据格式可由用户指定,只需要在创建表的时候指定三个属性:
(1)列分隔符:空格,’’\t"等
(2)行分隔符:"\n"
(3)读取文件数据的方法TextFile 为默认格式,存储方式为行存储。
SequenceFile 二进制文件,以<key,value>的形式序列化到文件中,存储方式为行存储。
RCFile 存储方式为按行分块,每块按照列存储。 -
数据模型
db:数据库 在 HDFS 中表现为 ${hive.metastore.warehouse.dir} 目录下一个文件夹 table:普通表(内部表) 在 HDFS 中表现所属 db 目录下一个文件夹 external table:外部表 与 table 类似,不过其数据存放位置可以在任意指定路径 partition:分区 在 HDFS 中表现为 table 目录下的子目录 bucket:分桶 在 HDFS 中表现为同一个表目录下根据 hash 散列之后的多个文件,会根据不同的文件把数据放到不同的文件中
Hive 环境搭建
1,Hive 三种运行模式
-
(1)内嵌模式
元数据保存在本地内嵌的 Derby 数据库,使用 Hive 最简单的方式
这种方式缺点也比较明显,因为一个内嵌的 Derby 数据库每次只能访问一个数据文件,这也就意味着它不支持多会话连接。并且数据存储目录不固定,数据库跟着 Hive 走,极度不方便管理。 -
(2)本地模式
元数据保存在本地独立的数据库中(一般是 MySQL)
多用户的模式,允许多个用户连接到一个数据库前提:每个用户必须要有对 MySQL 的访问权利,即用户需要知道 MySQL 的用户名和密码。
这种方式一般作为公司同时使用Hive
-
(3)远程模式
此模式应用于 Hive 客户端较多的情况,把 MySQL 数据库独立出来,将元数据保存在远程独立的数据库中(一般是 MySQL)
< 避免了在每个客户端都安装 MySQL 服务从而造成冗余浪费的情况 >
适用于多用户的模式无需知道 MySQL 的用户名和密码
Hive 安装
1,前期准备
-
(1)保证 Hadoop 集群搭建成功并启动
-
(2)下载 Hive 安装包并上传至 Linux 服务器
下载地址:https://hive.apache.org/ -
(3)解压 Hive 安装包
tar -zxvf apache-hive-1.2.1-bin.tar.gz
-
(4)配置环境变量
编辑配置文件,使用命令:vim /home/shiny/.bash_profile
将以下内容添加到配置文件的底部:
export HIVE_HOME=/home/shiny/Desktop/software/apache-hive-1.2.1-bin export PATH=$PATH:$HIVE_HOME/bin
让配置文件立即生效:
source /home/shiny/.bash_profile
验证 Hive,Hive 没有提供 hive –version 这种方式查看版本,所以使用如下命令:
hive --help
2,三种运行模式
-
1,内嵌模式安装
(1)切换到 HIVE_HOME/conf 目录下,修改 hive-env.sh 配置文件:[theone@hadoop01 conf]$ cp hive-env.sh.template hive-env.sh [theone@hadoop01 conf]$ vim hive-env.sh
(2)在 hive-env.sh 中添加 Hadoop 安装目录:
(3)替换 Hadoop 安装包中的 jline
Hadoop(%HADOOP_HOME%/share/hadoop/yarn/lib)集群的 jline-0.9.94.jar 包版本过低,替换成 %HIVE_HOME%/lib 中的 jline-2.12.jar 包即可。
(4)使用 Hive 的三种连接方式之一:CLI 启动 Hive[theone@hadoop01 conf]$ hive
(5)在当前目录生成一个 derby 文件和一个 metastore_db 目录,这种存储方式的弊端是在同一个目录下同时只能有一个 Hive 客户端能使用数据库,否则会提示如下错误(这是一个很常见的错误):
-
2,本地模式安装
-
1,安装 MySQL(root用户安装)
(1)检查 是否安装过 MySQL,若有则卸载:
查找:rpm -qa | grep -i mysql
卸载:rpm -e --nodeps mysql-libs-5.1.73-7.el6.x86_64
-
(2)删除老版本 MySQL 的开发头文件和库:
rm -rf /usr/lib/mysql rm -rf /usr/include/mysql rm -f /etc/my.cnf rm -rf /var/lib/mysql
注意:卸载后 /var/lib/mysql(数据库文件的存放目录) 中的数据及 /etc/my.cnf(配置文件) 不会删除, 确定没用后就手工删除。
-
(3)准备安装包,上传至Linux服务器并解压:
tar -xvf MySQL-5.6.26-1.linux_glibc2.5.x86_64.rpm-bundle.tar
-
(4)安装服务端Server:
rpm -ivh MySQL-server-5.6.26-1.linux_glibc2.5.x86_64.rpm
开头:
结尾:-
(5)安装客户端client:
rpm -ivh MySQL-client-5.6.26-1.linux_glibc2.5.x86_64.rpm ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181118184654708.png)
-
(6)开启MySQL服务:
service mysql start
-
(7)登录MySQL,初始密码在/root/.mysql_secret 这个文件里:
-
(8)修改登录密码,使用命令:
mysql> set PASSWORD=PASSWORD(‘密码’);
修改完成,退出MySQL,重新登录验证密码是否修改成功 -
(9)增加远程登录权限,执行以下三个命令:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'shiny' WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'hadoop01' IDENTIFIED BY 'shiny' 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 用户在 hadoop01(Hive 安装主机) 进行远程登陆,并设置 root 用户的密码为 shiny。
WITH GRANT OPTION:用于对象授权。使用 with grant option,被授权用户可将所获得的权限再次授予其它用户或角色。
FLUSH PRIVILEGES:告诉服务器重新加载授权表。主要是允许xx用户在Hive安装主机上进行远程登陆
-
-
-
2,修改 Hive 配置
(1)修改 Hive 配置文件,使用命令:vim hive-site.xml
(2)将以下内容写入配置文件hive-site.xml中:<configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop01: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>shiny</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:登录数据库的密码
(3)将 MySQL 的驱动包(mysql-connector-java-5.1.40-bin.jar)放到 %HIVE_HOME%/lib 目录下
(4)启动 Hive:[theone@hadoop01 conf]$ hive
-
3,远程模式安装
- (1)简介:
这种模式需要使用 HIVE_HOME/bin 目录下提供的 beeline+hiveserver2 配合使用才可以。
其原理就是将 metadata 作为一个单独的服务进行启动。各种客户端通过 beeline 来连接,连接之前无需知道数据库的用户名和密码。
-
(2)安装步骤:
1,因其连接之前无需知道数据库的用户名和密码,所以在 hive-site.xml 中只需要配置以下两项即可,其他步骤和本地模式一样:<configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop01: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>
javax.jdo.option.ConnectionURL:JDBC连接字符串
javax.jdo.option.ConnectionDriverName:JDBC的driver
2,Hive 启动 hive thrift 服务端,使用命令:
hiveserver2
启动后命令行会一直监听不退出,我们可以看到它监听了10000端口:
3,新开一个命令行窗口,执行 beeline 命令:
beeline
默认端口为 10000,可通过hive.server2.thrift.port 参数调整
3,Hive 的三种连接方式
- 1,CLI
- 2,HiveServer2/beeline
- 3,Web UI,这种方式相对前两种来说,用得比较少,所以这里不做详细介绍。