目录
1.Hive基本概念
1.1.Hive简介
1.1.1.什么是Hive
1.1.2.为什么使用Hive
1.1.3.Hive特点
1.2.Hive和RDBMS的对比
1.3.Hive架构
1.4.Hive的数据存储
2.Hive环境搭建
2.1.Hive安装
2.1.1.内嵌derby版本
2.1.2.外置MySQL版本
2.1.3.Linux RPM方式MySQL
2.2.Hive使用方式,即三种连接方式
2.2.1.CLI
2.2.2.HiveServer2/beeline
2.2.3.Web UI
3.Hive基本使用
Hive 由 Facebook 实现并开源,是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据映射为一张数据库表,并提供 HQL(Hive SQL)查询功能,底层数据是存储在 HDFS 上。Hive的本质是将 SQL 语句转换为 MapReduce 任务运行,使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,适用于离线的批量数据计算。
数据仓库之父比尔·恩门(Bill Inmon)在 1991 年出版的“Building the Data Warehouse”(《建立数据仓库》)一书中所提出的定义被广泛接受——数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。
Hive 依赖于 HDFS 存储数据,Hive 将 HQL 转换成 MapReduce 执行,所以说 Hive 是基于 Hadoop 的一个数据仓库工具,实质就是一款基于 HDFS 的 MapReduce计算框架,对存储在 HDFS 中的数据进行分析和管理。
直接使用 MapReduce 所面临的问题:
为什么要使用 Hive:
优点:
缺点:
对比项 | Hive | RDBMS |
查询语言 | HQL | SQL |
数据存储 | HDFS | Raw Device or Local FS |
执行器 | MapReduce | Executor |
数据插入 | 支持批量导入/单条插入 | 支持单条或者批量导入 |
数据操作 | 覆盖追加 | 行级更新删除 |
处理数据规模 | 大 | 小 |
执行延迟 | 高 | 低 |
分区 | 支持 | 支持 |
索引 | 0.8 版本之后加入简单索引 | 支持复杂的索引 |
扩展性 | 高(好) | 有限(差) |
数据加载模式 | 读时模式(快) | 写时模式(慢) |
应用场景 | 海量数据查询 | 实时查询 |
总结:Hive 具有 SQL 数据库的外表,但应用场景完全不同,Hive 只适合用来做海量离线数据统计分析,也就是数据仓库。
基本组成
一、用户接口
CLI,Shell 终端命令行(Command Line Interface),采用交互形式使用 Hive 命令行与 Hive进行交互,最常用(学习,调试,生产)。
JDBC/ODBC,是 Hive 的基于 JDBC 操作提供的客户端,用户(开发员,运维人员)通过这连接至 Hive server 服务。
Web UI,通过浏览器访问 Hive。
二、Thrift Server
Thrift 是 Facebook 开发的一个软件框架,可以用来进行可扩展且跨语言的服务的开发,Hive 集成了该服务,能让不同的编程语言调用 Hive 的接口。
三、元数据存储
元数据,通俗的讲,就是存储在 Hive 中的数据的描述信息。
Hive 中的元数据通常包括:数据描述信息、表的描述信息、表的字段的描述信息。
Metastore 默认存在自带的 Derby 数据库中。缺点就是不适合多用户操作,并且数据存储目录不固定。数据库跟着 Hive 走,极度不方便管理。
解决方案:通常存我们自己创建的 MySQL 库(本地 或 远程)。
Hive 和 MySQL 之间通过 MetaStore 服务交互。
四、Driver:编译器(Compiler)、优化器(Optimizer)、执行器(Executor)
Driver 组件完成 HQL 查询语句从词法分析,语法分析,编译,优化,以及逻辑执行计划生成。生成的逻辑执行计划存储在 HDFS 中,并随后由 MapReduce 调用执行。
Hive 的核心是驱动引擎, 驱动引擎由四部分组成:
五、执行流程
HiveQL 通过命令行或者客户端提交,经过 Compiler 编译器,运用 MetaStore 中的元数据进行类型检测和语法分析,生成一个逻辑方案(Logical Plan),然后通过的优化处理,产生一个 MapReduce 任务。
1.Hive 的存储结构包括数据库、表、视图、分区和表数据等。数据库,表,分区等等都对应 HDFS 上的一个目录。表数据对应 HDFS 对应目录下的文件。
2.Hive 中所有的数据都存储在 HDFS 中,没有专门的数据存储格式,因为 Hive 是读模式(Schema On Read),可支持 TextFile,SequenceFile,RCFile 或者自定义格式等。
3.只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。Hive 的默认列分隔符:控制符 Ctrl + A,\x01,Hive 的默认行分隔符:换行符 \n。
4.Hive 中包含以下数据模型:
database:在 HDFS 中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
table:在 HDFS 中表现所属 database 目录下一个文件夹
external table:与 table 类似,不过其数据存放位置可以指定任意 HDFS 目录路径
partition:在 HDFS 中表现为 table 目录下的子目录
bucket:在 HDFS 中表现为同一个表目录或者分区目录下根据某个字段的值进行 hash 散列之后的多个文件
view:与传统数据库类似,只读,基于基本表创建
5.Hive 的元数据存储在 RDBMS 中,除元数据外的其它所有数据都基于 HDFS 存储。默认情况下,Hive 元数据保存在内嵌的 Derby 数据库中,只能允许一个会话连接,只适合简单的测试。实际生产环境中不适用,为了支持多用户会话,则需要一个独立的元数据库,使用MySQL 作为元数据库,Hive 内部对 MySQL 提供了很好的支持。
6.Hive 中的表分为内部表、外部表、分区表和 Bucket 表
内部表和外部表的区别:
内部表和外部表的使用选择:
分区表和分桶表的区别:
1.上传安装包 apache-hive-2.3.2-bin.tar.gz
2.解压安装包 tar -zxvf apache-hive-2.3.2-bin.tar.gz -C /home/hadoop/apps/
3.进入到 bin 目录,运行 hive 脚本:[hadoop@hadoop02 bin]$ ./hive
注意:
如果报错就按照此方式解决,没有报错就不用管,在使用新的 hadoop-2.7.5 版本中已经不存在这个问题。所以不用关注。
1.准备好 MySQL(请参考以下文档,或者自行安装 MySQL,或者一个可用的 MySQL)
2.上传安装包 apache-hive-2.3.2-bin.tar.gz
3.解压安装包 tar -zxvf apache-hive-2.3.2-bin.tar.gz -c ~/apps/
4. 修改配置文件
[hadoop@hadoop02 conf]# touch hive-site.xml
[hadoop@hadoop02 conf]# vi hive-site.xml
javax.jdo.option.ConnectionURL
jdbc:mysql://hadoop02:3306/hivedb?createDatabaseIfNotExist=true
JDBC connect string for a JDBC metastore
javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver
Driver class name for a JDBC metastore
javax.jdo.option.ConnectionUserName
root
username to use against metastore database
javax.jdo.option.ConnectionPassword
root
password to use against metastore database
可选配置,该配置信息用来指定 Hive 数据仓库的数据存储在 HDFS 上的目录
hive.metastore.warehouse.dir
/user/hive/warehouse
hive default warehouse, if nessecory, change it
5.一定要记得加入 MySQL 驱动包(mysql-connector-java-5.1.40-bin.jar)该 jar 包放置在 hive的根路径下的 lib 目录。
6.安装完成,配置环境变量
vi ~/.bashrc 添加以下两行内容:
export HIVE_HOME=/home/hadoop/apps/apache-hive-2.3.2-bin
export PATH=$PATH:$HIVE_HOME/bin
保存退出。
最后不要忘记:[hadoop@hadoop02 bin]$ source ~/.bashrc
7.验证 Hive 安装
[hadoop@hadoop02 bin]$ hive --help
8.初始化元数据库
注意:当使用的 hive 是 2.x 之前的版本,不做初始化也是 OK 的,当 hive 第一次启动的
时候会自动进行初始化,只不过会不会生成足够多的元数据库中的表。在使用过程中会
慢慢生成。但最后进行初始化。如果使用的 2.x 版本的 Hive,那么就必须手动初始化元
数据库。使用命令:
[hadoop@hadoop02 bin]$ schematool -dbType mysql -initSchema
9.启动 Hive 客户端
[hadoop@hadoop02 bin]$ hive --service cli
10.退出 Hive
hive> quit; 或者 hive> exit;
(记得使用 root 账户进行操作,若使用普通用户,那么请修改相应文件夹权限)
1.检查以前是否装过 MySQL
rpm -qa|grep -i mysql
结果:
2.发现有的话就都卸载
3.删除老版本 mysql 的开发头文件和库
rm -fr /usr/lib/mysql #数据库目录
rm -fr /usr/include/mysql
rm -f /etc/my.cnf
rm -fr /var/lib/mysql
注意:卸载后/var/lib/mysql 中的数据及/etc/my.cnf 不会删除,确定没用后就手工删除
4.准备安装包 MySQL-5.6.26-1.linux_glibc2.5.x86_64.rpm-bundle.tar, 上传,解压
命令:tar -zxvf MySQL-5.6.26-1.linux_glibc2.5.x86_64.rpm-bundle.tar
5.开始安装
6.安装 server
rpm -ivh MySQL-server-5.6.26-1.linux_glibc2.5.x86_64.rpm
开头:
结尾:
如上图所提示,即安装 server 成功!
7.安装客户端
rpm -ivh MySQL-client-5.6.26-1.linux_glibc2.5.x86_64.rpm
8.登陆 MYSQL(登录之前千万记得一定要启动 mysql 服务)
启动命令:(注意启动的权限问题)
[hadoop@hadoop01 ~]$ service mysql start
然后登陆,初始密码在 /root/.mysql_secret 这个文件里
9.修改密码
set PASSWORD=PASSWORD('root');
10.退出登陆验证,看是否改密码成功
11.增加远程登陆权限,执行以下两个命令:
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;
命令释义:grant 权限 1,权限 2,„权限 n on 数据库名称.表名称 to 用户名@用户地址
identified by '密码';
PS:1,权限 2,„权限 n 代表 select,insert,update,delete,create,drop,index,alter,grant,
references,reload,shutdown,process,file 等 14 个权限。
当权限 1,权限 2,„权限 n 被 all privileges 或者 all 代替,表示赋予用户全部权限。
当数据库名称.表名称被*.*代替,表示赋予用户操作服务器上所有数据库所有表的权限。
用户地址可以是 localhost,也可以是 ip 地址、机器名字、域名。也可以用’%’地址连接。
12.至此 mysql 安装成功
13.更改数据库的默认编码为 UTF-8
进入到 bin 目录下,直接输入命令:
[hadoop@hadoop02 ~]$ hive
启动成功的话如上图所示,接下来便可以做 hive 相关操作。
补充:
1.上面的 hive 命令相当于在启动的时候执行:hive --service cli
2.使用 hive --help,可以查看 hive 命令可以启动那些服务
3.通过 hive --service serviceName --help 可以查看某个具体命令的使用方式
在现在使用的最新的 hive-2.3.2 版本中:都需要对 hadoop 集群做如下改变,否则无法使用
第一:修改 hadoop 集群的 hdfs-site.xml 配置文件:加入一条配置信息,表示启用 webhdfs
第二:修改 hadoop 集群的 core-site.xml 配置文件:加入两条配置信息:表示设置 hadoop的代理用户
配置解析:
hadoop.proxyuser.hadoop.hosts 配置成*的意义,表示任意节点使用 hadoop 集群的代理用户
hadoop 都能访问 hdfs 集群,hadoop.proxyuser.hadoop.groups 表示代理用户的组所属
以上操作做好了之后,请继续做如下两步:
第一步:先启动 hiveserver2 服务
启动方式,(假如是在 hadoop02 上):
启动为前台:hiveserver2
启动为后台:
nohup hiveserver2 1>/home/hadoop/hiveserver.log 2>/home/hadoop/hiveserver.err &
或者:nohup hiveserver2 1>/dev/null 2>/dev/null &
或者:nohup hiveserver2 >/dev/null 2>&1 &
以上 3 个命令是等价的,第一个表示记录日志,第二个和第三个表示不记录日志
命令中的 1 和 2 的意义分别是:
1:表示标准日志输出
2:表示错误日志输出
如果我没有配置日志的输出路径,日志会生成在当前工作目录,默认的日志名称叫做:
nohup.xxx
PS:nohup 命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,
那么可以使用 nohup 命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。
nohup 就是不挂起的意思(no hang up)。
该命令的一般形式为:nohup command &
第二步:然后启动 beeline 客户端去连接:
执行命令:
beeline -u jdbc:hive2://hadoop02:10000 -n hadoop
-u : 指定元数据库的链接信息
-n : 指定用户名和密码
另外还有一种方式也可以去连接:先执行 beeline,然后按图所示输入:!connect jdbc:hive2://hadoop02:10000 按回车,然后输入用户名,这个用户名就是安装 hadoop 集群的用户名
接下来便可以做 hive 操作。
1.下载对应版本的 src 包:apache-hive-2.3.2-src.tar.gz
2.上传,解压
tar -zxvf apache-hive-2.3.2-src.tar.gz
3.然后进入目录${HIVE_SRC_HOME}/hwi/web,执行打包命令:
jar -cvf hive-hwi-2.3.2.war *
在当前目录会生成一个 hive-hwi-2.3.2.war
4.得到 hive-hwi-2.3.2.war 文件,复制到 hive 下的 lib 目录中
cp hive-hwi-2.3.2.war ${HIVE_HOME}/lib/
5.修改配置文件 hive-site.xml
hive.hwi.listen.host
0.0.0.0
监听的地址
hive.hwi.listen.port
9999
监听的端口号
hive.hwi.war.file
lib/hive-hwi-2.3.2.war
war 包所在的地址
6.复制所需 jar 包
cp ${JAVA_HOME}/lib/tools.jar ${HIVE_HOME}/lib
再寻找三个 jar 包,都放入${HIVE_HOME}/lib 目录:
commons-el-1.0.jar
jasper-compiler-5.5.23.jar
jasper-runtime-5.5.23.jar
不然启动 hwi 服务的时候会报错。
7. 安装 ant
1)上传 ant 包:apache-ant-1.9.4-bin.tar.gz
2) 解压
tar -zxvf apache-ant-1.9.4-bin.tar.gz -C ~/apps/
3)配置环境变量
vi /etc/profile
在最后增加两行:
export ANT_HOME=/home/hadoop/apps/apache-ant-1.9.4
export PATH=$PATH:$ANT_HOME/bin
配置完环境变量别忘记执行:source /etc/profile
4) 验证是否安装成功
8.上面的步骤都配置完,基本就大功告成了。进入${HIVE_HOME}/bin 目录:
${HIVE_HOME}/bin/hive --service hwi
或者让在后台运行:
nohup bin/hive --service hwi > /dev/null 2> /dev/null &
9.前面配置了端口号为 9999,所以这里直接在浏览器中输入:
hadoop02:9999/hwi
10.至此大功告成
1.创建库:create database if not exists mydb;
2.查看库:show databases;
3.切换数据库:use mydb;
4.创建表:create table if not exists t_user(id string, name string)
或 create table t_user(id string, name string) row format delimited fields terminated by ',';
5.查看表列表:show tables;
6.插入数据:insert into table t_user values ('1','huangbo'), ('2','xuzheng'), ('3','wangbaoqiang');
7.查询数据:select * from t_user;
8.导入数据:
user.txt 的数据为:
9.再次查询数据:select * from t_user;
小技能补充:
1.进入到用户的主目录,使用命令 cat /home/hadoop/.hivehistory 可以查看到 hive 执行的历史命令
2.执行查询时若想显示表头信息时,请执行命令:Hive> set hive.cli.print.header=true;
3.hive的执行日志的存储目录在${java.io.tmpdir}/${user.name}/hive.log中,假如使用hadoop用户操作的 hive,那么日志文件的存储路径为:/temp/hadoop/hive.log