基于MapReduce的手机上网流量统计分析

Posted 一只懒得睁眼的猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于MapReduce的手机上网流量统计分析相关的知识,希望对你有一定的参考价值。

Hadoop简介:适合大数据的分布式存储与计算平台。
运行在Hadoop之上的大型服务器集群:

数据情况:(摘取部分)

字段描述:时间戳、手机号码、AP mac、AP mac、访问的网址、网址种类、上行数据包、下行数据包、流量、访问状态。
手机上网流量统计结果:(先展示统计部分结果)

MapReduce程序开发步骤:
1、maper函数的编写
2、reducer函数的编写
3、MapReduce程序驱动的编写
mapper函数、reducer函数、驱动具体编写步骤:
map函数编写的基本原则是:MapReduce每读一行文本就调用一次我们的map函数,拿到日志中的一行数据,切分各个字段,从中抽选出我们需要的字段.然后封装成键值对进行处理.简单来说map函数的逻辑就是读行局部处理.

reduce函数编写的基本原则是MapReduce每传递一组数据


package IT;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
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.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.mapreduce.lib.partition.HashPartitioner;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;

public class FlowCount  extends Configured implements Tool

        public static String path1="";
        public static String path2="";
        public int run(String[] arg0) throws Exception
        
            path1=arg0[0];
            path2=arg0[1];
            Job job = new Job(new Configuration(),"FlowCount");
            job.setJarByClass(FlowCount.class);//jar包
            //编写驱动
            FileInputFormat.setInputPaths(job, new Path(path1));
            job.setInputFormatClass(TextInputFormat.class);
            job.setMapperClass(MyMapper.class);
            job.setMapOutputKeyClass(Text.class);
            job.setMapOutputValueClass(LongWritable.class);
            job.setNumReduceTasks(1);
            job.setPartitionerClass(HashPartitioner.class);
            job.setReducerClass(MyReducer.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(LongWritable.class);
            FileOutputFormat.setOutputPath(job, new Path(path2));
            job.setOutputFormatClass(TextOutputFormat.class);
            //向yarn平台提交任务
            job.waitForCompletion(true);
            return 0;
        
        public static void main(String[] args) throws Exception
        
            ToolRunner.run(new FlowCount(), args);
        
       public static class MyMapper extends Mapper<LongWritable, Text, Text, LongWritable>
       
            protected void map(LongWritable k1, Text v1,Context context)throws IOException, InterruptedException
            
                 String[] splited = v1.toString().split("\\t");
                 String str1 = splited[1];//获取手机号
                 String str2 = splited[8];//获取单行流量
                 Text k2 = new Text(str1);
                 LongWritable v2 =  new LongWritable(Long.parseLong(str2));
                 context.write(k2, v2);
            
       
       public static class MyReducer extends Reducer<Text, LongWritable, Text, LongWritable>
       
            protected void reduce(Text k2, Iterable<LongWritable> v2s,Context context)throws IOException, InterruptedException
            
                long sum = 0L; 
                for (LongWritable v2 : v2s)
                
                     sum +=v2.get();
                
                Text k3 = k2;
                LongWritable v3 =  new LongWritable(sum);
                context.write(k3, v3);
            
       

2、导出jar包




最终通过eclipse导出jar包:

3、在linux文件系统中通过shell命令将流量数据上传到HDFS中

4、在linux中运行jar包,即运行MapReduce程序

5、MapReduce程序运行完之后核实内置计数器进行校验

6、通过shell命令查看运行结果

综上:当给定我们一个业务后,如何用MapReduce实现某个业务?
1>给的原始数据相当于告诉了我们键值对

以上是关于基于MapReduce的手机上网流量统计分析的主要内容,如果未能解决你的问题,请参考以下文章

第2节 mapreduce深入学习:8手机流量汇总求和

MapReduce实现手机上网流量分析

Hadoop Mapreduce 案例 统计手机流量使用情况

Hadoop学习之路(十九)MapReduce框架排序

大数据之Hadoop(MapReduce): 序列化案例实操

mapreduce 自定义数据类型的简单的应用