一、网站基本指标(即针对于网站用户行为而产生的日志中进行统计分析)

1. PV:网页浏览量(Page View页面浏览次数,只要进入该网页就产生一条记录,不限IP,统计点每天(较多)/每周/每月/..)
2. UV:独立访客数(Unique Vistor,以Cookie为依据,同一天内一个用户多次访问,只记为一个)
3. VV:访客的访问次数(Visit View,以Session为依据,访客访问网站到关掉该网站所有页面即记为一次访问)
4. IP:独立IP数(即记录不同IP,同一IP访问多次算作一次)
5. 通常网站流量(traffic)是指网站的访问量,是用来描述访问一个网站的用户数量以及用户所浏览的网页数量等指标
对于虚拟空间商来说流量是指:用户在访问网站过程中,产生的数据量大小

二、PV统计示例(统计各省的PV)

1. 分析数据中字段(provinceId)
2. 数据类型 <11,11,13>Map()--><11,list<1,1>><12,list<1>>-->reduce()---><11 /t 2><13 /t 1>
3. 条件过滤(或称之为数据清洗)
    values.length < 30;
    StringUtils.isBlank(url)
    StringUtils.isBlank(proviceIdValue)
    proviceId = Integer.valueOf(proviceIdValue);
  注意:条件的前后放置一定程度上会影响MR程序的运行效率
  这是一处优化,还可以使用combine,压缩提高效率
  PS:Configuration configuration = new Configuration();
  这行代码会先读取默认配置文件后从资源文件中获取自定义配置文件
4. 自定义计数器(用于记录被过滤掉那些数据)
  //Counter LEGTH_LT_30_COUNTER
  context.getCounter("WEBPVMAP_COUNTERS", "LEGTH_LT_30_COUNTER").increment(1L);
  //Counter URL_ISBLANK
  context.getCounter("WEBPVMAP_COUNTERS", "URL_ISBLANK").increment(1L);
  //Counter PROVICEIDVALUE_ISBLANK
  context.getCounter("WEBPVMAP_COUNTERS", "PROVICEIDVALUE_ISBLANK").increment(1L);
  //Counter STRING_CASE_TO_INTEGER_EXCEPTION
  context.getCounter("WEBPVMAP_COUNTERS", "STRING_CASE_TO_INTEGER_EXCEPTION").increment(1L);
  运行MR输出:
    WEBPVMAP_COUNTERS
    PROVICEIDVALUE_ISBLANK=21742
    STRING_CASE_TO_INTEGER_EXCEPTION=1
    URL_ISBLANK=29092

三、具体代码实现
  1. 放置好资源文件
     (即:将自定义配置文件拷贝到MR程序的资源文件夹,当然使用javaAPI将属性set进configuration也行)

[liuwl@hadoop09-linux-01 hadoop-2.5.0]$ cp etc/hadoop/core-site.xml etc/hadoop/hdfs-site.xml etc/hadoop/log4j.properties /home/liuwl/local/workspace/bigdata-test/src/resouce
[liuwl@hadoop09-linux-01 hadoop-2.5.0]$

  2. 具体代码

package com.eRrsr.bigdata_test;

