文档章节

大数据学习系列----web日志分析

春哥大魔王的博客
 春哥大魔王的博客
发布于 2017/05/25 16:30
字数 1201
阅读 108
收藏 1

场景

nginx日志目录 /usr/local/nginx/logs,日志格式:

123.13.17.13 - - [25/Aug/2016:00:00:01 +0800] "GET /AppFiles/apk/studynet/icon_v120/apk_80111_1.jpg HTTP/1.1" 206 51934 "http://img.xxx.com:8080/AppFiles/apk/studynet/icon_v120/apk_80111_1.jpg" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; S100 Build/KOT49H)"
120.210.166.150 - - [25/Aug/2016:00:00:01 +0800] "GET /AppFiles/apk/studynet/products/product_lc01.zip HTTP/1.1" 206 16631 "http://img.xxx.com:8080/AppFiles/apk/studynet/products/product_lc01.zip" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; S908 Build/KVT49L)"
123.13.17.13 - - [25/Aug/2016:00:00:01 +0800] "GET /AppFiles/apk/studynet/icon_v120/apk_80111_0.jpg HTTP/1.1" 206 53119 "http://img.xxx.com:8080/AppFiles/apk/studynet/icon_v120/apk_80111_0.jpg" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; S100 Build/KOT49H)"
219.137.119.16 - - [25/Aug/2016:00:00:01 +0800] "GET /AppFiles/apk/gamenet/icon/icon_0_506_0.jpg HTTP/1.1" 404 1035 "-" "Dalvik/v3.3.110_update3 (Linux; U; Android 2.2.1-R-20151127.1131; ET_35 Build/KTU84Q)"
120.210.166.150 - - [25/Aug/2016:00:00:01 +0800] "GET /AppFiles/apk/studynet/products/product_lc01.zip HTTP/1.1" 206 40719 "http://img.xxx.com:8080/AppFiles/apk/studynet/products/product_lc01.zip" "Dalvik/1.6.0 (Linux; U; Android 4.4.2; S908 Build/KVT49L)"

日志以空格分割,共12列数据:

1、客户端IP
2、空白(远程登录名称)
3、空白(认证的远程用户)
4、请求时间
5、时区(UTC)
6、请求方法
7、请求资源
8、http协议
9、状态码
10、发送字节数
11、访问来源
12、客户浏览信息(不具体拆分)

nginx服务器部署HDFS日志上传脚本,定时将nginx日志上传到HDFS平台。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

import subprocess
import sys
import datetime

webid = 'test1' #HDFS存储日志标志,另一台Web服务器为:test2
currdate = datetime.datetime.now().strftime('%Y%m%d')

logspath = '/usr/local/nginx/logs/access.log' #日志路径
logname = 'access.log.'+webid

try:
    #创建HDFS目录,目录格式:nginx/20160825,加wait()是为了让父进程等待子进程完成后再继续往下执行(subporcess默认启动子进程后不等待其执行结果就继续往下执行)
    subprocess.Popen(['/usr/local/hadoop-2.6.4/bin/hadoop','fs','-mkdir','-p','hdfs:///user/root/nginx'+currdate],stdout=subprocess.PIPE).wait() 
except Exception as e:
    pass

putinfo = subprocess.Popen(['/usr/local/hadoop-2.6.4/bin/hadoop','fs','-put',logspath,'hdfs:///user/root/nginx/' +currdate +'/'+logname],stdout=subprocess.PIPE) #上传本地日志到HDFS

for line in putinfo.stdout:
    print line

将上传脚本部署到corntab实现定时功能

0 0 * * * /usr/bin/python /root/hadooptest/hdfsput.py >> /dev/null 2>&1

日志上传到HDFS上,信息如下:

[root@wx ~]# hadoop fs -ls /user/root/nginx/20160825
Found 2 items
-rw-r--r-- 1 root supergroup 15 2016-08-25 15:58 /user/root/nginx/20160825/access.log.test1
-rw-r--r-- 1 root supergroup 28 2016-08-25 15:58 /user/root/nginx/20160825/access.log.test2

访问流量统计

实现精确到分钟统计网站访问流量,mapper操作时将web日志中的每分钟作为key,将对应的行发送字节数value,在reducer操作时对时间相同的key做累加。

使用MRJob

#/usr/bin/env python
# -*- coding:utf-8 -*-

from mrjob.job import MRJob
import re

