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

       读取任务一中序列文件,统计每个用户每天的访问次数,最终将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}@Overrideprotected 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")){//一月计数器值+1context.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> {@Overrideprotected 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> {@Overridepublic 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> {@Overrideprotected 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任务数2job.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.hqwc.cn/news/704002.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cache基本原理--以TC3xx为例(2)

目录 1.概述 2. Cache映射模式 3.DCache的数据一致性 4.小结 1.概述 上一篇Cache基本原理--以TC3xx为例(1)-CSDN博客&#xff0c;我们聊了Cache基本概念&#xff0c;接下来我们将继续聊Cache映射模式&#xff0c;DCache的数据一致性问题。 2. Cache映射模式 常见的Cache地…

SprintBoot案例-增删改查

黑马程序员JavaWeb开发教程 文章目录 一、准备工作1. 准备数据库表1.1 新建数据库mytlias1.2 新建部门表dept1.3 新建员工表emp 2. 准备一个Springboot工程2.1 新建一个项目 3. 配置文件application.properties中引入mybatis的配置信息&#xff0c;准备对应的实体类3.1 引入myb…

云服务器和物理机该怎样分别呢

随着网络的不断发展&#xff0c;服务器的类型也在以不同的方式更新。现在云服务器的兴起占据了很大一部分市场&#xff0c;物理机的市场份额受到了很大的冲击。物理机和云服务器有什么区别&#xff1f;如何选择适合自己需求的&#xff1f;虽然物理服务器和云服务器都是服务器&a…

应用软件安全保证措施方案书

系统安全保证措施方案—word原件 软件全套资料进主页获取或者本文末个人名片直接获取。

二手手机行业商家如何利用二手机店erp进行破局?

在数字化和AI发展越发先进的的今天&#xff0c;二手手机市场正迎来前所未有的变革。途渡科技精心打造的超机购ERP管理软件&#xff0c;凭借其独特的智能化、高效化特点&#xff0c;正在引领这场变革&#xff0c;为二手手机商家提供全面、深度的数字化管理解决方案。二手手机商家…

Xed编辑器开发第一期:使用Rust从0到1写一个文本编辑器

这是一个使用Rust实现的轻量化文本编辑器。学过Rust的都知道&#xff0c;Rust 从入门到实践中间还隔着好几个Go语言的难度&#xff0c;因此&#xff0c;如果你也正在学习Rust,那么恭喜你&#xff0c;这个项目被你捡到了。本项目内容较多&#xff0c;大概会分三期左右陆续发布&a…

2024年第十届中西部外语翻译大赛(1)

2024年第十届中西部外语翻译大赛 竞赛信息 “由中西部翻译协会共同体指导发起&#xff0c;各省市译协共建学术指导委员会&#xff0c;2024年第十届中西部外语翻译大赛由中西部翻译协会共同体秘书处&#xff08;武汉公仪网络科技有限公司&#xff09;承办。” - 获奖证书样图 -…

大模型来了,创业者怎么做出好产品?

大模型的问世惊艳了人们的目光&#xff0c;打开了对AI想象力——生成未来&#xff0c;是谁的未来&#xff1f; “电的发明并不是只能让爱迪生的公司成为全球最大公司&#xff0c;而是为众多电器制造商也提供了巨大的商机。从人类科技史的角度来看&#xff0c;应用层面的价值往…

神经网络复习--循环神经网络

文章目录 RNNLSTM神经网络GAN神经网络 RNN 有些任务人工神经网络&#xff0c;CNN解决不了&#xff0c;自然语言处理中&#xff0c;输入和输出之间不独立&#xff0c;而传统神经网络中&#xff0c;输入和输出都是相互独立的&#xff0c;因此需要一种神经网络让输出和之前的输入…

Java面试题:Spring框架除了IOC和AOP,还有哪些好玩的设计模式?

Spring是一个基于Java的企业级应用程序开发框架&#xff0c;它使用了多种设计模式来实现其各种特性和功能。本文将介绍一些在Spring中使用的常见设计模式以及相应的代码示例和说明。 单例模式 单例模式是Spring中最常用的设计模式之一。在ApplicationContext中&#xff0c;Bean…

GPT-4o、GPT-4国内可用!新UI界面率先体验方法!

测试情况&#xff1a; 现根据测试结果&#xff0c;先对比一下普号4o和付费的区别&#xff1a; 注&#xff1a; plus限制情况&#xff1a;4的次数用完后可以用4o&#xff0c;但4o的80条用完后不能用4&#xff1b; team账户限制是100条/3h&#xff0c;4o和4共享额度 目前发现的…

SDL系列(三)—— SDL2.0 扩展库:SDL_image与SDL_mixer

SDL_image SDL 默认支持的&#xff0c;只能打开 BMP 格式的图片 。 然而我们常见的是 Png jpg 格式的图片&#xff0c;于是我们这节完成 SDL 借用 自带的三方库 &#xff0c;来 完成加载渲染 png 等其他图片格式。 SDL_image 简介 使用 SDL_image &#xff0c;您…