import java.io.IOException;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WebPVMapReduce {   //Mapper Class
  private static class WebPVMapper extends Mapper<LongWritable, Text, IntWritable, IntWritable>{
    
private IntWritable mapOutKey = new IntWritable();
    private final static IntWritable mapOutValue = new IntWritable(1);
    @Override
    public void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {
     
String lineValue = value.toString();       //使用\t分隔
      String [] values = lineValue.split("\t");       //过滤掉分隔长度小于30的记录
      if(values.length < 30){         //计数器:参数1->计数器分组名称;参数2->计数器名称
        context.getCounter("WEBPVMAP_COUNTERS", "LEGTH_LT_30_COUNTER").increment(1L);
        return;
      }       //过滤掉分隔后的字段中url为空的记录
      String url = values[1];
      if(StringUtils.isBlank(url)){         context.getCounter("WEBPVMAP_COUNTERS", "URL_ISBLANK").increment(1L);
        return;
      }       //过滤掉省份id为空的记录
      String proviceIdValue = values[23];
      if(StringUtils.isBlank(proviceIdValue)){         context.getCounter("WEBPVMAP_COUNTERS", "PROVICEIDVALUE_ISBLANK").increment(1L);
        return;
      }       //过滤掉省份id转int异常的数据
      Integer proviceId = Integer.MAX_VALUE;
      try{
        proviceId = Integer.valueOf(proviceIdValue);
      }catch(Exception e){         context.getCounter("WEBPVMAP_COUNTERS", "STRING_CASE_TO_INTEGER_EXCEPTION").increment(1L);
        return;
      }       mapOutKey.set(proviceId);
      context.write(mapOutKey, mapOutValue);
    }
  }   //Reduce Class
  private static class WebPVReduce extends Reducer<IntWritable, IntWritable, IntWritable, IntWritable>{
    private IntWritable reduceOutValue = new IntWritable();
    @Override
    public void reduce(IntWritable key, Iterable<IntWritable> values,Context context)throws IOException, InterruptedException {
    
      int sum = 0;
      for(IntWritable value : values){
        sum += value.get();
      }
      reduceOutValue.set(sum);
      context.write(key, reduceOutValue);
    }
  }   //Driver Method
  public int run(String[] args) throws Exception {
    
    //会先读取默认配置,后读取资源文件中自定义配置
    Configuration configuration = new Configuration();
    Job job = Job.getInstance(configuration, this.getClass().getSimpleName());
    job.setJarByClass(this.getClass());
    //input
    Path inPath = new Path(args[0]);
    FileInputFormat.addInputPath(job,inPath);
    //output
    Path outPath = new Path(args[1]);
    FileOutputFormat.setOutputPath(job, outPath);
    //mapper
    job.setMapperClass(WebPVMapper.class);
    job.setMapOutputKeyClass(IntWritable.class);
    job.setMapOutputValueClass(IntWritable.class);
    // ======================shuffle==========================
    // 1.partitioner
    // job.setPartitionerClass(cls);
    // 2.sort
    // job.setSortComparatorClass(cls);
    // 3.combiner
    // 在shullfe过程中预先执行类似reduce的累加操作,使得reduce从本地文件获取map()后的数据更快,效率也就更高
    job.setCombinerClass(WebPVReduce.class);
    // 5.group
    // job.setGroupingComparatorClass(cls);
    // ======================shuffle==========================
    //Reduce
    job.setReducerClass(WebPVReduce.class);
    job.setOutputKeyClass(IntWritable.class);
    job.setOutputValueClass(IntWritable.class);
    //submit job
    boolean isSuccess = job.waitForCompletion(true);
    return isSuccess ? 0 : 1;
  }   public static void main(String[] args) throws Exception {
  
    args = new String[]{
      "hdfs://hadoop09-linux-01.ibeifeng.com:8020/user/liuwl/tmp/mapreduce/PV/input",
      "hdfs://hadoop09-linux-01.ibeifeng.com:8020/user/liuwl/tmp/mapreduce/PV/output5"
    };
    //run job
    int status = new WebPVMapReduce().run(args);
    System.exit(status);
  }
}

