Hadoop.2.x_网站PV示例

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

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也行)

[[email protected] 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
[[email protected] 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);
  }
}
时间: 2024-08-25 17:56:13

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

Hadoop MapReduce 官方教程 -- WordCount示例

Hadoop MapReduce 官方教程 -- WordCount示例: http://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html#%E4%BE%8B%E5%AD%90%EF%BC%9AWordCount+v1.0

刷流量,免费手机在线刷网站流量,刷网站PV,刷博客流量,刷博客访问量

刷流量,免费手机在线刷网站流量,刷网站PV,刷博客(淘宝)流量,刷博客(淘宝)访问量,用手机浏览器或者微信扫以下二维码: 有图有真相:还怕网站每天流量极低的站长们,还有网店的店主们,动动你们的手指,打开手机浏览器或微信扫扫二维码:你会惊讶的看到,手机也能刷网站(网店)流量,网站PV哦!    网站来源:http://www.learnphp.cn

Flume+Kafka+Storm+Redis构建大数据实时处理系统:实时统计网站PV、UV+展示

[TOC] 1 大数据处理的常用方法 前面在我的另一篇文章中<大数据采集.清洗.处理:使用MapReduce进行离线数据分析完整案例>中已经有提及到,这里依然给出下面的图示: 前面给出的那篇文章是基于MapReduce的离线数据分析案例,其通过对网站产生的用户访问日志进行处理并分析出该网站在某天的PV.UV等数据,对应上面的图示,其走的就是离线处理的数据处理方式,而这里即将要介绍的是另外一条路线的数据处理方式,即基于Storm的在线处理,在下面给出的完整案例中,我们将会完成下面的几项工作: 1

java mapreduce实现网站PV分析

原文链接: https://www.toutiao.com/i6765677128022229517/ PV 是Page Views的缩写,即页面浏览量,用户每一次对网站中的每个网页访问均被记录一次.注意,访客每刷新一次页面,pv就增加一次. 我们目前的数据是: 其中的数据我们会得到标注 根据标注我们进行代码筛选,编写MapReduce 分析:我们先根据标注的表中有一个“省份”的字段,依据“省份”编写map. 首先我们创建Maven项目 填写pom信息 创建Map类 基本结构如下: 我们需要对原

查看网站pv

PV(page view),即页面浏览量,或点击量:通常是衡量一个网络新闻频道或网站甚至一条网络新闻的主要指标.简单来解释PV,那就是一个访问者在24小时(0点到24点)内到底看了你网站多少个页面.这里需要强调:同一个人浏览你网站同一个页面,不重复计算PV量,点100次也算1次.说白了,PV就是一个访问者打开了你的几个页面.PV之于网站,就像收视率之于电视,从某种程度上已成为投资者衡量商业网站表现的最重要尺度.PV的计算:当一个访问者访问的时候,记录他所访问的页面和对应的IP,然后确定这个IP今

Storm之网站PV统计利用Zookeeper锁控制线程操作

PV(page views): count (session_id) 多线程下,注意线程安全问题 一.PV统计 方案分析 如下是否可行? 1.定义static long pv, Synchronized 控制累计操作 Synchronized 和 Lock在单JVM下有效,但在多JVM下无效 可行的两个方案: 1.shuffleGrouping下,pv * Executer并发数 2.bolt1进行多并发局部汇总,bolt2单线程进行全局汇总 线程安全:多线程处理的结果和单线程一致 汇总型方案:

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

一.对于二次排序案例部分理解 1. 分析需求(首先对第一个字段排序,然后在对第二个字段排序) 杂乱的原始数据 排序完成的数据 a,1 a,1 b,1 a,2 a,2 [排序] a,100 b,6 ===> b,-3 c,2 b,-2 b,-2 b,1 a,100 b,6 b,-3 c,-7 c,-7 c,2 2. 分析[MapRedice过程] 1> 分析数据传入通过input()传入map() 2> map()对数据进行层层过滤,以达到我们想要的数据源, 3> 过滤方法中可添加自

Nodejs学习笔记(七)--- Node.js + Express 构建网站简单示例

目录 前言 新建项目.建立数据库以及其它准备工作 新建express + ejs 项目:sampleEjs 创建数据库 修改package.json文件,安装session和mysql模块 样式和JQuery文件 清理项目冗余文件,并添加监听 规划路由,并新建相关文件 实现登录和注册需要的数据访问方法 注册 登录 首页 安全退出 写在之后 前言 上一篇学习了一些构建网站会用到的一些知识点   http://www.cnblogs.com/zhongweiv/p/nodejs_express_we

Hadoop.2.x_伪分布环境搭建

一. 基本环境搭建 1. 设置主机名.静态IP/DNS.主机映射.windows主机映射(方便ssh访问与IP修改)等 设置主机名: vi /etc/sysconfig/network # 重启系统生效(临时修改: hastname xxx;另起一个终端将会看到效果,需要注意的是: 若即将搭建Hadoop,这里起的hostname禁止使用"_") 设置静态IP/DNS: vi /etc/sysconfig/network-scripts/ifcfg-eth0(示例:修改BOOTPROT