Trex-Group / trex-bigdata

11 stars 6 forks source link

[home work]02-03 日志文件的KPI统计 #24

Closed McKey1911 closed 7 years ago

McKey1911 commented 7 years ago

@xenron 关于本次作业中的日志文件的KPI统计,我有些不明白的地方。 1,作业之前肯定需要分析log文件的格式,我的理解是 访问者IP,日期,request信息,status code,response正文size,referer,user agent 不知道是否正确。

2,如何统计独立IP 关于这个job,我觉得可以以IP为key,value的话随便,可以是IP出现的次数。但是出力结果是一个以独立IP为key的列表,然后再计算这个列表的个数,就是独立IP数。也就是说,需要对mapreduce的结果再做处理。不知道我的理解对不对。

3,log里面的页面既有html也有php,我且认为这两种request算是对页面的访问。

4,“传输页面的总字节数”,这个不知道怎么理解。 4-1,是指 页面A(html或者php)以及解析该页面时请求的各种js,图片等资源的字节数。 如果是这样的话,处理起来相当麻烦呢。 4-2,不管是哪个页面,也不管是html还是js,统计所有的response正文size。 如果是这样的话,出力起来相当简单呢。

5,统计来源网站,列出域名及带来的独立ip数 来源网站是看referer信息吗?referer看起来既有站内也有站外的。为了简单起见,我不打算区分站内外,也不区分html和js。。。 map时先计算出域名并作为key,以IP为value。 reduce时对values进行去重。但reduce的结果是 域名(key)对应多个IP(values)这样的出力形式,我需要再对其处理,计算每个域名的IP数。关于做法,我有两个想法。 5-1,我可以chain两个jobs顺次执行。 5-2,有没有办法控制最后一次的reduce?这样我可以在最后来计算对于每个key,其values的个数。 我对这个有些疑惑,我们的练习作业要这么复杂吗?还是我根本就是理解错了? 统计浏览器的那个作业,我的想法与这个也是一致的。

BTW,看到下面这个,我的内心是崩溃的。

难度等级:★
预计时间:2 hours
xenron commented 7 years ago

在家写了点儿代码,先回个地址,到公司后,再细细道来。 https://github.com/trex-group/Big-Data/tree/master/01_Guide/source/develop/src/main/java/hadoop/homework

xenron commented 7 years ago

1,作业之前肯定需要分析log文件的格式

关于log文件的格式,可以参考下面的 apache 官方文档 网页:https://httpd.apache.org/docs/1.3/logs.html 关键字:Common Log Format,Combined Log Format

2,如何统计独立IP

map 阶段,ip作为key,数字1作为value 默认的输出结果,就是 key 拼接 value 如果只需要输出其中一部分的话,可以尝试改写 FileOutputFormat 和 RecordWriter,查一下源码,增加一个RecordWriter的扩展实现,重新设置fileoutputformat,应该不会很麻烦。 这部分我之后再追加一下。 参考资料 https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapreduce/lib/output/FileOutputFormat.html https://hadoop.apache.org/docs/stable/api/org/apache/hadoop/mapreduce/RecordWriter.html

3,log里面的页面既有html也有php,我且认为这两种request算是对页面的访问。

关于pv 统计,如果已经完成前面独立ip的内容,应该已经完成了80% 剩下的部分,简单来说,直接把Get后面,问号传参数前面这部分截取出来就可以了。 考查的算是对正则表达式,或者字符串操作的内容

4,“传输页面的总字节数”,这个不知道怎么理解。

参考上面提供的apache log页面,关键字:the size of the object returned to the client 查找每个请求地址,对应的字节数 更进一步,可以结合正则表达式,将动态资源和静态资源拆分开,分别输出,便于进一步分析。 原因是,在网站配置里面,一般来说静态资源和动态资源,都是分开存储的,计费方式,对server的负担,都是不一样的。

5,统计来源网站,列出域名及带来的独立ip数

参考上面提供的apache log页面,关键字:Referer 先不需要区分站内站外(实际工作中,这部分恐怕就会有了) map阶段,Referer作为key,ip作为value reduce阶段,得到的是Referer, list 这样的结构,下一个问题就是如何找到list去除重复后的件数,hint:借助set,map等数据结构

xenron commented 7 years ago

说一下作业的难度定义

我预计第二题的作业结果是下面5个文件 1) 独立ip数 2) 独立pv数 3) 被传输页面的总字节数 4) 统计来源网站,列出域名及带来的独立ip数 5) 各种浏览器占的百分比

单纯从与WordCount的区别角度讲 12,对比WordCount 区别在于如何输出key,而不是输出key-value键值对,这部分区要简单扩展RecordWriter,继承父类的话,重写write,因为有源码可以参照,预计30分钟完成。 此外的代码10分钟一个

345,基本上没有什么本质区别,这部分10分钟一个,应该可以搞定

最后,还有一个问题是输入日志文件的分割,拆字段,这部分可以上网搜索一下,毕竟apache log已经用了N年了,找到一个代码也不会难度太大。 这部分时间计算为1小时

总计,2小时20分。

当然,前提可能是对java, idea ide,正则表达式的基本熟悉 这样拆分的话,感觉难度还大么

实际工作中,难度级别应该都在作业之上 大家继续努力吧

McKey1911 commented 7 years ago

长夜漫漫无心睡眠出来冒个泡。

@xenron 1,你说的“独立IP数”并非是一个数字,而是IP的list,对吗? 就是说最终结果文件里是IP的列表,而不是一个数字。 不过这也不是重点,我就是想确认一下。 2,我们假设有这样一个case。有一个含有多日的access信息的日志,现在想提取这样一个信息:每一天的独立IP数。输出结果的格式是: 日期 独立IP数 (独立IP数只是一个数字) 那么用一个Job可以做到吗? 3,关于HomeWork 的这一题,我的理解是一个小task一个Job,一共5个Job。 那么在实际开发中,应该是让一个job做尽可能多的事情吗?毕竟task的分配也消耗资源。 我一开始以为 1) 2) 3)各是一个Job,也就是说第一个Job要计算独立IP数,PV数,传输总字节数,然而我做不到。。。

由于我对Reducer理解有误,以上的问题现在没有什么疑问了。 感谢课间的答疑。