大数据离线---网站日志流量分析系统(2)---数据获取和预处理

本文详细介绍了网站日志流量分析系统中数据的获取和预处理。采用Flume作为日志采集工具,讨论了Flume的优缺点以及日志切割的必要性。在数据预处理部分,主要目的是清洗和整理数据,以便后续分析。内容涵盖Flume日志采集系统搭建、数据样本分析以及预处理的三个阶段。
摘要由CSDN通过智能技术生成

本次接上一篇,进行实际数据的获取和预处理,会有较多的代码内容

  • 数据的获取
  • 数据的预处理

数据的获取

需求

数据采集的需求广义上来说分为两大部分。

  • 是在页面采集用户的访问行为,具体开发工作:
    1、 开发页面埋点 js,采集用户访问行为
    2、 后台接受页面 js 请求记录日志
  • 是从 web 服务器上汇聚日志到 HDFS,是数据分析系统的数据采集,具体的技术实现有很多方式:
    • Shell 脚本
      优点:轻量级,开发简单
      缺点:对日志采集过程中的容错处理不便控制
    • Java 采集程序
      优点:可对采集过程实现精细控制
      缺点:开发工作量大
    • Flume 日志采集框架
      成熟的开源日志采集系统,且本身就是 hadoop 生态体系中的一员,与hadoop体系中的各种框架组件具有天生的亲和力,可扩展性强。在网站 web 流量日志分析这种场景中,对数据采集部分的可靠性、容错能力要求通常不会非常严苛,因此使用通用的 flume 日志采集框架完全可以满足需求。
      本项目即使用 flume 来实现日志采集。
Flume 日志采集系统搭建
  • 日志切割
    nginx 服务器所生成的流量日志,存放在各台 nginx 服务器上。由于 nginx 没有自动分开文件存储日志的机制, 不会自动地进行切割, 都是写在一个文件 access.log 当中的。 如果访问量很大的话,将导致日志文件容量非常大,不便于管理。 那就需要手动对这个文件进行切割。
    切割需要使用 date 命令以获得昨天的日期、使用 kill 命令向 Nginx 进程发送重新打开日志文件的信号,以及 crontab 设置执行任务周期。 我们需要每天零点将前一天的日志存为另外一个文件,这里我们就将 Nginx 位于 logs 目录中的 access.log 存为access_[yyyy-MM-dd].log 的文件。
    自动切割 shell 脚本 nginx_log.sh:
#!/bin/bash
#设置日志文件存放目录
logs_path="/usr/local/nginx/logs/"
#设置 pid 文件
pid_path="/usr/local/nginx/nginx-1.7.3/logs/nginx.pid"
#日志文件
filepath=${logs_path}"access.log"
# Source function library.
#重命名日志文件
mv ${logs_path}access.log
${logs_path}access_$(date -d '-1 day' '+%Y-%m-%d').log
#向 nginx 主进程发信号重新打开日志
kill -USR1 `cat ${pid_path}`

crontab 设置作业(每天零时零分执行):

0 0 * * * sh /usr/local/nginx/nginx_log.sh
  • Flume采集实现
    Flume 采集系统的搭建相对简单:
    1、 在个 web 服务器上部署 agent 节点,修改配置文件
    2、 启动 agent 节点,将采集到的数据汇聚到指定的 HDFS 目录中
    针对上述的 nginx 日志生成场景, 如果通过 flume( 1.6)收集,无论是 SpoolingDirectory Source 和 Exec Source 均不能满足动态实时收集的需求,在当前 flume1.7 稳定版本中,提供了一个非常好用的 TaildirSource,使用这个 source,可以监控一个目录,并且使用正则表达式匹配该目录中的文件名进行实时收集。
    核心配置如下
a1.sources = r1
a1.sources.r1.type = TAILDIR
a1.sources.r1.channels = c1
a1.sources.r1.positionFile = /var/log/flume/taildir_position.json
a1.sources.r1.filegroups = f1 f2
a1.sources.r1.filegroups.f1 = /var/log/test1/example.log
a1.sources.r1.filegroups.f2 = /var/log/test2/.*log.*