Hadoop.2.x_网站PV示例的更多相关文章

  1. PHP文件操作,多行句子的读取,file()函数,file_get_contents()函数,file_put_contents()函数,is_file,统计网站pv (访问量),文件的复制 copy,文件重命名 rename,删除文件 unlink

    php中添加utf-8: header("Content-type:text/html;charset='UTF-8'"); 文件操作步骤: 1.在同一目录下建立一个file.tx ...

  2. Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...

  3. [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...

  4. 网站PV、UV以及查看方法

    网站PV.UV以及查看方法 一.名词解释 PV:PV 是Page Views的缩写,即页面浏览量,用户每一次对网站中的每个网页访问均被记录一次.注意,访客每刷新一次页面,pv就增加一次. UV:UV是 ...

  5. Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例

    前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...

  6. Hive实现网站PV分析

    原文链接: https://www.toutiao.com/i6773241257528394248/ 之前我们做过<java mapreduce实现网站PV分析>,这次我们可以用hive ...

  7. java mapreduce实现网站PV分析

    原文链接: https://www.toutiao.com/i6765677128022229517/ PV 是Page Views的缩写,即页面浏览量,用户每一次对网站中的每个网页访问均被记录一次. ...

  8. Hadoop:pig 安装及入门示例

    pig是hadoop的一个子项目,用于简化MapReduce的开发工作,可以用更人性化的脚本方式分析数据. 一.安装 a) 下载 从官网http://pig.apache.org下载最新版本(目前是0 ...

  9. Hadoop.2.x_高级应用_二次排序及MapReduce端join

    一.对于二次排序案例部分理解 1. 分析需求(首先对第一个字段排序,然后在对第二个字段排序) 杂乱的原始数据 排序完成的数据 a,1 a,1 b,1 a,2 a,2 [排序] a,100 b,6 == ...

随机推荐

  1. 有关servlet初学者的资源和建议

    四天来学习servlet是很痛苦的经历,其实可以不必要这么痛苦,关键是一定要学会冷静的分析问题与解决问题,要不言学习也没有那么多的乐趣.初学java刚满15天. 首先对于资源来说建议先读一点点的PPT ...

  2. RPC和Socket,RMI和RPC之间的关系

    远程通信机制RPC与RMI的关系 http://blog.csdn.net/zolalad/article/details/25161133       1.RPC RPC(Remote Proced ...

  3. Spring的Lifecycle

    Lifecycle接口定义了每个对象的重要方法,每个对象都有自己的生命周期需求,如下: public interface Lifecycle { void start(); void stop(); ...

  4. XAML数据绑定(Data Binding)

    XAML数据绑定(Data Binding)   Data Binding可以使得XAML标签属性的赋值更为灵活和方便.在绑定过程中,获取数据的标签成为目标标签:提供数据的标签成为源标签.在XAML中 ...

  5. Swift3.0语言教程分割字符串与截取字符串

    Swift3.0语言教程分割字符串与截取字符串 Swift3.0语言教程分割字符串 如果想要快速的创建一个数组,我们可以将字符串进行分割,分割后的内容将会生成一个数组.在NSString中有两个分割字 ...

  6. BZOJ 2002 [Hnoi2010]Bounce 弹飞绵羊 ——Link-Cut Tree

    [题目分析] 以前用分块的方法做过这道题目,现在再用LCT水一边,发现思路确实巧妙. 每次弹射,可以看作在一条边上走了过去,而且很重要的性质,每一个点的出边只有一条. 那么就很容易知道,可以用LCT维 ...

  7. 用触发器来实现Oracle的自增长列

    1, 添加id列 -- ############################################### -- add ID column for XXXXXXTABLE -- #### ...

  8. 树状数组 + 位运算 LA 4013 A Sequence of Numbers

    题目传送门 题意:n个数,两种操作,一是每个数字加x,二是查询& (1 << T) == 1 的个数 分析:因为累加是永远的,所以可以离线处理.树状数组点是c[16][M] 表示数 ...

  9. Android 横屏切换竖屏Activity的生命周期(转)

    曾经遇到过一个面试题,让你写出横屏切换竖屏Activity的生命周期.现在给大家分析一下他切换时具体的生命周期是怎么样的:  1.新建一个Activity,并把各个生命周期打印出来  2.运行Acti ...

  10. docker 1.0.0发布以及一个bug依赖apparmor_parser

    6月10号docker 1.0稳定版本发布,找了台ubuntu的机器,装了下 ubuntu version:12.04 docker version:1.0.0 装docker的步骤可以看官方文档:h ...