编程实现Hadoop按日期统计访问次数

这篇具有很好参考价值的文章主要介绍了编程实现Hadoop按日期统计访问次数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实训目标

(1)编程实现按日期统计访问次数

二、实训环境

(1)使用CentOSd Linux操作系统搭建的3个节点

(2)使用JDK

(3)使用Hadoop

三、实训内容

(1)统计用户在2016年度每个自然日的总访问次数,数据格式如图,第一列为用户名,第二列为登录的日期。

编程实现按日期统计访问次数,Hadoop相关,hadoop,大数据,Powered by 金山文档

四、实例步骤

4.1分析思路与处理逻辑

数据总共有两列,第一列为用户名,第二列为登录的日期,想要统计每个自然日,也就是每一天的访问次数,可以转换为对日期值的词频统计,只要统计出每个日期出现的次数,就可以知道对应日期的日访问次数。将思路转化为MapReduce编程逻辑,需要从以下3个模块考虑。

(1)输入输出格式

(2)Mapper要实现 的计算逻辑

(3)Reducer要实现的计算逻辑

接下来依次分析这几个模块的解决思路与处理逻辑。

1.定义输出格式

通过统计日期的词频来统计每个自然日的访问次数,那么Map的输出就是<访问日期,1>,Reduce输出就是<访问日期,访问次数>。

社区网站用户的访问日期,在格式上都属于文本格式,访问次数为整型数值格式。组成的键值对为<访问日期,访问次数>,因此Map的输出与Reduce的输出都选用Text类与IntWritable类。

2.Mapper类的逻辑实现

Mapper类中最主要的部分就是map函数。map函数的主要任务是读取用户访问文件中的数据,输出所有访问日期与初始次数的键值对。因为访问日期是数据文件中的第2列,所以先定义一个数组后,再提取第2个元素,与初始次数1一起构成要输出的键值对,即<访问日期,1>。

以下为伪代码来编写Mapper的处理逻辑,代码如下

编程实现按日期统计访问次数,Hadoop相关,hadoop,大数据,Powered by 金山文档

3.Reducer类的逻辑实现

Reducer类中最主要的部分就是reduce函数,reduce函数的主要任务就是读取Mapper输出的键值对<访问日期,1>。这一部分的处理逻辑与官方示例wordcount中的Reducer完全相同。如图

编程实现按日期统计访问次数,Hadoop相关,hadoop,大数据,Powered by 金山文档

4.2编写核心模块代码

(1)编写Mapper模块代码

package cn.demo.myfriend.data;
​
import java.io.IOException;
​
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
​
/**
 * 
 * @author zhongyulin
 *   LongWritable   输入的偏移量
 *   Text    输入的数据
 *   Text    输出的key
 *   IntWritable    输出的value
 */
public class MyMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
    
    private final static IntWritable one=new IntWritable(1);
    
    @Override
    protected void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {
          String line=value.toString();
          //按规则拆分成数组
          String[] arry=line.split(",");
          String keyout=arry[1];
          context.write(new Text(keyout),one);
    }
}

(2)编写Reducer模块代码

package cn.demo.myfriend.data;
​
import java.io.IOException;
​
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
​
/**
 * Reducer模块
 * @author zhongyulin
 *
 */
public class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
    
    private IntWritable result=new IntWritable();
    @Override
    protected void reduce(Text key, Iterable<IntWritable> values,
            Context context) throws IOException, InterruptedException {
         int sum=0;
         for (IntWritable val : values) {
            sum +=val.get();
        }
         result.set(sum);
         context.write(key, result);
    }
}

(3)编写Dirver模块

