概念
数据库
业务应用操作性处理联机事务处理(OLTP)面向交易存放的是实时数据(在线数据)数据库设计遵循三大范式,尽量避免冗余
数据仓库
面向数据分析依照分析需求、分析维度、分析指标进行设计存放的数据都是历史数据联机分析处理(OLAP)
Hive数据仓库
概念
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射成一张数据库表,并提供类SQL查询功能。Hive其实就是一个SQL解析引擎,它将SQL语句转译成M/R JOB然后在Hadoop上执行,以达到快速开发的目的。它的表其实就是一个Hadoop的目录/文件。不存储和计算数据。为大数据批量处理而生。
体系结构
Hive各模块组成
Hive运行机制
Hive安装模式
本地模式 只允许一个用户,元数据存储在derby数据库中,在一台服务器中单用户模式 只允许一个用户,元数据存储在单独mysql服务器中多用户模式 可以有多个用户,中间有一个元数据服务器
Hive环境搭建
Hadoop环境安装mysql数据库: 1)yum install mysql-server 2)启动mysql服务 : ①临时启动:chkconfig --> service mysqld start --> service mysqld status(显示进程id) --> ss -nal (显示端口号) ②永久启动:chkconfig mysqld on --> chkconfig mysqld --list (查看是否启动) --> mysql (进入mysql,首次没有密码) --> use mysql; --> show tables; 3)设置开机启动 4)修改权限: 接着上面 --> select user,host,password from user; --> GRANT ALL PRIVILEGES ON . TO ‘root’@’%’ IDENTIFIED BY ‘root’ WITH GRANT OPTION; --> flush privileges; --> select user,host,password from user; 5)windows中的navicat连接测试(密码root) 连接测试成功后 --> 创建navicat连接 --> delete from user where host!=’%’; --> flush privileges --> exit; --> mysql --> mysql -u root -p --> root(密码) --> exit;Hive安装 ①上传hive所需的文件到node01根目录下,使用winSCP ②将这两个文件传给node02:scp apache-hive-2.0.1-bin.tar.gz mysql-connector-java-5.1.39.jar node02:pwd ③在node02解压:tar -zxvf apache-hive-2.0.1-bin.tar.gz -C /opt/hpe/ ④给刚解压的文件夹改名:mv apache-hive-2.0.1-bin/ hive-2.0.1 ⑤cd hive-2.0.1/ --> pwd (复制hive的路径) --> vi /etc/profile --> 加上export HIVE_HOME=/opt/hpe/hive-2.0.1一行,并在PATH最后加上:$HIVE_HOME/bin ⑥cd $HIVE_HOME --> cd conf --> cp hive-default.xml.template hive-site.xml --> vi hive-site.xml --> 从下一行鼠标停住,按下shift+:进入命令模式,输入 . , $-1d回车(删除之间的所有行) ⑦配置hive-site.xml
<property>
<name>hive.metastore.warehouse.dir
</name>
<value>/user/hive_remote/warehouse
</value>
</property>
<property>
<name>hive.metastore.local
</name>
<value>true
</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL
</name>
<value>jdbc:mysql://node01/hive_remote?createDatabaseIfNotExist=true
</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName
</name>
<value>com.mysql.jdbc.Driver
</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName
</name>
<value>root
</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword
</name>
<value>root
</value>
</property>
⑧将MySQL驱动包放在hive的lib目录下即可: 先定位到hive的lib下 --> cp /root/mysql-connector-java-5.1.39.jar ./ ⑨Hive安装初始化:schematool -initSchema -dbType mysql ⑩启动hive:在目录/opt/hpe/hive-2.0.1/bin下输入hive --> quit;(关闭hive)
Hive单用户模式操作
启动hadoop集群hive (node02中启动hive) --> show databases; --> create table tbl0(id int,age int); --> desc tbl0;(查看表信息或详细查看表信息:desc formatted tbl0;)–> insert into tbl0 values(1,9);此时点击web的node03:8088可以查看到在执行mapreduce作业。
Hive多用户模式操作
节点任务
node01mysqlnode03MetaStoreServernode04Hive Client
实现node01~04全部免密钥:实现一个节点免密钥,再分发覆盖即可。scp authorized_keys node01:pwd从node02分发hive文件夹到node03~04:scp apache-hive-2.0.1-bin.tar.gz node03:pwdnode03~04解压刚才的hive文件并改名:tar -zxvf apache-hive-2.0.1-bin.tar.gz -C /opt/hpe/ --> mv apache-hive-2.0.1-bin/ hive-2.0.1将node02的配置文件profile分发到node03~04 : scp /etc/profile node03:/etc/node03中:cd $HIVE_HOME --> cd conf --> cp hive-default.xml.template hive-site.xml --> vi hive-site.xml
<property>
<name>hive.metastore.warehouse.dir
</name>
<value>/user/hive/warehouse
</value>
</property>
<property>
<name>javax.jdo.option.ConnectionURL
</name>
<value>jdbc:mysql://192.168.228.11:3306/hive?createDatabaseIfNotExist=true
</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName
</name>
<value>com.mysql.jdbc.Driver
</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName
</name>
<value>root
</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword
</name>
<value>root
</value>
</property>
–> 和上面一样将MySQL驱动jar存放到hive的lib下 --> Hive安装初始化(hive服务端):schematool -initSchema -dbType mysqllin 7. 启动hive服务:hive --service metastore&(加上&可以让命令在后台执行) 服务端口号9083 --> 新建表,添加数据等尝试 8. node04上 --> cp 得到 hive-site.xml --> vi hive-site.xml --> 删除之间的内容,并添加保存
<property>
<name>hive.metastore.warehouse.dir
</name>
<value>/user/hive/warehouse
</value>
</property>
<property>
<name>hive.metastore.local
</name>
<value>false
</value>
</property>
<property>
<name>hive.metastore.uris
</name>
<value>thrift://node03:9083
</value>
</property>
node04启动hive:hive --> 新建表tbl、插入数据1、查询数据尝试 --> 再打开一个node04的连接 --> hdfs dfs -ls /user/hive/warehouse/tbl --> hdfs dfs -cat /user/hive/warehouse/tbl/* --> 在/opt/hpe下将客户端配置分发给node01一份 : scp -r hive-2.0.1/ node01:pwd --> 在node01的/etc/profile文件中添加export HIVE_HOME=/opt/hpe/hive-2.0.1 并在PATH中添加相应bin目录 --> 启动node01的hive:hive --> show tables;查询得到的表是一样的(多用户)
Hive数据类型
Hive实操案例
编写创建表的语句(在notepad++里):
人员表
id
,姓名
,爱好
,地址
1,小明
1,lol
-book
-movie
,jining:hpe
-shanghai:pudong
2,小明
2,lol
-book
-movie
,jining:hpe
-shanghai:pudong
3,小明
3,lol
-book
-movie
,jining:hpe
-shanghai:pudong
4,小明
4,lol
-book
-movie
,jining:hpe
-shanghai:pudong
5,小明
5,lol
-book
-movie
,jining:hpe
-shanghai:pudong
6,小明
6,lol
-book
-movie
,jining:hpe
-shanghai:pudong
7,小明
7,lol
-book
-movie
,jining:hpe
-shanghai:pudong
8,小明
8,lol
-book
-movie
,jining:hpe
-shanghai:pudong
CREATE TABLE psn0
(
id
int,
name string
,
likes ARRAY
<string
>,
address MAP
<string
,string
>)
ROW FORMAT
DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS
TERMINATED BY '-'
MAP
KEYS TERMINATED BY ':';
将创建内部表的语句赋值粘贴到node04的hive>下第二个node04回到家目录 cd --> vi data1 --> 粘贴上面1~8小明的数据记录保存 --> 将数据导入select * from psn0;查看
LOAD DATA LOCAL INPATH
'/root/data1' INTO TO TABLE psn0
;
node04创建外部表
CREATE EXTERNAL
TABLE psn1
(
id
int,
name string
,
likes ARRAY
<string
>,
address MAP
<string
,string
>)
ROW FORMAT
DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS
TERMINATED BY '-'
MAP
KEYS TERMINATED BY ':'
LOCATION
'/psn1';
导入数据
LOAD DATA LOCAL INPATH
'/root/data1' INTO TABLE psn1
;
创建分区表
PARTITIONED
BY (字段名,数据类型 可以接很多字段
)
CREATE TABLE psn2
(
id
int,
name string
,
likes ARRAY
<string
>,
address MAP
<string
,string
>)
PARTITIONED
BY (age
int)
ROW FORMAT
DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS
TERMINATED BY '-'
MAP
KEYS TERMINATED BY ':';
将创建分区表语句粘贴到node04的hive下,导入数据
LOAD DATA LOCAL INPATH
'/root/data1' INTO TABLE psn2
partition (age
=10);
–> select * from psn2 where age=10;(数据量很大的时候效率就提高了) 8. 创建两个分区字段的分区表
CREATE TABLE psn3
(
id
int,
name string
,
likes ARRAY
<string
>,
address MAP
<string
,string
>)
PARTITIONED
BY (sex string
,age
int)
ROW FORMAT
DELIMITED
FIELDS TERMINATED BY ','
COLLECTION ITEMS
TERMINATED BY '-'
MAP
KEYS TERMINATED BY ':';
操作步骤和上面一个分区分区表类似。 9. 删除、增加分区表:
alter table psn3
add partition(sex
='boy',age
=10);
alter table psn3
drop partition(sex
='boy',age
=10);
克隆创建表
create table psn4
like psn2
;
create table newtable
as select id
,name
from psn2
;
Hive表
一、内部表 MANAGED_TABLE 删除内部表的时候,不仅会删除元数据,真实数据也会被删除:drop table psn0; 二、外部表 EXTERNAL_TABLE 删除外部表的时候,仅仅会删除元数据,真实数据不会被删除:drop table psn1;
计算掉话率
公式:掉话率=总的掉话时间/总的通话时间
步骤
创建表 cell_monitor,创建结果表 drop_monitor导入数据 load data统计分析取出掉话率最高的前10个基站信息
操作
创建表
create table cell_monitor
(
record_time string
,
imei string
,
cell string
,
ph_num
int,
call_num
int,
drop_num
int,
duration
int,
drop_rate
DOUBLE,
net_type string
,
erl string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED
AS TEXTFILE
;
create table cell_drop_monitor
(
imei string
,
total_call_num
int,
total_drop_num
int,
d_rate
DOUBLE
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED
AS TEXTFILE
;
winSCP将数据文件上传到node04的/root/下 --> 改名为cdr.csv --> load data local inpath ‘/root/cdr.csv’ into table cell_monitor;node04 hive中
from cell_monitor cm
insert overwrite
table cell_drop_monitor
select cm
.imei
, sum(cm
.duration
), sum(cm
.drop_num
), sum(cm
.drop_num
)/sum(cm
.duration
) d_rate
group by cm
.imei
sort
by d_rate
desc;
select * from cell_drop_monitor limit 10; --> quit;
补充
Linux中esc模式按u是撤销不是所有的hive数据库语句执行都会转换为mapreduce作业查看进程号命令:ss -naltp导入数据的时候 1)从Linux集群导入:LOAD DATA LOCAL INPATH ‘/root/data1’ INTO TABLE psn1; 该模式原Linux数据文件依然存在 2)从hdfs分布式文件系统导入:LOAD DATA INPATH ‘/root/data1’ INTO TABLE psn1; 该模式原分布式数据文件不存在load适合批量导入数据,from适合统计分析