22 优化日志文件统计程序-按月份统计每个用户每天的访问次数

news2024/11/15 17:57:42

       读取任务一中序列文件,统计每个用户每天的访问次数,最终将2021/1和2021/2的数据分别输出在两个文件中。

一、创建项目步骤:

1.创建项目

2.修改pom.xml文件

<packaging>jar</packaging>

<dependencies>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-client</artifactId>
        <version>3.1.4</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.30</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>

                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

3.在resources目录下创建日志文件log4j.properties

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=D:\\countLog.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

二、编写程序:

1.自定义键的类型 MemberLogTime  包含两个属性(memberId,memberLogTime)  实现WritableComparable接口

2.编写Mapper模块:(在Mapper中计数器,使用枚举)

package com.maidu.countlog;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
import java.io.IOException;
/**@author:yt
 * @since:2024-05-15
 * 定义Mapper模块
 */
public class LogCountMapper  extends Mapper<Text,Text,MemberLogTime, IntWritable> {
    private MemberLogTime mt =new MemberLogTime();
    private IntWritable one =new IntWritable(1);

    //使用枚举
    enum LogCounter{
        January,
        February
    }
    @Override
    protected void map(Text key, Text value, Mapper<Text, Text, MemberLogTime, IntWritable>.Context context)
            throws IOException, InterruptedException {
        String memberId =key.toString();
        String logTime =value.toString();
        //计数器
        if(logTime.contains("2021/1")){
            //一月计数器值+1
            context.getCounter(LogCounter.January).increment(1);
        }else{
            context.getCounter(LogCounter.February).increment(1);
        }
        //将用户ID和访问时间存到MemberLogTime对象中
        mt.setMemberId(memberId);
        mt.setLogTime(logTime);
        context.write(mt,one);
    }
}

3.编写Combiner:

package com.maidu.countlog;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

/**
 * @author:yt
 * @since:2024-05-15
 *   合并的类
 */
public class LogCoutCombiner  extends Reducer<MemberLogTime, IntWritable,MemberLogTime,IntWritable> {
    @Override
    protected void reduce(MemberLogTime key, Iterable<IntWritable> values, Reducer<MemberLogTime, IntWritable, MemberLogTime, IntWritable>.Context context)
            throws IOException, InterruptedException {

        int sum =0;
        for(IntWritable val:values){
            sum+=val.get();
        }

        context.write(key,new IntWritable(sum));

    }
}

4.编写Patitioner:

package com.maidu.countlog;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Partitioner;

/**
 * @author:yt
 * @since:2024-05-15
 */
public class LogCountPartitioner extends Partitioner<MemberLogTime, IntWritable> {
    @Override
    public int getPartition(MemberLogTime memberLogTime, IntWritable intWritable, int numPartitions) {
        String date = memberLogTime.getLogTime();
        if(  date.contains( "2021/1")  ){
            return 0%numPartitions;
        }else{
            return 1%numPartitions;
        }
    }
}

5.编写Reduce模块:

package com.maidu.countlog;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

/**
 * @author:yt
 * @since:2024-05-15
 */
public class LogCountReducer  extends Reducer<MemberLogTime, IntWritable,MemberLogTime,IntWritable> {
    @Override
    protected void reduce(MemberLogTime key, Iterable<IntWritable> values, Reducer<MemberLogTime, IntWritable, MemberLogTime, IntWritable>.Context context)
            throws IOException, InterruptedException {
       //计数器(动态计数器)
       if(key.getLogTime().contains("2021/1")){
           context.getCounter("OuputCounter","JanuaryResult").increment(1);
       } else{
           context.getCounter("OuputCounter","FabruaryResult").increment(1);
       }

        int sum =0;
       for(IntWritable val:values){
           sum+=val.get();
       }
       context.write(key,new IntWritable(sum));

    }
}

6.编写Driver模块:

package com.maidu.countlog;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.SequenceFileAsTextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
/**
 * @author:yt
 * @since:2024-05-15
 */
