大数据学习四之MapReduce 模板编写UV程序

大数据学习四之MapReduce 模板编写UV程序

在写程序之前先了解一些相关定义:

  1. 几个网站基本指标:
    (1)PV(Page View):页面点击(浏览)量,每刷新一次页面就会被计算一次。
    (2)UV(Unique Vistor):独立访客数,记录独立访客访问次数,同一个访客多次访问算一次。
    (3)VV(Visit View):访客数,记录所有访客访问次数,打开网站到关闭网站为一次访问,同一访客多次访问会被记录多次。
    (4)IP(IP数):使用不同IP地址的用户访问网站的数量,同一IP无论访问了几个页面,独立IP数均为1。
  2. MapReduce执行过程
 -》input:默认从hdfs读取数据:TextInputFormat  -》mapper
        -》输入:input的输出
        -》map:方法,一行调用一次map方法
            -》设计输出,构造输出的keyvalue
            -》对每一行内容进行分割
            -》输出
    -》shuffle:分区,分组,排序
    -》reduce:每一条keyvalue调用一次reduce方法
    -》output
        输出:默认将reduce的输出写入hdfs

需求:
我们将分析一个网站访问数据文件,统计每个城市的UV数

思路:
想要统计uv数,我们只需要统计有效数据中guid(唯一用户id)数就好了,下面确定每一步的输入输出值:
input:hdfs上的文件

map
key:城市id Text
value:guid Text

shuffle
key:城市id
value:{uuid1,uuid1,uuid3……}

reduce
key:城市id
value:不同uuid的个数(uv)

output
key:城市id
value:uv数
代码实现如下(使用Maven管理项目):

package com.lmt.uv;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
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;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
import java.io.IOException;
import java.util.HashSet;

public class WebLogUvMr extends Configured implements Tool {

    public static class WebLogUvMapper extends Mapper<LongWritable,Text,Text,Text> {
        private Text outputKey = new Text();
        private Text outputValue = new Text();

        @Override
        protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
            //分割每一行
            String line = value.toString();
            String[] items = line.split("\t");
            if (36 <= items.length){
                //判断cityId、guid不能为空,下标分别为24,5
                if (StringUtils.isBlank(items[5]) || StringUtils.isBlank(items[24])){
                    return;
                }
                //获取key的值:城市id,下标24
                this.outputKey.set(items[24]);
                //获取value的值:guid,下标5
                this.outputValue.set(items[5]);
                context.write(outputKey,outputValue);
            }else {
                return;
            }
        }
    }

    public static class WebLogUvReducer extends Reducer<Text,Text,Text,IntWritable> {

        @Override
        protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException {
            //将guid迭代,去重
            HashSet hashSet = new HashSet();
            for (Text value:values){
                hashSet.add(value);
            }
            context.write(key,new IntWritable(hashSet.size()));
        }
    }



    @Override
    public int run(String[] args) throws Exception {
        //job
        Job job = Job.getInstance(this.getConf(),"uvtest");
        job.setJarByClass(WebLogUvMr.class);
        //input
        Path inputPath = new Path(args[0]);
        FileInputFormat.setInputPaths(job, inputPath);
        //mapper
        job.setMapperClass(WebLogUvMapper.class);
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(Text.class);

        //reduce
        job.setReducerClass(WebLogUvReducer.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        job.setNumReduceTasks(2);//设置reduce的个数,默认为1
        //output
        Path outputPath = new Path(args[1]);
        FileOutputFormat.setOutputPath(job,outputPath);

        boolean isSuccess = job.waitForCompletion(true);
        return isSuccess ? 0 : 1;
    }

    public static void main(String[] args) {
        Configuration conf = new Configuration();
        try {
            int status = ToolRunner.run(conf, new WebLogUvMr(), args);
            System.exit(status);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

将其打包成jar(这里将其命名为uv.jar)包后上传到Linux下的/opt/tools/下面
数据准备:
将待分析文件2015082818上传到hdfs的
/lmt/huadian/mapreduce/wordcount/input

```
$ bin/hdfs dfs -mkdir -p /lmt/huadian/mapreduce/wordcount/input
$ bin/hdfs dfs -put /opt/datas/2015082818 /lmt/huadian/mapreduce/wordcount/input

执行jar,进行数据分析

 $bin/yarn jar /opt/tools/uv.jar com.lmt.uv.WebLogUvMr /lmt/huadian/mapreduce/wordcount/input /lmt/huadian/mapreduce/wordcount/output4

运行结果:
大数据学习四之MapReduce 模板编写UV程序_第1张图片
大数据学习四之MapReduce 模板编写UV程序_第2张图片

你可能感兴趣的:(java,大数据,Linux,大数据框架)