//编写Driver
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        //1.初始化相应的hadoop配置
        Configuration conf = new Configuration();
        //收集异常信息
        String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        if(otherArgs.length<2){
            System.err.println("需要两个参数,第一个参数是输入文件路径,第二个参数是输出文件路径");
            System.exit(2);
        }
        //2.新建job并且设置主类,这里的job实例需要把configuraction的实例传入,后面的“word count”是该mapreduce任务的名字
        Job job = Job.getInstance(conf,"Daily Access Aount");
         //3.设置jar包名 通过类型名生成
        job.setJarByClass(DailyAccessCount.class);
        job.setMapperClass(MyMapper.class);//TODO
        //4.里面类名为实际任务的Mapper
        //设置combiner类,可选 优化处理
        job.setReducerClass(MyReducer.class);//TODO
        //5.里面的类名是为实际任务的reducer
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        //6.设置输出键值对类型 ,如果map和reducer输出类型一样,只需要设置总输出
        //设置读取的文件路径
         //hadoop jar ...jar  wordcount /路径1 /路径2
        for (int i = 0; i < otherArgs.length-1; i++) {
            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
        }
        //设置输出的文件路径
        for (String str : otherArgs) {
            FileOutputFormat.setOutputPath(job, new Path(str));
        }
        System.exit(job.waitForCompletion(true)?0:1);
        //7.提交mapreduce任务运行(固定写法),并等待任务运行结束
        
    }

4.3任务实现

在本地上创建一个user_login.txt内容如下

Nehru,2016-01-01
Dane,2016-01-01
Walter,2016-01-01
Gloria,2016-01-01
Clarke,2016-01-01
Madeline,2016-01-01
Kevyn,2016-01-01
Rebecca,2016-01-01
Calista,2016-01-01
Lana,2016-01-01
Phoebe,2016-01-01
Clayton,2016-01-01
Kimberly,2016-01-01
Drew,2016-01-01
Giselle,2016-01-01
Nolan,2016-01-01
Madeson,2016-01-01
Janna,2016-01-01
Raja,2016-01-01
Aurelia,2016-02-01
Wynter,2016-02-01
Mari,2016-02-01
Molly,2016-02-01
Marshall,2016-02-01
Brynne,2016-02-01
Hannah,2016-02-01
Whilemina,2016-02-01
Gage,2016-02-01
Wallace,2016-03-15
Penelope,2016-03-15
Ursa,2016-03-15
Cassidy,2016-03-15
Venus,2016-03-15
Ethan,2016-03-15
Regina,2016-03-15
Orla,2016-03-15
Avram,2016-03-15
Barry,2016-03-15
Dalton,2016-03-15
Rhea,2016-03-15
Patrick,2016-03-15
Unity,2016-03-15
Zachary,2016-03-15
Hedley,2016-03-15
Sasha,2016-03-15
编程实现按日期统计访问次数,Hadoop相关,hadoop,大数据,Powered by 金山文档

在集群上创建一个文件夹user

编程实现按日期统计访问次数,Hadoop相关,hadoop,大数据,Powered by 金山文档

(1)上传文件/opt/user_login.txt到/user

hdfs dfs -put /opt/user_login.txt /user

(2)在工程src下创建一个test包,创建类dailyAccessCount.java ,类中完整内容如下

package dailyAccessCount;
 
import java.io.IOException;
import java.util.StringTokenizer;
 
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.examples.WordCount;
import org.apache.hadoop.examples.WordCount.IntSumReducer;
import org.apache.hadoop.examples.WordCount.TokenizerMapper;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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.Mapper.Context;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
 
 
 
/**
 * 任务目标是统计用户在2019年每个自然日的总访问次数
 * 原始数据文件中提供了用户名称和访问日期
 * @author student
 *  想要的数据格式:2019-11-06  3
 *  oax,2019-11-06
 *  map任务输出格式:2019-11-06,1
 *  reduce任务输出格式:2019-11-06,3
 */