public class LogCount {
    public static void main(String[] args) throws  Exception {
        Configuration  conf =new Configuration();
        Job job =Job.getInstance(conf,"Log count");
        job.setJarByClass(LogCount.class);
        job.setMapperClass(LogCountMapper.class);
        job.setReducerClass(LogCountReducer.class);
        job.setCombinerClass(LogCoutCombiner.class);
        job.setPartitionerClass(LogCountPartitioner.class);
        //设置reduce任务数2
        job.setNumReduceTasks(2);
        job.setOutputKeyClass(MemberLogTime.class);
        job.setOutputValueClass(IntWritable.class);
        job.setInputFormatClass(SequenceFileAsTextInputFormat.class);
        job.setOutputFormatClass(TextOutputFormat.class);
        //添加输入路径
        FileInputFormat.addInputPath(job,new Path(args[0]));
        FileOutputFormat.setOutputPath(job,new Path(args[1]));
        System.exit(job.waitForCompletion(true)?0:1);
    }
}

7.使用Maven打包为Jar文件,上传到master节点上执行

[yt@master ~]$ hadoop jar countLog-1.0-SNAPSHOT.jar  com.maidu.countlog.LogCount  /ouput-2301-select/part-m-00000  /logcount/2301/
 

8.查看运行结果

(1)计数器

(2)结果

(3)查看其中一个文件内容

[yt@master ~]$ hdfs dfs -cat /logcount/2301/part-r-00001

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1678458.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

听劝!普通人千万别随意入门网络安全

一、什么是网络安全 网络安全是一种综合性的概念&#xff0c;涵盖了保护计算机系统、网络基础设施和数据免受未经授权的访问、攻击、损害或盗窃的一系列措施和技术。经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”…

Linux-页(page)和页表

本文在页表方面参考了这篇博客&#xff0c;特别鸣谢&#xff01; 【Linux】页表的深入分析 1. 页帧和页框 页帧&#xff08;page frame&#xff09;是内存的最小可分配单元&#xff0c;也开始称作页框&#xff0c;Linux下页帧的大小为4KB。 内核需要将他们用于所有的内存需求&a…

【Git教程】(十九)合并小型项目 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 合并小型项目 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现 在项目的初始阶段&#xff0c;往往需要针对重要的设计决策和技术实现原型实验。当原型评估结束后&#xff0c;需要将那些成功的原型合并起来称为整个项目的初始版本。 在这样的情景中&#xff0c;各个原…

什么是ARP攻击,怎么做好主机安全,受到ARP攻击有哪些解决方案

在数字化日益深入的今天&#xff0c;网络安全问题愈发凸显其重要性。其中&#xff0c;ARP攻击作为一种常见的网络攻击方式之一&#xff0c;往往给企业和个人用户带来不小的困扰。ARP协议是TCP/IP协议族中的一个重要协议&#xff0c;负责把网络层(IP层)的IP地址解析为数据链路层…

Vmvare—windows中打不开摄像头

1、检查本地摄像头是否能正常打开 设备管理器—查看—显示隐藏设备—选中照相机—启动 USB2.0 HD UVC—打开相机查看 2、检查虚拟机的设置 虚拟机—虚拟机—可移动设备—USB2.0 HD UVC—勾选在状态栏中显示 虚拟机—打开windows主机—右小角选中圆圈图标—勾选连接主机 此时…

办公园区建筑科技风效果(html+threejs)

