hive是基于hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表并提供类sql查询功能
准备工作
- 安装Hive之前必须配置好hadoop环境
- 安装Hive之前必须配置好JDK
- 安装好mysql数据库
- Hive可以只安装在namenode所在的机器上,如果NameNode有多个,则每个都需要安装,可以不在datanode上安装
为什么要用Hive
- 直接使用hadoop所面临的问题:
- 人员学习成本太高
- 项目周期要求太短
- MapReduce实现复杂查询逻辑开发难度太大
- 为什么要使用Hive
- 操作接口采用类SQL语法,提供快速开发的能力。
- 避免了去写MapReduce,减少开发人员的学习成本。
- 扩展功能很方便。
-
Hive的特点:可扩展,延展性,容错
-
Hive的数据存储
- Hive中所有的数据都存储在 HDFS 中,没有专门的数据存储格式(可支持Text,SequenceFile,ParquetFile,RCFILE等)
- 只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。
- Hive 中包含以下数据模型:DB、Table,External Table,Partition,Bucket。
- db:在hdfs中表现为${hive.metastore.warehouse.dir}目录下一个文件夹
- table:在hdfs中表现所属db目录下一个文件夹
- external table:与table类似,不过其数据存放位置可以在任意指定路径
- partition:在hdfs中表现为table目录下的子目录
- bucket:在hdfs中表现为同一个表目录下根据hash散列之后的多个文件
hive安装
解压:
tar -zxvf apache-hive-2.3.7-bin.tar.gz |
把解压后的文件移到目录/usr/local/下:
mv apache-hive-2.3.7-bin /usr/local/hive |
配置hive环境变量
vim /etc/profile |
输入下面内容
export HIVE_HOME=/usr/local/hive |
授权
sudo chown -R hadoop:hadoop /usr/local/hive |
使配置文件的修改生效
source /etc/profile |
配置hive
配置hive-site.xml
进入目录
cd $HIVE_CONF_DIR |
拷贝hive-default.xml.template并重命名为hive-site.xml
cp hive-default.xml.template hive-site.xml |
编辑hive-site.xml
vim hive-site.xml |
使用hadoop新建hdfs目录 因为在hive-site.xml中有这样的配置
<name>hive.metastore.warehouse.dir</name> |
所以要在Hadoop集群新建/user/hive/warehouse目录,执行命令
# 进入Hadoop主目录 |
修改hive-site.xml中的临时目录
将hive-site.xml文件中的${system:java.io.tmpdir}
替换为hive的临时目录,例如我替换为/usr/local/hive/tmp
,该目录如果不存在则要自己手工创建,并且赋予读写权限。
cd $HIVE_HOME |
编辑hive-site
vim hive-site.xml |
在vim中使用下面的代码替换${system:java.io.tmpdir}
:%s#${system:java.io.tmpdir}#/usr/local/hive/tmp#g |
再将配置文件中${system:user.name}
全部替换为root
:%s#${system:user.name}#root#g |
例如原来:
<property> |
替换为:
<property> |
修改hive-site.xml数据库相关的配置
javax.jdo.option.ConnectionDriverName
,将该name对应的value修改为MySQL驱动类路径:
<property> |
javax.jdo.option.ConnectionURL
,将该name对应的value修改为MySQL的地址:
<name>javax.jdo.option.ConnectionURL</name> |
javax.jdo.option.ConnectionUserName
,将对应的value修改为MySQL数据库登录名:
<name>javax.jdo.option.ConnectionUserName</name> |
javax.jdo.option.ConnectionPassword
,将对应的value修改为MySQL数据库的登录密码:
<name>javax.jdo.option.ConnectionPassword</name> |
将MySQL驱动包上载到Hive的lib目录下
cp /home/heyj/down/mysql-connector-java-5.1.36.jar $HIVE_HOME/lib/ |
新建hive-env.sh文件并进行修改
cd $HIVE_CONF_DIR |
编辑配置文件并加入以下配置:
# Set HADOOP_HOME to point to a specific hadoop install directory |
创建元数据库
登录mysql数据库
mysql -u root -p |
mysql创建hive用户密码
mysql> CREATE DATABASE hive; |
从Hive 2.1开始,我们需要运行下面的schematool命令作为初始化步骤,MySQL数据库初始化
# 进入到hive的bin目录 |
执行成功后,在mysql的hive数据库里已生成metadata数据表:
启动Hive
执行hive的sql命令,在sql位置输入sql命令
hive -e 'sql' |
或者启动hive,在命令行输入sql
hive |
显示hive中所有的内置函数,测试hive是否可用
hive> show functions; |
不报错就安装成功了
启动hiveserver2
启动为前台
hiveserver2 |
或者使用下面的命令启动
hive --service hiveserver2 |
启动为后台
nohup hiveserver2 1>/var/log/hiveserver.log 2>/var/log/hiveserver.err & |
停止服务
ps -aux | grep hiveserver2 | grep -v grep | awk '{print $2}' # 获取进程id |
启动成功后,可以在别的节点上用beeline去连接,有两种方法:
-
beeline
回车,进入beeline的命令界面 输入命令连接hiveserver2beeline> !connect jdbc:hive2://localhost:10000
(hadoop01是hiveserver2所启动的那台主机名,端口默认是10000)
-
或者启动就连接:
beeline -u jdbc:hive2://localhost:10000 -n hadoop
如果hiveserver2无法连接,修改hive.server2.authentication
<name>hive.server2.authentication</name> |
在hadoop的core-site.xml中追加
<property> |
浏览器打开ip(安装hive的主机ip地址)+端口10002,就能看到hiveserver2服务web页面
hive常用命令
显示命令
show tables;
-- 显示表
show databases;
-- 显示数据库
show partitions t_4;
-- 显示表分区
show functions;
-- 显示hive中所有的内置函数
desc t_name;
-- 显示表定义
desc extended t_name;
-- 显示表定义的详细信息
desc formatted table_name;
-- 显示表定义的详细信息,并且用比较规范的格式显示
show create table table_name;
-- 显示建表语句 可以查看表创建语句
创建表
create database hive_db
-- 创建数据库
use hive_db
-- 使用数据库
create table if not exists table_name (foo int, bar string) row format delimited fields terminated by ',' stored as textfile;
-- 创建内部表
create external table if not exists pageview(pageid int,page_url string comment 'The page URL') row format delimited fields terminated by ',' location 'hdfs://mini1:9000/user/hive/warehouse/'
-- 创建外部表
create table student_p(Sno int,Sname string,Sex string,Sage int,Sdept string) partition by(part string) row format delimited fields terminated by ',' stored as textfile;
-- 创建分区表
create table student(id int,age int,name string) partitioned by(stat_date string) clustered by(id) sorted by (age) into 2 buckets row format delimited fields terminated by ',';
-- 创建分桶表
修改表
alter table student_p add partition(part='a') partition(part='b');
-- 增加分区
alter table table_name rename to new_table_name;
-- 重命名表
删除表
drop table table_name;
-- 删除表
truncate table table_name;
-- 删除表中的数据
alter table table_name drop partition (partition_name='分区名')
-- 按分区删除数据
增加数据
load data local inpath '/home/hadoop/data/data.txt' into table table_name;
-- 本地模式加载数据到表