第五章:基于Hive实现海量数据离线处理

本文介绍了基于Hive实现海量数据的离线处理流程,包括Hadoop环境搭建、Flume数据收集、Hive外部表创建、数据清洗、统计指标计算(PV、UV、SV等)以及通过sqoop将数据导入MySQL。此外,还探讨了Hive的内部表、外部表、分区表、分桶表以及Hive与MySQL的元数据管理。
摘要由CSDN通过智能技术生成

Hive离线分析

回顾业务流程

准备

搭建环境

1.启动Hadoop

start-all.sh

2.修改flume配置文件

flume.properties

a1.sources  =  r1
 
a1.sinks  =  k1
 
a1.channels  =  c1
 
 
 
a1.sources.r1.type  =  avro
 
a1.sources.r1.bind  =  0.0.0.0
 
a1.sources.r1.port  =  22222
 
a1.sources.r1.interceptors = t1
 
a1.sources.r1.interceptors.t1.type = timestamp
 
 
 
a1.sinks.k1.type = hdfs
 
a1.sinks.k1.hdfs.path = hdfs://hadoop01:9000/flux/reportTime=%Y-%m-%d
 
a1.sinks.k1.hdfs.fileType=DataStream
 
 
 
a1.channels.c1.type  =  memory
 
a1.channels.c1.capacity  =  1000
 
a1.channels.c1.transactionCapacity  =  100
 
 
 
a1.sources.r1.channels  =  c1
 
a1.sinks.k1.channel  =  c1

3.启动flume

cd /usr/local/src/flume/apache-flume-1.6.0-bin/conf

../bin/flume-ng agent -c ./ -f ./flume.properties -n a1 -Dflume.root.logger=INFO,console

4.启动jt-logserver

5.测试

访问locahost/a.jsp和locahost/b.jsp

准备数据

以下方式只做参考,可以自己随意访问产生数据,注意,关闭浏览器代表一个会话终结,清除cookie或者更换浏览器模拟不同用户。

浏览器A:访问3次a.jsp,2次b.jsp关闭浏览器

浏览器B:访问3次a.jsp,2次b.jsp关闭浏览器

浏览器A:访问1次a.jps

浏览器B:访问1次b.jps

注意,flume输出的数据不是一条一个单独文件,而是根据我们的配置及自身的策略来决定何时生成一个完整的文件。

Create:开始创建一个tmp零时文件并写入数据

Closing:关闭写入链接,停止对该文件的操作

Renaming:重命名tmp文件为最终文件

Writer callback called:重置写入状态

如何配置单个文件的大小?以下为图例,详见官网

以上配置都有默认值,所以我们不配也没有问题。但是即使配置了固定值,flume也不一定会按照我们的想法来执行,通过翻阅源码可以发现,flume除了安装配置数据执行外还额外增加了自己的判定逻辑,当长时间没有活动时,也会关闭本次链接,生成一个完整的文件。

 

离线数据处理

Hive管理数据

创建flux外部表,管理HDFS中的日志信息。

hive> create database jtlogdb;
 
hive> use jtlogdb;
 
hive> create external table flux (url string,urlname string,title string,chset string,src string,col string,lg string, je string,ec string,fv string,cn string,ref string,uagent string,stat_uv string,stat_ss string,cip string) partitioned by (reportTime string) row format delimited fields terminated by '|' location '/flux';

create external table flux:创建外部表

partitioned by (reportTime string):根据日期分区

row format delimited fields terminated by '|':通过 | 分割数据

location '/flux':管理HDFS中/flux文件夹

url string

urlname string

title string

chset string

src string

col string

lg string

je string

ec string

fv string

cn string

ref string

uagent string

stat_uv string

stat_ss string

cip string

原始数据很多,但并不是所有的数据都跟我们的业务有关。所以。在正式处理之前我们还会对flux表做一次清洗。去除不相干的数据。

查询flux表

select * from flux;

发现并没有数据,这是为什么?---没有添加分区信息。

添加分区信息:

alter table flux add partition (reportTime='2020-02-25') location '/flux/reportTime=2020-02-25';

再次查看整表,发现数据已经被正确管理了。

 

数据清洗

需要的数据字段

reportTime 产生日期

url        访问路径

urlname    页面名称

uvid       访客id

ssid       会话id

sscount    会话编号

sstime     会话时间戳

cip        访客ip

创建数据清洗表:

create table dataclear(reportTime string,url string,urlname string,uvid string,ssid string,sscount string,sstime string,cip string) row format delimited fields terminated by '|';

需要注意的是,在hive中将一个表内的数据导入另一个表中时,两个表的创建结构必须相同,包括分隔符!否则可能会发生数据错乱。

清洗并导入数据:

insert overwrite table dataclear select reportTime,url,urlname,stat_uv,split(stat_ss,"_")[0],split(stat_ss,"_")[1],split(stat_ss,"_")[2],cip from flux where url!='';

这个过程执行较慢。

导入数据成功之后查询该表:

select * from dataclear;

HDFS中下载查看数据:

数据处理

PV:访问量

select count(*) as pv from dataclear where reportTime='2020-11-19';

实际就是有效日志条数

UV:独立访客数

select count(distinct uvid) as uv from dataclear where reportTime='2020-11-19';

记录不同用户的20位随机数(uvid),去重后进行计数。

SV:独立会话数

select count(distinct ssid) as sv from dataclear where reportTime='2020-11-19';

session即会话,浏览器用cookie存储sessionid所以不同的cookie就代表不同的会话,其中我们使用了两个浏览器,清除了两次cookie,来模拟不同的会话。

 

BR:跳出率

设置

set hive.mapred.mode=nonstrict;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值