avatar

目录
Hadoop-电商日志分析(离线计算系统实战)

[TOC]

以电商业务为例,完成一个离线计算系统的技术架构(HDFS+MapReduce)

需求分析

用户行为日志

点击、搜藏、搜索、加入购物车、下单…

推荐

需求

统计页面的浏览量

统计各个省份的浏览量

统计页面的访问量

数据处理流程及技术架构(离线计算)

![屏幕快照 2019-09-02 下午2.19.24](20190902135818314/屏幕快照 2019-09-02 下午2.19.24.png)

统计页面的浏览量

每行数据都是固定的key,value赋值为1

select count(1) from xxx;

Code
1
PVStatApp

统计各个省份的浏览量

select province count(1) from xxx group by province;

地市信息通过IP解析获取

IP库解析

IP解析:在正式项目中通常使用收费服务

这里测试使用qqwry.dat开源库

相关代码

Code
1
2
3
IPParser
IPSeeker
IPTest

日志解析

将一行日志的ip解析出来,并转换为城市信息

代码

Code
1
2
LogParser
LogParseTest

MR统计省份流量

解析出一行log的ip的省份信息,将省份作为key,value是1

代码

Code
1
ProvinceStatApp

统计页面的访问量

解析出一行log的url的pageId(有的url没有),将pageId作为key,value是1

Code
1
2
ContentUtils	// 获取编号
PageStatApp

ETL-改进优化

目前存在的问题

假设日志数据很大(5T),每个MR都去全量处理待处理的原始日志,非常消耗时间。

解决办法:ETL

ETL:全量数据不方便直接计算,最好是进行一步处理后再进行相应的维度统计分析。

解析出需要的字段:ip ==> 城市信息

去除不需要的字段 ==> 很多

保留字段:ip/time/url/page_id/province/city

其他作业的输入都使用etl文件

代码

Code
1
2
3
ETLApp
ProvinceStatV2App
PVStatV2App

打包到服务器上运行

shell
1
2
3
4
5
6
7
8
9
mvn clean package
vi pv.sh
# pv.sh
hadoop jar /home/xxx/xxx.jar mxx.hadoop.userlog.mrv1.PVStatApp hdfs://centos01:8020/project/input/row/ hdfs://centos01:8020/project/output/v1/pvstat
# --------------
chmod u+x pv.sh
./pv.sh

vi province.sh

扩展TODO

处理结果的存储

大数据处理完后,目前存在HDFS上。

如果需要前台展示,可采用的方案:使用技术或框架把处理完的结果导出到数据库(mysql,mongoDB)中,然后前台展示。

Sqoop:把HDFS上的统计结果导出到mysql中。

T级别的初始数据,假设一天要处理一次。

可以采用压缩

原始日志一般在集群上会定期删掉,但一次etl的数据一般会存很久(比如一年)。

如果etl的数据存不下,可以把etl的数据先移到冷集群上,热集群就是跑当前数据(比如以一个月、一天为单位),冷集群放不下就要移到其他地方。

etl通常会拆字段,结果是etl的数据比原始数据还大。文本存储方式会全量读取再过滤,会采用列式存储(ORC),比如有100列,只需要访问3列,剩下的97列是不会产生io操作的。

文章作者: Machine
文章链接: https://machine4869.gitee.io/2019/09/02/20190902135818314/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 哑舍
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论