class MRCounter(MRJob):
    def mapper(self, key, line):
        i = 0
        for flow in line.split(): #获取时间段,为域日志的第4列,内容如:“[24/Aug/2016:00:00:02”
            if i==3:
                timerow = flow.split(':')
                hm = timerow[1] + ':' + timerow[2] #获取'小时:分钟',作为key
            if i==9 and re.match(r'\d{1,}',flow): #获取日志第10列:发送的字节数,作为value
                yield hm,int(flow) #初始化key:value
            i+=1

    def reducer(self, key, occurences):
        yield key,sum(occurences) #相同key“小时:分钟”的value做累加操作

if __name__ == '__main__':
    MRCounter.run()

生成Hadoop任务,运行:

python /root/hadoop/httpflow.py -r hadoop -o hdfs://output/httpflow hdfs:///user/root/nginx

分析结果定期导入MySql生成报表。

统计网站HTTP状态码

可以帮助我们了解网站健康状态,利用MRJob的多步调用实现。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from mrjob.job import MRJob
import re

class MRCounter(MRJob):
    def mapper(self, key, line):
        i = 0
        for httpcode in line.split():
            if i == 8 and re.match(r'\d{1,3}',httpcode): #获取日志中HTTP状态码段,作为key
                yield httpcode,1 #初始化key:value,value计数为1,方便reducer做累加
            i+=1

    def reducer(self, httpcode,occurrences):
        yield httpcode,sum(occurrences) #对排序后的key对应的value作sum累加

    def steps(self):
        return [self.mr(mapper=self.mapper),self.mr(reducer=self.reducer)] #在steps方法中添加调用队列

if __name__ == '__main__':
    MRCounter.run()

生成Hadoop任务,运行:

python httpstatus.py -r hadoop -o hdfs:///output/httpstatus hdfs:///user/nginx

结果:

[root@wx hadooptest]# hadoop fs -cat /output/httpstatus/part-00000
"200" 608997
"206" 2802574
"302" 1
"304" 34600
"400" 30
"401" 1
"404" 1653791
"416" 180358
"499" 2689

访问来源IP统计

统计访问来源IP可以了解网站用户分布,帮助安全人员捕捉攻击来源。定义匹配IP正则字符串作为key,将value初始化为1,执行reducer操作累加统计。

#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from mrjob.job import MRJob
import re

IP_RE = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}') #定义IP正则匹配

class MRCounter(MRJob):
    def mapper(self, key, line):
        for ip in IP_RE.findall(line): #匹配IP正则后生成key:value,其中key为IP地址,value初始值为1
            yield ip,1

    def reducer(self, ip,occurrences):
        yield ip,sum(occurrences) #对排序后的key对应的value作sum累加

if __name__ == '__main__':
    MRCounter.run()

执行任务:

python ipstat.py -r hadoop -o hdfs:///output/ipstat hdfs:///user/nginx

本文转载自:

春哥大魔王的博客
粉丝 38
博文 295
码字总数 266050
作品 0
海淀
程序员
私信 提问
专栏文章推荐:轻松玩转ELK海量可视化日志分析系统

最近一直在更新ELK系列的专栏,此专栏主要是针对ELK从入门到实战应用的介绍,内容非常实用,通过多年对ELK的使用经验,此文浓缩了ELK的各种应用技能和总结,强烈推荐给大家阅读。 在学习过程...

南非蚂蚁
2018/08/20
0
0
Spark + Hbase 百亿级流量实时分析统计 之 数据结构设计

背景 靠文章生存的大厂们//(PS:好吧你们仨记得给我广告费),对优秀的文章进行大数据分析的工作必不可以少了,本系列文章将会从关于文章的各个维度进行实战分析,这系列文章新手可借着踏入大数...

大猪佩琪2019
03/23
0
0
Spark+Hbase 亿级流量分析实战(数据结构设计)

靠文章生存的大厂们 // (PS:好吧你们仨记得给我广告费),对优秀的文章进行大数据分析的工作必不可以少了,本系列文章将会从关于文章的各个维度进行实战分析,这系列文章新手可借着踏入大数据...

大猪大猪
05/13
0
0
Apache Nutch v2.3 发布,Java实现的网络爬虫

Apache Nutch v2.3已经发布了,建议所有使用2.X系列的用户和开发人员升级到这个版本。 这个版本提供了一个基于Apache Wicket的Web管理界面,解决了143个问题,提供了Maven依赖,升级到Gora ...

杨尚川
2015/01/31
18.9K
9
Python 免费资源集合--Awesome Python

Awesome Python 是一个资源整理集合,由 vinta 发起和维护。内容包括:Web框架、网络爬虫、网络内容提取、模板引擎、数据库、数据可视化、图片处理、文本处理、自然语言处理、机器学习、日志...

匿名
2017/01/22
3.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部