说明:

  1. filegroups:指定 filegroups,可以有多个,以空格分隔;( TailSource 可以同时监控tail 多个目录中的文件)
  2. positionFile:配置检查点文件的路径,检查点文件会以 json 格式保存已经 tail 文件的位置,解决了断点不能续传的缺陷。
  3. filegroups.: 配置每个 filegroup 的文件绝对路径,文件名可以用正则表达式匹配通过以上配置,就可以监控文件内容的增加和文件的增加。 产生和所配置的文件名正则表达式不匹配的文件,则不会被 tail。
  • 数据样本
    数据的具体内容在采集阶段其实不用太关心。代码使用的数据来源可以在这里获取
    点击跳转到数据源
8.215.204.118 - - [18/Sep/2013:06:51:35 +0000] "GET /wp-includes/js/jquery/jquery.js?ver=1.10.2 HTTP/1.1" 304 0 "http://blog.fens.me/nodejs-socketio-chat/" "Mozilla/5.0 (Windows NT 5.1; rv:23.0) Gecko/20100101 Firefox/23.0"

数据说明:
1、访客 ip 地址: 58.215.204.118
2、访客用户信息: - -
3、请求时间: [18/Sep/2013:06:51:35 +0000]
4、请求方式: GET
5、请求的 url: /wp-includes/js/jquery/jquery.js?ver=1.10.2
6、请求所用协议: HTTP/1.1
7、响应码: 304
8、返回的数据流量: 0
9、访客的来源 url: http://blog.fens.me/nodejs-socketio-chat/


数据的预处理

主要目的

过滤“不合规”数据,清洗无意义的数据格式转换和规整,根据后续的统计需求,过滤分离出各种不同主题(不同栏目 path)的基础数据。
在这里插入图片描述
数据的处理分为三个阶段进行:
阶段一:对无意义数据的清洗,无用的数据做标记
阶段二:对相同用户的信息整合,进行页面点击流模型的梳理,参考上一篇
阶段三:点击流模型 Visits 表(按 session 聚集的页面访问信息)


  • 阶段一:对无意义数据的清洗,无用的数据做标记
    WebLogBean类的代码
package com.weblog.mr.preprocess;

import org.apache.hadoop.io.Writable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class WebLogBean implements Writable{

    private boolean valid = true;// 判断数据是否合法
    private String remote_addr;// 记录客户端的ip地址
    private String remote_user;// 记录客户端用户名称,忽略属性"-"
    private String time_local;// 记录访问时间与时区
    private String request;// 记录请求的url与http协议
    private String status;// 记录请求状态;成功是200
    private String body_bytes_sent;// 记录发送给客户端文件主体内容大小
    private String http_referer;// 用来记录从那个页面链接访问过来的
    private String http_user_agent;// 记录客户浏览器的相关信息

    public void set(boolean valid,String remote_addr, String remote_user, String time_local, String request, String status, String body_bytes_sent, String http_referer, String http_user_agent) {
        this.valid = valid;
        this.remote_addr = remote_addr;
        this.remote_user = remote_user;
        this.time_local = time_local;
        this.request = request;
        this.status = status;
        this.body_bytes_sent = body_bytes_sent;
        this.http_referer = http_referer;
        this.http_user_agent = http_user_agent;
    }

    public void setValid(boolean valid) {
        this.valid = valid;
    }

    public void setRemote_addr(String remote_addr) {
        this.remote_addr = remote_addr;
    }

    public void setRemote_user(String remote_user) {
        this.remote_user = remote_user;
    }

    public void setTime_local(String time_local) {
        this.time_local = time_local;
    }

    public void setRequest(String request) {
        this.request = request;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public void setBody_bytes_sent(String body_bytes_sent) {
        this.body_bytes_sent = body_bytes_sent;
    }

    public void setHttp_referer(String http_referer) {
        this.http_referer = http_referer;
    }

    public void setHttp_user_agent(String http_user_agent) {
        this.http_user_agent = http_user_agent;
    }

    public boolean isValid() {

        return valid;
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值