当前位置: 首页 > news >正文

基于Hadoop的竞赛网站日志数据分析与可视化(上)

1 绪论

1.1 研究背景

     在互联网技术飞速发展的当下,海量用户访问各类网站产生了规模庞大、结构复杂的网站日志数据。这些日志记录了用户的访问行为、时间、来源等关键信息,蕴含着巨大的商业价值与研究潜力。

       然而,传统的数据处理技术在面对如此大规模数据时,暴露出处理效率低、存储成本高、扩展性差等问题。Hadoop 作为开源分布式计算平台,凭借其高可靠性、高扩展性、低成本等优势,成为处理大数据的重要工具。通过 Hadoop 对网站日志进行分析处理,能够挖掘数据背后的规律,为网站优化、用户行为分析、精准营销等提供有力支持。

1.2 研究意义 

       在互联网技术深度渗透各行业的当下,竞赛类网站作为知识技能竞技与数据挖掘实践的重要平台,其产生的用户行为日志数据呈现爆发式增长态势。以本课程设计所分析的竞赛网站为例,2020年5月至2021年3月期间累计产生约200万条用户访问记录,数据规模达50GB,这类数据不仅记录了用户对竞赛页面的浏览偏好、登录频次等行为特征,更隐含着竞赛参与度、用户粘性等关键业务指标,成为优化竞赛运营策略的核心数据资产。

       本 Hadoop 课设基于网站日志处理任务展开,旨在实现网站访问数据的有效分析与处理。通过统计网站每日访问次数,能够直观了解网站的受欢迎程度和流量变化趋势;对访问次数进行排序,可快速定位访问高峰与低谷,助力其优化网站架构、提升用户体验、制定合理的营销策略。同时,通过完成本次课设,也有助于深入理解和掌握 Hadoop 相关技术原理与应用,提高大数据处理能力。

1.3 数据介绍 

       某竞赛网站每年都会开展数据挖掘的竞赛,深入实施科教兴国、人才强国战略、创新驱动发展战略。在竞赛期间,网站会有大量的用户访问,现从数据库中抽取了网站2020年5月至2021年3月用户登录该网站的行为日志数据,针对该数据进行分析,数字字段及其说明如表1-3所示。

4-1 用户信息表

序号

数据名称

字段名

数据类型

1

序号

Id

int

2

网页ID

Content_id

int

3

用户ID

Userid

int

4

缓存生成ID

Sessionid

object

5

访问时间

Date_time

datetime

6

网址

Page_path

object

3 需求分析

3.1 数据统计与筛选

       每日访问次数统计:从日志数据中提取访问日期与次数,按日期聚合统计每日总访问量。

       访问次数排序:对每日访问次数统计结果按访问次数进行升序/降序排序,便于快速定位流量高峰与低谷日期。

       特定时间范围数据筛选:从全量日志中筛选指定月份的访问数据,序列化筛选结果,便于后续深度分析。

       用户与页面访问统计:按用户 ID 和页面 ID 分别统计访问次数,便于后续观察用户登录频次与页面浏览热度分布。

3.2.2 数据可视化分析

       时间序列趋势可视化:以折线图展示每日访问次数的时间变化趋势,识别流量高峰与低谷周期。支持维度:日期、月份等时间维度的聚合展示。

       分布特征可视化:用柱状图展示热门页面/用户的访问次数排名,直观呈现头部流量集中效应。用箱线图分析访问次数的分布特征,包括中位数、四分位距和异常值,评估流量稳定性。

       周期性模式可视化:按周维度统计访问次数,用柱状图展示每周各天的访问模式,如工作日与周末的差异。按月份维度对比访问量变化,识别季节性流量波动,如竞赛活动前后的访问量激增。

4 基于Hadoop的数据处理

4.1 不同日期访问次数统计

       网站的访问次数分布情况对网站运营商而言是十分重要的指标,网站运营商可以根据实际的访问情况总结用户可能感兴趣的内容从而调整网站的板块和内容设计。

4.1.1 代码设计

①定义输入/输出格式

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

② Mapper模块实现

       Mapper模块中主要实现的部分为map()方法。map()方法的主要任务是读取用户访问日志文件中的数据,输出所有访问日期与初始次数的键值对。访问日期是数据文件中的第5列,因此先定义一个数组,再提取第3个元素的前9个字符,与初始次数1一起构成输出键值对,即<访问日期,1>。

4-1-1-1 次数统计Map模块代码

③ Reducer模块实现

       Reducer模块中主要实现的部分为reduce()方法。Reduce()方法的主要任务是读取Map阶段的输出键值对,即<访问日期,1>,将相同键对应的列表值全部进行累加,最后输出<>键值对形式的结果。

4-1-1-2次数统计Reduce模块代码

④ Driver模块代码

4-1-1-3 次数统计Driver模块代码

4.1.2 输出文件显示

4-1-2 次数统计最终输出文件结果

