一、hive的安装
二、hive的使用
一、启动集群
1,([root@hdp-1 ~]#)启动hdfs,yarn,zookeeper,kafka
(1)启动hdfs,yarn(start-dfs.sh和start-yarn.sh)
start-all.sh
(2) 脚本文件启动zookeeper
./zkmanager.sh start
zkmanager.sh
#!/bin/bash
for host in hdp-1 hdp-2 hdp-4
do
echo "${host}:${1}ing..."
ssh $host "source /etc/profile;/root/apps/zookeeper-3.4.6/bin/zkServer.sh $1"
done
增加可执行权限
chmod +x zkmanager.sh
(3)脚本文件启动kafka
./kafkaManager.sh start
vi kafkaManager.sh
#!/bin/bash
for host in hdp-1 hdp-2 hdp-4
do
echo "${host}:${1}ing..."
ssh $host "source /etc/profile;/root/apps/kafka_2.12-2.2.0/bin/kafka-server-$1.sh -daemon /root/apps/kafka_2.12-2.2.0/config/server.properties"
done
二、启动hive服务
1,最简单运行:([root@hdp-1 apache-hive-1.2.1-bin]#)
bin/hiveserver2
查看10000端口为当前服务端口
netstat -nltp
2,启动服务在后台运行([root@hdp-1 apache-hive-1.2.1-bin]#)
nohup bin/hiveserver2 1>/dev/null 2>&1 &
3,客户端链接hive服务器:([root@hdp-1 apache-hive-1.2.1-bin]#)
启动成功后,可以在别的节点上用beeline去连接
方式(一)
bin/beeline
回车,进入beeline的命令界面
输入命令连接hiveserver2
!connect jdbc:hive2://hdp-3:10000
方式(二)
启动时直接连接:
bin/beeline -u jdbc:hive2://hdp-3:10000 -n root
查看程序的进程
ps -ef | group proname
三、脚本化运行
四、hive建库建表与数据导入
一、建库
hive中有一个默认的库:
库名: default
库目录:hdfs://hdp-1:9000/user/hive/warehouse
在分布式文件系统中看不到以default为名字的数据库
如果在default数据库中创建table,则出现在user/hive/warehouse下
新建库:(hive>)
create database db_order;
库建好后,在hdfs中会生成一个库目录:
hdfs://hdp-1:9000/user/hive/warehouse/db_order.db
二、建表
1,建表(hive>)
use school;
create table teacher(id string,name string,gender string);
表建好后,会在所属的库目录中生成一个表目录
/user/hive/warehouse/school/teacher
只是,这样建表的话,hive会认为表数据文件中的字段分隔符为 ^A
2,正确的建表语句为:(hive>)
create table teacher(id string,name string,gender string)
row format delimited
fields terminated by ',';
这样就指定了,我们的表数据文件中的字段分隔符为 ","
3,([root@hdp-1 ~]#)脚本插入数据
vi testdata.dat
脚本数据代码
1,lucas,male
2,nimoo,female
3,jack,male
把脚本文件中的数据插入到teacher表中
hadoop fs -put testdata.dat /user/hive/warehouse/school.db/teacher
三、删除表
删除表(hive>)
drop table teacher;
删除表的效果是:
hive会从元数据库中清除关于这个表的信息;
hive还会从hdfs中删除这个表的表目录(有时候删不了)
四、内部表和外部表
1,内部表(MANAGED_TABLE):表目录按照hive的规范来部署,位于hive的仓库目录/user/hive/warehouse中
2,外部表(EXTERNAL_TABLE):表目录由建表用户自己指定
(1)建脚本文件([root@hdp-1 ~]#)
vi pv.log
(2)脚本数据代码 ([root@hdp-1 ~]#)
1,lucas,male
2,nimoo,female
3,jack,male
Esc :wq
//忽略这一步,把pv.log移动到hiveData文件夹
mv pv.log hiveData
(3)创建表(hive>)
create external table t_pvlog(id string, name string, gender string)
row format delimited
fields terminated by ','
location '/pvlog/pv';
(4)方法1将文件上传([root@hdp-1 ~]#)
hadoop fs -put pv.log /pvlog/pv/
方法2将数据插入到表中(hive>)
load data local inpath '/root/hiveData/pv.log' into table school.t_pvlog;
外部表和内部表的特性差别:
1,内部表的目录在hive的仓库目录中 VS 外部表的目录由用户指定
2,drop一个内部表时:hive会清除相关元数据,并删除表数据目录
3,drop一个外部表时:hive只会清除相关元数据;
一个hive的数据仓库,最底层的表,一定是来自于外部系统,为了不影响外部系统的工作逻辑,在hive中可建external表来映射这些外部系统产生的数据目录;
然后,后续的etl操作,产生的各种表建议用managed_table
五、分区表
分区表的实质是:在表目录中为数据文件创建分区子目录,以便于在查询时,MR程序可以针对分区子目录中的数据进行处理,缩减读取数据的范围。
一、一个分区字段的实例
(1)数据([root@hdp-1 ~]#)
vi personv.log.21
192.168.33.2,http://www.sina.com/a, 2019-05-30 20:08:24
192.168.33.3,http://www.sina.com/b, 2019-05-30 21:08:24
192.168.33.4,http://www.sina.com/a, 2019-05-30 22:08:24
192.168.33.5,http://www.sina.com/c, 2019-05-30 23:08:24
192.168.33.2,http://www.sina.com/a, 2019-05-30 24:08:24
192.168.33.7,http://www.sina.com/b, 2019-05-30 20:09:24
192.168.33.2,http://www.sina.com/a, 2019-05-30 20:12:24
:%s/30/21/g
替换所有的30成21
cp personv.log.21 personv.log.22
(2)建分区表(hive>)
create table school.t_personvlog(ip string,url string,access_time string)
partitioned by(day string)
row format delimited
fields terminated by ',';
注意:分区字段不能是表定义中的已存在字段
(3)插入数据(hive>)
load data local inpath '/root/hiveData/personv.log.21' into table school.t_personvlog partition(day='20191021');
load data local inpath '/root/hiveData/personv.log.22' into table school.t_personvlog partition(day='201910222');
(4)查询(hive>)针对分区进行查询
select * from school.t_personvlog;
+------------------+------------------------+---------------------------+-------------------+--+
| t_personvlog.ip | t_personvlog.url | t_personvlog.access_time | t_personvlog.day |
+------------------+------------------------+---------------------------+-------------------+--+
| 192.168.33.2 | http://www.sina.com/a | 2019-10-21 20:08:24 | 20191021 |
| 192.168.33.3 | http://www.sina.com/b | 2019-10-21 21:08:24 | 20191021 |
| 192.168.33.4 | http://www.sina.com/a | 2019-10-21 22:08:24 | 20191021 |
| 192.168.33.5 | http://www.sina.com/c | 2019-10-21 23:08:24 | 20191021 |
| 192.168.33.2 | http://www.sina.com/a | 2019-10-21 24:08:24 | 20191021 |
| 192.168.33.7 | http://www.sina.com/b | 2019-10-21 20:09:24 | 20191021 |
| 192.168.33.2 | http://www.sina.com/a | 2019-10-21 20:12:24 | 20191021 |
| 192.168.33.2 | http://www.sina.com/a | 2019-10-22 20:08:24 | 20191022 |
| 192.168.33.3 | http://www.sina.com/b | 2019-10-22 22:08:24 | 20191022 |
| 192.168.33.4 | http://www.sina.com/a | 2019-10-22 22:08:24 | 20191022 |
| 192.168.33.5 | http://www.sina.com/c | 2019-10-22 23:08:24 | 20191022 |
| 192.168.33.2 | http://www.sina.com/a | 2019-10-22 24:08:24 | 20191022 |
| 192.168.33.7 | http://www.sina.com/b | 2019-10-22 20:09:24 | 20191022 |
| 192.168.33.2 | http://www.sina.com/a | 2019-10-22 20:12:24 | 20191022 |
+------------------+------------------------+---------------------------+-------------------+--+
方式一:统计表中所有数据总PV
select count(*) a from school.t_personvlog;
注:a为别名
结果为:
+------+--+
| a |
+------+--+
| 14 |
+-----二、多个分区字段示例-+--+
方式二:统计10月21日的总PV
select count(*) b from school.t_personvlog where day='20191021';
注:b为别名
结果为:
+------+--+
| b |
+------+--+
| 7 |
+------+--+
二、多个分区字段示例