Hive 数据仓库
概述
- Hive 是 Hadoop的子项目, 但是后来被独立出来成为了Apache的一个顶级项目
- 是 Apache 提供的一套基于Hadoop的进行数据仓库管理的工具
- Hive 提供大量的类SQL(Hive QL 简称为, HQL) 来对Hadoop上的数据进行操作, 底层会将HQL语句转换为MapReduce程序
- 适合进行离线开发
- Hive可以管理HDFS上的数据, 用表结构的形式来管理HDFS上的数据
- 默认环境下: Hive的元数据信息不是存储在HDFS上的, 而是存储在Hive自带的Derby关系型数据库中
- Hive安装完成后, 在实际开发中通常都是要替换元数据库, 然而到目前为止Hive只支持Derby和Mysql两种, 需要将Derby替换为Mysql
- Derby 存在的问题
- Derby数据库是一种文件型数据库, 在进入检查的时候当前目录是否有metastore.db文件夹用来存储数据库数据, 如果有则直接使用, 如果没有就会默认创建一个新的目录, 一旦更换目录则意味着元数据就找不到了
- Derby数据库是一个单用户的数据库, 无法支持多用户同时操作, 而Hive使用Derby作为元数据库意味着也只能支持单用户操作, 这就导致了数据量大连接多的情况下会产生大量的连接积压
配置Hive的元数据库
1 编辑环境变量
vim /etc/profile
# Java
JAVA_HOME=/home/software/jdk1.8
PATH=$JAVA_HOME/bin:$PATH
# Hadoop
HADOOP_HOME=/home/software/hadoop-2.7.6
# Hive
HIVE_HOME=/home/software/hive-2.3.7
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:
2 配置Hive文件夹下conf文件加下
-
复制模板文件
cp hive-env.sh.te
mplate hive-env.sh` -
编辑
hive-env.sh
文件# Set HADOOP_HOME to point to a specific hadoop install directory line: 48 export JAVA_HOME=/home/software/jdk1.8 export HADOOP_HOME=/home/software/hadoop-2.7.6 # Hive Configuration Directory can be controlled by: export HIVE_CONF_DIR=/home/software/hive-2.3.7/conf # Folder containing extra libraries required for hive compilation/execution can be controlled by: export HIVE_AUX_JARS_PATH=/home/software/hive-2.3.7/lib
3 从hive-default.xml.template
中获取模板
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
</configuration>
4 新建并编辑 hive-site.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<!-- 指定Hive的数据存储目录 -->
<name>hive.metastore.warehouse.dir</name>
<value>/home/software/hive-2.3.7/warehouse</value>
</property>
<property>
<!-- 指定配置MySQL的连接字符串 -->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value>
</property>
<property>
<!-- 配置MySQL的连接驱动 -->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<!-- 配置登录MySQL的用户名 -->
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<property>
<!-- 配置登录MySQL的密码 -->
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
<property>
<!-- 配置Hive的慢查询的日志记录 -->
<name>hive.querylog.location</name>
<value>hdfs://192.168.61.130:9000/user/hive/log</value>
</property>
<property>
<!-- 配置 Hive 的 Server2 端口-->
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>
<property>
<!-- 配置 Hive 的 Server2 连接主机名称-->
<name>hive.server2.thrift.bind.host</name>
<value>192.168.61.130</value>
</property>
<property>
<!-- 配置 Hive 的元数据服务的uri-->
<name>hive.metastore.uris</name>
<value>thrift://192.168.61.130:9083</value>
</property>
</configuration>
- 查看系统默认数据源
rpm -qa | grep mariadb
- 删除默认数据源
rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
-
将mysql的java驱动放置到hive目录下的lib文件夹中
mv mysql-connector-java-5.1.38-bin.jar hive-2.3.7/lib/
下载安装MySQL
下载/更新 wget
yum -y install wget
wget 获取mysql安装包
wget https://dev.mysql.com/get/mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar
# 解压压缩包
tar -xvf mysql-5.7.18-1.el7.x86_64.rpm-bundle.tar
# 安装顺序
rpm -ivh mysql-community-common-5.7.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.18-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.18-1.el7.x86_64.rpm
如果出现问题报错则执行如下命令
yum install perl
yum install net-tools
# 然后再次运行如下命令
rpm -ivh mysql-community-server-5.7.18-1.el7.x86_64.rpm
报错信息: 归档文件中异常的EOF
==> 传输文件时, 未传输完成就进行文件移动, 重新传输文件即可
MySQL启动
启动MySQL
systemctl start mysqld
查看状态
systemctl status mysqld
设置开机启动
systemctl enable mysqld
获取初始密码
grep 'password' /var/log/mysqld.log
登录mysql 进入mysql客户端
mysql -u root -p
# 在提示输入密码中 输入上面的密码
修改mysql密码
set global validate_password_policy=0;
set global validate_password_length=1;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
退出重新使用命令mysql -u root -p
进入客户端 使用新密码登录, 登录成功即为成功
设置访问权限
grant all privileges on *.* to root@"%" identified by "root";
flush privileges;
初始化 Schema
schematool -initSchema -dbType mysql
初始化完成后, 会发现会有个hive的数据库
show databases;
# 使用hive数据库
use hive;
# 查看 hive 数据库中的数据表
show tables;
如果出现如上图所示, 则代表hive更换元数据库成功
启动metastoore服务
hive --service metastore &
程序会阻塞在这里, 可以按回车之后回到命令行, 该服务会在后台运行
Hive 常用命令
命令 | 效果 |
---|---|
show databases; | 显示数据库 |
create database park; | 创建一个park数据库 |
use park; | 进入使用 park 数据库 |
show tables; | 显示数据库中的所有表 |
create table stu(id int, name string) row format delimited fields terminated by ’ '; | 创建stu表及两个字段, 并以’ '作为分隔符 |
drop table stu; | 删除 stu 表 |
insert into stu values(1, ‘tom’); | 向stu表中插入数据 |
select * from stu; | 查看stu中所有的数据 |
load data local inpath ‘/home/haha.txt’ into table stu; | 将路径下的文件中的数据加载到stu表中, 其文件会上传到HDFS中 |
desc stu; | 查看 stu 表结构 |
create table stu1 like stu; | 创建一个表结构与stu相同的新表(只复制表结构, 而不复制结构) |
insert overwrite table stu1 select * from stu; | 从stu表重查出数据写入到 stu1 表中 |
insert overwrite local directory ‘/home/stu’ row format delimited fields terminated by ’ ’ select * from stu1; | 将从stu1表中查出来的数据写入到本地文件夹目录中 |
alter table stu rename stu2; | 将 stu 表重命名为 stu2 |
alter stu1 add columens(age int); | 为stu1 表增加一个age字段 |
exit; | 退出hive |
create external table word(name string, score int) row format delimited fields terminated by ’ ’ location ‘/txt/score2’ | 将hdfs文件加中的文件作为外部表通过hive进行管理 |
Hive 的表结构
1 外部表
HDFS里面已经存在数据, 然后通过Hive创建表结构管理HDFS上的数据
2 内部表
现在Hive中建立一个表结构然后向这个表中插入数据