4.2 按访问次数对日期升序排序  

       虽然实现了网站每日访问次数的统计,并将输出结果保存至HDFS,但是网站每日的访问次数是根据访问日期进行升序排序的,不能直观的看出访问次数大致的分布情况。为了更利于分析,该模块读取刚刚输出目录中的输出结果,按照访问次数进行顺序排序,并将排序结果存储至HDFS。

4.2.1 代码设计

①模块设计

       Mappper模块的处理逻辑相对简单,对于输入的键值对将介于纯位置进行交换即由<访问日期,访问次数>转换为<访问次数,访问日期>。在Mapper输出后,键值对经过Shuffle与Sorter的处理,已根据键自动进行了排序,输出格式依然为<访问次数,访问日期>。

4-2-1-1 次数排序Map模块代码

② Reducer模块设计

       Reducer模块的处理逻辑与Mlapper模块相反,对于输入的建值对,将键与值位置进行交换,即由<访问次数,访问日期>重新转换为<访问日期,访问次数>。

       对于数据输入与输出格式的选择,需要根据其在键值对中的具体位置进行配置,需设置访问日期为对应的Text类,访问次数为对应的IntWritable类。

4-2-1-2 次数排序Reducer模块代码

③ Driver模块设计

       先初始化配置、解析参数,校验输入输出路径完整性。接着创建作业,指定主类、Mapper/Reducer 类,配置 Map 输出和最终输出的键值类型。然后设置输入输出路径,提交作业并根据执行结果退出,实现数据处理流程的配置与执行。

4-2-1-3 次数排序Driver模块代码

4.2.2 输出文件显示

 

4-2-2 次数排序输出结果

4.3 分别筛选四个月用户与日期、页面与日期的日志数据 

       根据上一节的输出结果,本课设决定对2020年11月、2020年12月、2021年1月、2021年2月的数据进行进一步观察,本节进行这四个月数据的筛选,并将筛选后的日志数据序列化为特定格式的文件,存储到 HDFS 中。

4.3.1 代码设计

① Mapper模块设计

       将输入的`value`转换为字符串,并使用逗号分隔符将其拆分成多个字段,存储在数组`arr`中。然后,检查第四个字段(索引为4)是否包含特定的时间信息("2021/1"或"2021/2")。如果满足条件,则将第二个字段(索引为2)作为新的键,第四个字段的前9个字符作为新的值,通过`context.write`方法输出这对新的键值对。

4-3-1-1 日志筛选与序列化Map模块代码

② Driver模块设计

       首先,创建一个`Configuration`对象来存储作业配置信息,并使用`GenericOptionsParser`解析命令行参数,提取出剩余的参数。接下来,检查参数数量是否满足要求,如果不满足则打印错误信息并退出程序。

       然后,创建一个`Job`实例,并设置作业名称为"Select Data"。接着,指定作业的JAR包位置、Mapper类、输出键值对的类型等基本信息。这里特别设置了输入格式为`TextInputFormat`,输出格式为`SequenceFileOutputFormat`,并且将Reduce任务数设置为0,这意味着整个作业只包含Map阶段,没有Reduce阶段。

       最后,根据命令行参数添加输入路径,并设置输出路径。提交作业并等待其完成,根据作业执行结果返回相应的退出码。

4-3-1-2 日志筛选与序列化Driver模块代码

4.3.2 输出文件显示

4-3-3-3 日志筛选与序列化输出结果

4.4 统计四个月的用户登录次数、页面访问次数 

4.4.1 代码设计

① Mapper 类代码

       继承Mapper类,定义自定义枚举LogCounter统计不同月份,在map方法中,从输入的key(会员名)和value(日志时间)解析数据,根据日志时间包含的月份,用context对应枚举计数器自增,再将会员名和日志时间封装到MemberLogTime 对象,结合值为1的IntWritable,通过context.write输出,用于后续Reduce处理,实现对会员日志按月份统计和数据传递 。

4-4-1-1 优化与打包Mapper模块代码

② Reduce类代码

       先依据 MemberLogTime 类型 key 中的日志时间,判断属于 2021 年 1 月还是 2 月,对应更新自定义计数器;接着遍历 value 迭代器,累加数值得到总和;最后将 key(包含会员日志时间信息 )和总和(IntWritable 类型 )通过 context.write 输出,实现对 Map 阶段输出数据的聚合统计,同时用计数器记录不同月份结果数量 。

4-4-1-2 Reducer模块代码

③ Combiner类代码

       继承 Reducer,复用 Reducer 的泛型(输入输出均为 MemberLogTime 作为键、IntWritable 作为值 );在 reduce 方法里,针对相同 MemberLogTime 键对应的多个 IntWritable 值,遍历累加求和,再将键和求和后的结果通过 context.write 输出,作用是在 Map 端本地提前聚合数据,减少 Map 到 Reduce 阶段的数据传输量,提升计算效率 。

4-4-1-3 Combiner模块代码