public class DailyAccessCount {
    //extends Mapper 变成一个map模块
     //1.继承Mapper
      //2.设置输入/输出键值对类型 tips:输出对类型需要和Driver中设置的mapper输出的键值对类型保持一致
    public static class MyMapper extends Mapper<Object,Text,Text,IntWritable>{
        private final static IntWritable one = new IntWritable(1) ;
        //3.编写map方法,针对每条输入键值对执行函数中定义的逻辑处理,并按照规定的键值对格式输出。
        @Override
        public void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context)
                throws IOException, InterruptedException {
            String array[] = value.toString().split(",");
            //4.mapper输出内容
            context.write(new Text(array[1]), one);
        }
    }
     //extends Reducer 变成一个reducer 模块
      //1.继承reducer类
      //2.设置输入\输出格式  (reducer输入格式是是mapper的输出格式,reducer输出格式要个driver中设置reducer输出格式保持一致)
      public static class MyReducer extends Reducer<Text, IntWritable, Text, IntWritable>{
          //3.编写reduce  对shuffle处理后的map数据进行处理
          @Override
        public void reduce(Text key, Iterable<IntWritable> values,
                Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
              int sum = 0 ;
              for (IntWritable value : values) {
                sum = sum + value.get();
              }
              //4.输出内容 
              context.write(key, new IntWritable(sum));
        }
        
      }    
    
            
      
    //编写Driver
    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
        //1.初始化相应的hadoop配置
        Configuration conf = new Configuration();
        //收集异常信息
        String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
        if(otherArgs.length<2){
            System.err.println("需要两个参数,第一个参数是输入文件路径,第二个参数是输出文件路径");
            System.exit(2);
        }
        //2.新建job并且设置主类,这里的job实例需要把configuraction的实例传入,后面的“word count”是该mapreduce任务的名字
        Job job = Job.getInstance(conf,"Daily Access Aount");
         //3.设置jar包名 通过类型名生成
        job.setJarByClass(DailyAccessCount.class);
        job.setMapperClass(MyMapper.class);//TODO
        //4.里面类名为实际任务的Mapper
        //设置combiner类,可选 优化处理
        job.setReducerClass(MyReducer.class);//TODO
        //5.里面的类名是为实际任务的reducer
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);
        //6.设置输出键值对类型 ,如果map和reducer输出类型一样,只需要设置总输出
        //设置读取的文件路径
         //hadoop jar ...jar  wordcount /路径1 /路径2
        for (int i = 0; i < otherArgs.length-1; i++) {
            FileInputFormat.addInputPath(job, new Path(otherArgs[i]));
        }
        //设置输出的文件路径
        for (String str : otherArgs) {
            FileOutputFormat.setOutputPath(job, new Path(str));
        }
        System.exit(job.waitForCompletion(true)?0:1);
        //7.提交mapreduce任务运行(固定写法),并等待任务运行结束
        
    }
}

(3)编译打包程序,生成JAR文件

dailyAccessCount.jar。右键单击dailyAccessCount类,选择“Export” a "java" a "jar file" ,单击“next”在所示界面填写jar文件名称和jar文件存放路径,单击“finish”

编程实现按日期统计访问次数,Hadoop相关,hadoop,大数据,Powered by 金山文档
编程实现按日期统计访问次数,Hadoop相关,hadoop,大数据,Powered by 金山文档
编程实现按日期统计访问次数,Hadoop相关,hadoop,大数据,Powered by 金山文档

将dailyAccessCount.java生成jar包上传到hadoop的/opt目录下

编程实现按日期统计访问次数,Hadoop相关,hadoop,大数据,Powered by 金山文档

(4)在jar文件所在目录,以hadoop jar命令提交任务,具体命令如下

hadoop jar dailyAccessCount.jar test.dailyAccessCount /user/user_login.txt /user/AccessCount
编程实现按日期统计访问次数,Hadoop相关,hadoop,大数据,Powered by 金山文档

(5)检查输出结果类似如下

1.在HDFS中/user/AccessCount/part-r-00000下即可查看结果

2.集群监控查看如下

编程实现按日期统计访问次数,Hadoop相关,hadoop,大数据,Powered by 金山文档

结论比较:数据量比较低,节点比较少文章来源地址https://www.toymoban.com/news/detail-743859.html

/***
 *             ,%%%%%%%%,
 *           ,%%/\%%%%/\%%
 *          ,%%%\c "" J/%%%
 * %.       %%%%/ o  o \%%%
 * `%%.     %%%%    _  |%%%
 *  `%%     `%%%%(__Y__)%%'
 *  //       ;%%%%`\-/%%%'
 * ((       /  `%%%%%%%'
 *  \\    .'          |
 *   \\  /       \  | |
 *    \\/         ) | |
 *     \         /_ | |__
 *     (___________))))))) 攻城湿
 */
​