办公楼科技风(Htmlthreejs) 初始化三维场景 function init() {container document.getElementById(container);camera new THREE.PerspectiveCamera(65, window.innerWidth / window.innerHeight, 0.1, 150000000);camera.position.set(550, 600, 690);scene new THREE.Sce…

MES系统追溯管理功能,迅速定位问题源头

一、MES系统概述 MES系统是一种实现车间生产智能化、信息化的管理系统&#xff0c;通过对生产现场的数据进行实时采集、处理和分析&#xff0c;为企业管理者提供准确、及时的生产信息。MES系统主要包括生产订单管理、物料追溯、质量管理、设备管理、物料管理、人员管理等功能模…

探索数据结构(让数据结构不再成为幻想)

目录 什么是数据结构 数据与结构 什么是算法 复杂度分析 时间复杂度与空间复杂度 时间复杂度 思考&#xff1a; 空间复杂度 常数阶O(1) 对数阶O(logn) 线性阶O(n) 以下为空间复杂度为O(n) 线性对数阶O(nlogn) 平方阶O(n) 指数阶O(2^n) 什么是数据结构 数据结构…

Python送你小花花

快到520了&#xff0c;准备好送上你的爱意了吗&#xff1f; 还记得去年从网上模仿了一篇python使用turtle画的小花花程序&#xff0c;当时还没有转行到程序员行业&#xff0c;刚刚入门学习编程&#xff0c;还在纠结是学习python、Java还是C#的时候。 总会被一些猎奇的内容吸引&…

uniapp如何打包预约按摩H5?

uniapp如何打包预约按摩H5&#xff1f; 开发工具&#xff1a;HBuilderX 一、如何修改域名配置&#xff1f; 1、修改公众号AppID、页面访问路径 1&#xff09;gzh_appid: 公众号AppID siteroot: 域名&#xff0c;需更换为你自己的域名以及公众号APPID&#xff0c;域名格式【htt…

雍禾植发张东宏:以诚相待毛发患者

医学道路上的奋斗往往需要坚定的信念和不懈的努力。对于张东宏医生来说&#xff0c;医学并非止步于书本知识&#xff0c;而是一次次与患者对话、一次次实操中的历练和积累。在他的成长历程中&#xff0c;医学之路如同一棵参天大树&#xff0c;每一步都是扎实的打磨&#xff0c;…

windows设置Redis服务后台自启动

问题 在日常开发过程中&#xff0c;redis是我们常用的缓存工具&#xff0c;但是由于redis对于Linux系统进行开发的&#xff0c;在Linux系统里可以通过修改redis.conf从而从而实现后台启动。 daemonize no 改成 daemonize yes 但是在window上如何也进行后台运行呢&#xff0c…

Arduino红外遥控器,控制继电器水泵

我们将讨论如何使用Arduino和IRremote库来实现通过红外遥控器控制继电器的开关。通过这个项目&#xff0c;你将学会如何接收和解码红外信号&#xff0c;并根据接收到的信号控制继电器&#xff08;这里的继电器可以换成其他传感器&#xff09;的状态。 项目简介 我们将使用Ard…

自由职业是种怎样的体验?普通人如何成为一名自由职业者?

自由职业在哪都能办公自由职业在哪都要办公。 放弃幻想&#xff0c;没有不辛苦的工作&#xff0c;5年经验后端开发程序员&#xff0c;已经从事自由职业1年半&#xff0c;今天就来客观分享一下自由职业的利与弊。 时间自由&#xff0c;减少中间商赚差价 自由职业最让人羡慕的就…

探秘Web3科技:科技变革的下一个风口

引言 随着互联网的发展&#xff0c;我们正处于一个数字化时代&#xff0c;而Web3技术被认为是数字革命的下一个风口。相较于传统的Web2&#xff0c;Web3技术以其去中心化、安全可信的特点&#xff0c;正在引领着科技变革的潮流。本文将深入探讨Web3科技&#xff0c;揭示其背后…

泽攸科技无掩模光刻机:引领微纳制造新纪元

在当今科技迅猛发展的时代&#xff0c;微纳制造技术正变得越来越重要。泽攸科技作为这一领域的先行者&#xff0c;推出了其创新的无掩模光刻机&#xff0c;这一设备在微电子制造、微纳加工、MEMS、LED、生物芯片等多个高科技领域展现出了其独特的价值和广泛的应用前景。 技术革…

C#实现各种Hash计算

C#实现各种Hash计算 文章目录 C#实现各种Hash计算涉及框架及库目前支持可计算的类型核心代码完整可运行代码 BCrypt总结 涉及框架及库 自己在NuGet管理器里面安装即可 BouncyCastle.Cryptography&#xff1a;是加密算法和协议的.NET实现。 目前支持可计算的类型 BLAKE2B_16…

Laravel中使用MinIO进行文件操作及ZIP解压

Laravel中使用MinIO进行文件操作及ZIP解压指南 介绍 在本指南中&#xff0c;我们将详细介绍如何在laravel框架中操作minio&#xff0c;包含方法有&#xff1a;桶列表&#xff0c;创建桶&#xff0c;修改桶&#xff0c;上传文件&#xff0c;删除文件&#xff0c;生成直传链接&…

【全开源】JAVA语聊大厅语音聊天APP系统源码

语聊大厅语音聊天源码&#xff1a;打造专属的语音社交平台 核心功能 多人语音聊天&#xff1a;支持多人同时在线语音聊天&#xff0c;用户可以创建或加入不同的聊天室&#xff0c;与好友或陌生人进行实时互动。语音转文字&#xff1a;提供语音转文字功能&#xff0c;方便用户…