④ Partitioner类代码

       继承 Partitioner,针对 MemberLogTime 类型的 key 和 IntWritable 类型的 value,提取 key 中的日志时间,判断是否包含 “2021/1”,以此将数据分别映射到不同分区(返回 0 或 1 与分区数取余的结果 ),实现按日志时间(2021 年 1 月及其他 )对数据进行分区,让相同时间特征的数据进入同一 Reduce 任务处理 。

4-4-1-4 Partitioner模块代码

⑤ Driver类代码

       配置相关:通过 getMyConfiguration 方法设置 Hadoop 集群的各类配置,包括文件系统(fs.defaultFS 指向 HDFS 地址 )、资源管理框架(yarn 相关配置 )、跨平台提交等,还指定作业 Jar 包路径。

       作业初始化:在 run 方法中,基于配置创建 Job,设置作业名称,关联 Mapper(LogCountMapper )、Reducer(LogCountReducer )、Combiner(LogCountCombiner )、Partitioner(LogCountPartitioner )类;指定输入输出键值类型,设置输入格式为 SequenceFileAsTextInputFormat 、输出格式为 TextOutputFormat 。

       输入输出路径:添加 HDFS 上的输入路径,删除已有输出路径(避免冲突 ),设置输出路径。

       任务提交:通过 job.waitForCompletion 提交作业并等待执行完成,返回执行结果状态。

       main 方法:设置 Hadoop 用户为 root,定义输入输出路径参数,借助 ToolRunner.run 执行 LogCount 作业 ,实现对 HDFS 上 SequenceFile 数据的 MapReduce 处理流程。 简单说,就是搭建并提交一个完整的 MapReduce 任务,用自定义的处理组件(Mapper、Reducer 等),基于 HDFS 输入数据做计算,输出结果到指定 HDFS 路径 。

4-4-1-5 Driver模块代码

4.4.2 文件输出结果

 

4-4-2-1 202011月和12月各用户访问次数

 

4-4-2-2 20211月和2月各用户访问次数

  

4-3-5-2 202011月和12月各页面访问次数

  

4-3-5-2 20211月和2月各页面访问次数

4.5序列化文件读取

4.5.1代码设计

       先通过`Configuration`配置HDFS(Hadoop分布式文件系统 )的默认文件系统路径,获取`FileSystem`对象来连接HDFS;接着创建`SequenceFile.Reader`用于读取HDFS上指定路径(`/user/root/raceSelect1/part - m - 00000`)的SequenceFile文件;然后定义`Text`类型的键和值,准备接收文件中的键值对数据;

       再创建`BufferedWriter`,将读取的数据以键值对形式(键值间用`\t`分隔,每行以`\r\n`结尾 )写入本地文件`D:\\janfeb.txt`;最后依次关闭写入流和SequenceFile读取器,完成从HDFS SequenceFile文件读取数据并写入本地文本文件的操作 。

4-5-1 序列化文件读取代码

4.5.2 输出结果

4-5-2 序列化文件读取结果

-------------------------------------------------------------------------------------------------

【基于hadoop的竞赛网站日志数据分析与可视化(下)】

将用python对hadoop处理后的数据进行可视化分析,需要数据集和完整代码的私我

http://www.dtcms.com/a/278424.html

相关文章:

  • 基于hadoop的竞赛网站日志数据分析与可视化(下)
  • 神经网络与深度学习Python入门
  • 构建高效事件驱动架构:AWS S3与SQS集成实践指南
  • 实战:如何创建 AWS RDS 数据库
  • 显示器核心三要素详解:刷新率、分辨率、色深
  • 【JAVA】监听windows中鼠标侧面键的按钮按下事件
  • Web 前端面试
  • redis实现红锁
  • (1-7-3)数据库的基本查询
  • 【React Native】Switch、Alert、Dimensions、StatusBar、Image组件
  • 打破数据孤岛!医疗数据如何实现“可用不可见”?
  • OpenVela之开发自测试框架cmocka
  • 深入解析ThreadLocal:线程隔离的奥秘与内存泄漏解决方案
  • HarmonyOS从入门到精通:动画设计与实现之九 - 实用动画案例详解(上)
  • Linux操作系统从入门到实战(八)详细讲解编译器gcc/g++编译步骤与动静态库链接
  • C语言:20250714笔记
  • 更改elementui 图标 css content
  • Docker搭建Redis分片集群
  • kotlin学习笔记
  • Kubernetes Ingress:实现HTTPHTTPS流量管理
  • HarmonyOS应用无响应(AppFreeze)深度解析:从检测原理到问题定位
  • Spring Boot 双数据源配置
  • 基于Python的物联网岗位爬取与可视化系统的设计与实现【海量数据、全网岗位可换】
  • java基础(day07)
  • java基础-1 : 运算符
  • 如何连接 AWS RDS 数据库实例
  • Spark 和 Hadoop MapReduce 的基本概念及区别
  • 2D和3D激光slam的点云去运动畸变
  • autoware激光雷达和相机标定
  • 0-1搭建springboot+vue的教务管理系统(核心源码)