到了这里,关于编程实现Hadoop按日期统计访问次数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据实战——基于Hadoop的Mapreduce编程实践案例的设计与实现

    图1:MaxCompute MapReduce各个阶段思路设计 设计思路分析分为六个模块:input输入数据、splitting拆分、Mapping映射、Shuffing派发、Reducing缩减、Final result输出。 输入数据:直接读入文本不进行分片,数据项本身作为单个Map Worker的输入。 Map阶段:Map处理输入,每获取一个数字,将数

    2024年02月05日
    浏览(53)
  • Hadoop 实战 | 词频统计WordCount

    通过分析大量文本数据中的词频,可以识别常见词汇和短语,从而抽取文本的关键信息和概要,有助于识别文本中频繁出现的,这对于理解文本内容和主题非常关键。同时,通过分析词在文本中的相对频率,可以帮助理解词在不同上下文中的含义和语境。 \\\"纽约时报\\\"评

    2024年02月02日
    浏览(42)
  • 使用hadoop进行词频统计测试案例

    1首先hadoop集群环境,使用jps’查看服务启动情况 1.1使用 start-all.sh 启动Hadoop集群环境   1..2使用jps查看服务启动情况  2创建一个需要进行处理的数据文件:word.txt 2.1 为了方便管理,首先创建一个文件夹(我这里创建已经创建了mydata,这个自定义)再在其下创建文件  2.2 进入

    2024年02月02日
    浏览(111)
  • Hadoop MapReduce 统计汽车销售信息

    本文将讨论如何使用Hadoop MapReduce来统计汽车销售信息。 汽车销售的记录文件名叫Cars.csv,里面记录了汽车的销售信息,数据内容如下: 格式为: 第1列:销售的省份 第3列:销售的城市 第7列:汽车生产商 第8列:汽车品牌名 第12列:汽车销售数量 已经将Cars.csv上传到HDFS文件

    2024年02月03日
    浏览(53)
  • 云计算课程设计基于hadoop的词频统计设计

    云计算课程设计基于hadoop的词频统计设计实验报告 http://链接:https://pan.baidu.com/s/1ujUAg4q1sZZwmyeeKrNirg 提取码:maq7

    2024年02月13日
    浏览(40)
  • hadoop学习:mapreduce入门案例二:统计学生成绩

    这里相较于 wordcount,新的知识点在于学生实体类的编写以及使用 数据信息: 1. Student 实体类 2.  mapper 阶段,StudentMapper 类 3. reduce 阶段,StudentReduce 类 4. 驱动类,studentDriver 类

    2024年02月11日
    浏览(43)
  • 【hadoop】汽车销售数据统计分析项目(部分)

    来源:《hadoop大数据开发实战》 实验一:统计乘用车辆和商用车辆的数量和销售额分布 设计思路: 首先,写一个Mapper来映射输出所有乘用车辆(feiyingyun)和商用车辆(yingyun)的记录。 然后,写一个reduce统计出乘用车辆和商用车辆各自的数量,写一个map的映射集合中,其中

    2024年02月09日
    浏览(53)
  • 分布式集群——搭建Hadoop环境以及相关的Hadoop介绍

    分布式集群——jdk配置与zookeeper环境搭建 分布式集群——搭建Hadoop环境以及相关的Hadoop介绍 文章目录 前言 一 hadoop的相关概念 1.1 Hadoop概念 补充:块的存储 1.2 HDFS是什么 1.3 三种节点的功能 I、NameNode节点 II、fsimage与edits文件存放的内容介绍 III、DataNode节点 IV、SecondaryNameNod

    2024年02月10日
    浏览(53)
  • hadoop3相关配置

    一、hadoop部署 master slave1 slave2 namenode 是 secondarynamenode 是 datanode 是 是 是 resourcemanager 是 nodemanager 是 是 是 jobhistory 是 二、相关设置 1、主机名与ip映射:hosts文件 验证:ping master,ping slave1,ping slave2 hosts文件要传送至slave1,slave2。思考原因?(让slave1和slave2可以通过主机名ping通对

    2024年02月22日
    浏览(43)
  • Hadoop 相关介绍

    目录 一、Hadoop介绍 二、Hadoop 架构 1、 Hadoop 1.x 架构 2、Hadoop 2.x 3.x 架构 三、HDFS介绍 1、HDFS架构 2、HDFS 特点 四、 Hadoop 之 MapReduce 初体验 1、使用上述的测试包, 计算圆周率 2、使用上述的测试包, 进行词频统计 1. Hadoop之父:道格 卡丁 (Doug Cutting) 2. 吉祥物: 大象 3. Hadoop 解

    2024年02月02日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包