MR实战:统计总分与平均分
文章目录
- 一、实战概述
- 二、提出任务
- 三、完成任务
- (一)准备数据
- 1、在虚拟机上创建文本文件
- 2、上传文件到HDFS指定目录
- (二)实现步骤
- 1、创建Maven项目
- 2、添加相关依赖
- 3、创建日志属性文件
- 4、创建成绩映射器类
- 5、创建成绩驱动器类
- 6、启动应用,查看结果
- 7、创建成绩归并器类
- 8、修改成绩驱动器类
- 9、启动应用,查看结果
一、实战概述
- 在本次实战中,我们将利用Apache Hadoop的MapReduce框架来计算一个包含五名学生五门科目成绩的数据集的总分和平均分。我们将通过以下步骤实现这一目标:首先,在虚拟机上创建并准备数据,将成绩表以文本文件形式存储并在HDFS上设定输入目录;然后,使用IntelliJ IDEA创建Maven项目,并添加必要的Hadoop和JUnit依赖;接着,我们将实现ScoreMapper和ScoreReducer类,分别负责处理输入数据和计算总分与平均分;在ScoreDriver类中,我们将配置作业并运行MapReduce任务。最后,我们将通过HDFS Shell命令查看结果文件内容。此实战旨在深入理解并掌握MapReduce在处理和分析学生成绩数据中的应用,展现其强大的分布式计算能力。
二、提出任务
- 成绩表,包含六个字段(姓名、语文、数学、英语、物理、化学),有五条记录
姓名 | 语文 | 数学 | 英语 | 物理 | 化学 |
---|---|---|---|---|---|
李小双 | 89 | 78 | 94 | 96 | 87 |
王丽霞 | 94 | 80 | 86 | 78 | 80 |
吴雨涵 | 90 | 67 | 95 | 92 | 60 |
张晓红 | 87 | 76 | 90 | 79 | 59 |
陈燕文 | 97 | 95 | 92 | 88 | 86 |
- 利用MR框架,计算每个同学的总分与平均分
三、完成任务
(一)准备数据
1、在虚拟机上创建文本文件
- 在master虚拟机上创建
score.txt
文件
2、上传文件到HDFS指定目录
-
创建
/calcscore/input
目录,执行命令:hdfs dfs -mkdir -p /calcscore/input
-
将文本文件
score.txt
上传到HDFS的/calcscore/input
目录
(二)实现步骤
- 说明:集成开发环境IntelliJ IDEA版本 -
2022.3
1、创建Maven项目
- Maven项目 -
MRCalcScore
,设置了JDK版本 -1.8
,组标识 -net.huawei.mr
- 单击【Create】按钮,得到初始化项目
2、添加相关依赖
- 在
pom.xml
文件里添加hadoop
和junit
依赖
<dependencies> <!--hadoop客户端--> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.3.4</version> </dependency> <!--单元测试框架--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> </dependency>
</dependencies>
- 刷新项目依赖
3、创建日志属性文件
- 在
resources
目录里创建log4j.properties
文件
log4j.rootLogger=ERROR, stdout, logfile
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=target/calcscore.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
4、创建成绩映射器类
- 创建
net.huawei.mr
包,在包里创建ScoreMapper
类
package net.huawei.mr;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;/*** 功能:成绩映射器* 作者:华卫* 日期:2023年12月29日*/
public class ScoreMapper extends Mapper<LongWritable, Text, Text, IntWritable> {@Overrideprotected void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {// 获取行数据String line = value.toString();// 按空格拆分,得到字段数组String[] fields = line.split(" ");// 获取姓名String name = fields[0];// 遍历各科成绩for (int i = 1; i < fields.length; i++) {// 获取成绩int score = Integer.parseInt(fields[i]);// 将<姓名,成绩>键值对写入中间结果context.write(new Text(name), new IntWritable(score)); }}
}
- 说明:该Java类ScoreMapper继承自Hadoop MapReduce的Mapper,用于处理文本格式学生成绩数据。在map方法中,它首先读取一行输入数据并按空格拆分成字段数组,其中姓名为第一个字段。然后遍历剩余字段(各科成绩),将每门课程的成绩与姓名组合成<姓名, 成绩>键值对,并通过context.write写入到中间结果中。
5、创建成绩驱动器类
- 在
net.huawei.mr
包里创建ScoreDriver
类
package net.huawei.mr;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;import java.net.URI;/*** 功能:成绩驱动器类* 作者:华卫* 日期:2023年12月29日*/
public class ScoreDriver {public static void main(String[] args) throws Exception {// 创建配置对象Configuration conf = new Configuration();// 设置客户端使用数据节点主机名属性conf.set("dfs.client.use.datanode.hostname", "true");// 获取作业实例Job job = Job.getInstance(conf);// 设置作业启动类job.setJarByClass(ScoreDriver.class);// 设置Mapper类job.setMapperClass(ScoreMapper.class);// 设置map任务输出键类型job.setMapOutputKeyClass(Text.class);// 设置map任务输出值类型job.setMapOutputValueClass(IntWritable.class); // 定义uri字符串String uri = "hdfs://master:9000";// 创建输入目录Path inputPath = new Path(uri + "/calcscore/input");// 创建输出目录Path outputPath = new Path(uri + "/calcscore/output");// 获取文件系统FileSystem fs = FileSystem.get(new URI(uri), conf);// 删除输出目录(第二个参数设置是否递归)fs.delete(outputPath, true);// 给作业添加输入目录(允许多个)FileInputFormat.addInputPath(job, inputPath);// 给作业设置输出目录(只能一个)FileOutputFormat.setOutputPath(job, outputPath);// 等待作业完成job.waitForCompletion(true);// 输出统计结果System.out.println("======统计结果======");FileStatus[] fileStatuses = fs.listStatus(outputPath);for (int i = 1; i < fileStatuses.length; i++) {// 输出结果文件路径System.out.println(fileStatuses[i].getPath());// 获取文件系统数据字节输入流FSDataInputStream in = fs.open(fileStatuses[i].getPath());// 将结果文件显示在控制台IOUtils.copyBytes(in, System.out, 4096, false);}}
}
- 说明:该Java类ScoreDriver是Hadoop MapReduce作业的主驱动类,用于启动和监控整个计算流程。首先,它配置作业属性、设置Mapper类、输入输出格式及路径,并从HDFS读取数据。作业完成后,它遍历输出目录下的结果文件,逐个打开并打印至控制台,实现成绩统计任务的执行与结果显示。
6、启动应用,查看结果
- 运行
ScoreDriver
类,会看到两列,一列姓名,一列成绩
7、创建成绩归并器类
- 在
net.huawei.mr
包里创建ScoreReducer
类
package net.huawei.mr;import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;import java.io.IOException;
import java.text.DecimalFormat;/*** 功能:成绩归并器类* 作者:华卫* 日期:2023年12月29日*/
public class ScoreReducer extends Reducer<Text, IntWritable, Text, NullWritable> {@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context)throws IOException, InterruptedException {// 声明科目数、总分和平均分变量int count = 0;int sum = 0;double avg = 0;// 遍历迭代器计算总分for (IntWritable value : values) {count++; // 科目数累加sum = sum + value.get(); // 累加每科成绩}// 计算平均分avg = sum * 1.0 / count;// 创建小数点格式对象(保留一位小数)DecimalFormat df = new DecimalFormat("#.#");// 拼接每个学生总分与平均分成绩信息String scoreInfo = "(" + key + "," + new IntWritable(sum) + "," + df.format(avg) + ")";// 写入键值对<scoreInfo,null>context.write(new Text(scoreInfo), NullWritable.get());}
}
- 说明:该Java类ScoreReducer继承自Hadoop MapReduce的Reducer,用于计算每个学生各科成绩总分与平均分。在reduce方法中,遍历输入的<姓名, 成绩>对,累加科目数和总分,计算平均分,并格式化输出结果(保留一位小数)。最后将拼接好的成绩信息作为键,写入null值的键值对到输出文件。
8、修改成绩驱动器类
- 设置Reducer类及其输出键值类型
9、启动应用,查看结果
-
运行
ScoreDriver
类,看到指定格式的成绩统计
-
利用HDFS Shell命令查看结果文件内容
相关文章:
MR实战:统计总分与平均分
文章目录 一、实战概述二、提出任务三、完成任务(一)准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 (二)实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建成绩映射器类5、创建成绩驱动器类6、启…...
Redux与React环境准备、实现counter(及传参)、异步获取数据
环境说明: 一:说明 在React中使用redux,官方要求安装两个其他插件:Redux Toolkit和react-redux 1. Redux ToolKit(RTK) - 官方推荐编写Redux逻辑的方式,是一套工具的集合集,简化书写方式 (简化…...
网站服务器被入侵,如何排查,该如何预防入侵呢?
在我们日常使用服务器的过程中,当公司的网站服务器被黑客入侵时,导致整个网站以及业务系统瘫痪,将会给企业带来无法估量的损失。作为服务器的维护人员应当在第一时间做好安全响应,对入侵问题做到及时处理,以最快的时间…...
应用在网络摄像机领域中的国产音频ADC芯片
IPC:其实叫“网络摄像机”,是IP Camera的简称。它是在前一代模拟摄像机的基础上,集成了编码模块后的摄像机。它和模拟摄像机的区别,就是在新增的“编码模块”上。模拟摄像机,顾名思义,输出的是模拟视频信号…...
Unity3D 安装和下载指南及汉化
Unity3D是一款强大的游戏开发引擎,为开发者提供了丰富的工具和资源,使得游戏制作变得更加简单和高效。本文将介绍Unity3D的安装和下载步骤,以帮助初学者迅速入门。 步骤一:访问Unity官网 首先,打开浏览器,…...
【SpringCache】SpringCache详解及其使用,Redis控制失效时间
一、使用 在 Spring 中,使用缓存通常涉及以下步骤: 1、添加缓存依赖: 确保项目中添加了缓存相关的依赖。如果使用 Maven,可以在项目的 pom.xml 文件中添加 Spring Cache 的依赖。 <dependency><groupId>org.spring…...
MyBatis的基本使用及常见问题
MyBatis 前言MyBatis简介MyBatis快速上手Mapper代理开发增删改查环境准备配置文件完成增删改查查询添加修改删除 参数传递注解完成增删改查 前言 JavaWeb JavaWeb是用Java技术来解决相关Web互联网领域的技术栈。 MySQL数据库与SQL语言 MySQL:开源的中小型数据库。…...
[RoarCTF2019] TankGame
不多说,用dnspy反编译data文件夹中的Assembly-CSharp文件 使用分析器分析一下可疑的FlagText 发现其在WinGame中被调用,跟进WinGame函数 public static void WinGame(){if (!MapManager.winGame && (MapManager.nDestroyNum 4 || MapManager.n…...
相比于其他流处理技术,Flink的优点在哪?
Apache Flink 是一个开源的流处理框架,用于在高吞吐量和低延迟的情况下进行大规模数据流的处理。Flink 以其在流处理领域的性能而闻名,相比于其他流处理技术,Flink 提供了一些独特的特性和优化,使其在某些情况下更快。以下是 Flin…...
react中使用ref属性获取元素,并判断该元素内是否含有子元素
在react中,可以使用ref属性来获取到一个元素的引用,然后再使用ref.current来访问该元素的DOM节点,使用DOM API来判断这个元素是否含有子元素,要判断一个元素是否含有子元素,可以使用hasChildNodes(),其返回…...
idea 如何快速拉取新分支
方式1 (快捷键:CtrlShift~) 方式2:(快捷键:Alt9)...
【经验分享】日常开发中的故障排查经验分享(一)
目录 简介CPU飙高问题1、使用JVM命令排查CPU飙升100%问题2、使用Arthas的方式定位CPU飙升问题3、Java项目导致CPU飙升的原因有哪些?如何解决? OOM问题(内存溢出)1、如何定位OOM问题?2、OOM问题产生原因 死锁问题的定位…...
关于Unity使用图片字体示例
1.使用TexturePacker打包图集 下载地址 TexturePacker - Create Sprite Sheets for your game! 2.准备好数字图 3. 导入图片 4. 打包图集需要的设置 将重心点设置为左下方 点击回车 > 后点击回 >到精灵列表 选择导出的格式 导出后的内容 >导入unity 导入 >…...
开源大语言模型简记
文章目录 开源大模型LlamaChinese-LLaMA-AlpacaLlama2-ChineseLinlyYaYiChatGLMtransformersGPT-3(未完全开源)BERTT5QwenBELLEMossBaichuan其他...
python高级代码
目录 列表推导式和生成器表达式:使用简洁的语法来生成列表和生成器。 装饰器:用于修改函数行为的函数。 上下文管理器:用于管理资源的对象,可以使用with语句来自动管理资源的分配和释放。 多线程和多进程编程:使用…...
透彻掌握GIT基础使用
网址 https://learngitbranching.js.org/?localezh_CN 清屏 clear重新开始reset...
二、类与对象(三)
17 初始化列表 17.1 初始化列表的引入 之前我们给成员进行初始化时,采用的是下面的这种方式: class Date { public:Date(int year, int month, int day)//构造函数{_year year;_month month;_day day;} private:int _year;int _month;int _day; };…...
CentOS 7 Tomcat服务的安装
前提 安装java https://blog.csdn.net/qq_36940806/article/details/134945175?spm1001.2014.3001.5501 1. 下载 wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.84/bin/apache-tomcat-9.0.84.tar.gzps: 可选择自己需要的版本下载安装https://mir…...
文件夹共享功能的配置 以及Windows server2012防火墙的配置
目录 一. 配置文件夹共享功能 1.1 为什么需要配置文件夹共享功能 1.2 配置文件夹共享 1.3 访问共享文件夹 1.4 配置取消 用户名和密码认证 二. windows server 2012防火墙配置 思维导图 一. 配置文件夹共享功能 1.1 为什么需要配置文件夹共享功能 我们在工作和生活中经…...
前端使用高德api的AMap.Autocomplete无效,使用AMap.Autocomplete报错
今天需要一个坐标拾取器,需要一个输入框输入模糊地址能筛选的功能 查看官方文档,有一个api可以直接满足我们的需求 AMap.Autocomplete 上代码 AMapLoader.load({"key": "你的key", // 申请好的Web端开发者Key,首次调…...
反转链表、链表的中间结点、合并两个有序链表(leetcode 一题多解)
一、反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路一:翻转单链表指针方向 这里解释一下三个指针的作用: n1࿱…...
深度学习中的Dropout
1 Dropout概述 1.1 什么是Dropout 在2012年,Hinton在其论文《Improving neural networks by preventing co-adaptation of feature detectors》中提出Dropout。当一个复杂的前馈神经网络被训练在小的数据集时,容易造成过拟合。为了防止过拟合ÿ…...
MySQL 中的 ibdata1 文件过大如何处理?
ibdata1 是什么文件? ibdata1 是InnoDB的共有表空间,默认情况下会把表空间存放在一个名叫 ibdata1的文件中,日积月累会使该文件越来越大。 ibdata1 文件过大的解决办法 使用独享表空间,将表空间分别单独存放。MySQL开启独享表空…...
Weblogic反序列化远程命令执行(CVE-2019-2725)
漏洞描述: CVE-2019-2725是一个Oracle weblogic反序列化远程命令执行漏洞,这个漏洞依旧是根据weblogic的xmldecoder反序列化漏洞,通过针对Oracle官网历年来的补丁构造payload来绕过。 复现过程: 1.访问ip:port 2.可…...
鸿蒙组件数据传递:ui传递、@prop、@link
鸿蒙组件数据传递方式有很多种,下面详细罗列一下: 注意: 文章内名词解释: 正向:父变子也变 逆向:子变父也变 **第一种:直接传递 - 特点:1、任何数据类型都可以传递 2、不能响应式…...
ubuntu 开机自报IP地址(用于无屏幕小车-远程连接)
目录 1.环境安装2.代码3.打包成可执行文件4.开启开机自启 1.环境安装 sudo apt-get install espeak #先安装这个库 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyttsx32.90 #再安装pyttsx3 pyinstaller pip install -i https://pypi.tuna.tsinghua.edu.cn/si…...
Angular——:host 和::deep
在Angular中,:host和::ng-deep是用于在组件样式中选择和修改宿主元素和子组件的特殊选择器。 :host是一个CSS伪类选择器,用于选择当前组件的宿主元素。它常用于在组件样式中应用样式到组件外部的宿主元素上。例如: :host {background-color:…...
键盘字符(#键)显示错误
当屏幕上显示的键与键盘上按下的键不同时,尤其是 # 键。大多数情况下,此错误是由于 raspbian 和 NOOBS 软件的默认英国键盘配置所致。 解决方案: 要解决此问题,您需要将配置更改为您自己的键盘或语言的配置。这可以通过转到树莓派…...
geemap学习笔记037:分析地理空间数据--坐标格网和渔网
前言 坐标格网(Coordinate Grid)简称“坐标网”,是按一定纵横坐标间距,在地图上划分的格网,坐标网是任何地图上不可缺少的要素之一。下面将详细介绍一下坐标格网和渔网。 1 导入库并显示地图 import ee import geem…...
Bluetooth Mesh 入门学习干货,参考Nordic资料(更新中)
蓝牙网状网络(Bluetooth mesh)概念 概述 蓝牙Mesh Profile | Bluetooth Technology Website规范(Mesh v1.1 后改名Mesh ProtocolMesh Protocol | Bluetooth Technology WebsiteMesh Protocol)是由蓝牙技术联盟(Bluetooth SIG)开…...
濮阳网站优化公司哪家好/长沙网
下面我们来看看两个小demo实现定时任务的执行: 一、 package test2;import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.…...
柳河县建设局网站/最新新闻事件今天疫情
2019独角兽企业重金招聘Python工程师标准>>> 讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服务,将…...
vs如何做网站/磁力搜索器kitty
源码编译安装 一般情况下,如果我们在linux下运行一个软件的话,需要先安装。比如运行PHP软件的话,可以使用apt-get install php命令安装,或者编译安装php的源码,然后运行。现在这里主要讲源码编译安装首先php源码是由c语…...
网站优化网站建设/免费长尾词挖掘工具
1. 安装docker 2. 安装Huginn docker run -it -p 3000:3000 huginn/huginn 3. 访问服务 [http://docker-machine ip:3000] 默认用户名/密码: admin/password 微博更新自动提醒 使用Weibo User Agent , uid要填写正确 , 例子里填为30分钟查询一次.{ “uid”: “602949”,“…...
ftp给网站做备份/如何做线上营销
a.成员函数被重载的特征: (1)相同的范围(在同一个类中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可…...
丽水网站建设报价/百度广告客服电话
目录 HMR是什么 使用场景 配置使用HMR 配置webpack解析webpack打包后的文件内容配置HMRHMR原理 debug服务端源码 服务端简易实现服务端调试阶段 debug客户端源码 客户端简易实现客户端调试阶段问题总结 HMR是什么 HMR即Hot Module Replacement是指当你对代码修改并保存后&…...