MR实战:统计总分与平均分

news2024/11/16 17:39:16

文章目录

  • 一、实战概述
  • 二、提出任务
  • 三、完成任务
    • (一)准备数据
      • 1、在虚拟机上创建文本文件
      • 2、上传文件到HDFS指定目录
    • (二)实现步骤
      • 1、创建Maven项目
      • 2、添加相关依赖
      • 3、创建日志属性文件
      • 4、创建成绩映射器类
      • 5、创建成绩驱动器类
      • 6、启动成绩驱动器类,查看结果
      • 7、创建成绩归并器类
      • 8、修改成绩驱动器类
      • 9、启动成绩驱动器列,查看结果

一、实战概述

  • 任务:使用MapReduce框架计算学生总分与平均分

  • 今天,我将向你们展示如何使用Apache Hadoop的MapReduce框架来计算每个学生的总分和平均分。我们有一个包含六个字段(姓名、语文、数学、英语、物理、化学)的成绩表,共有五条记录。

  • 在大数据处理领域,Apache Hadoop的MapReduce框架以其强大的分布式计算能力备受瞩目。本次演示我们将通过实际操作,展示如何利用MapReduce来处理和分析学生成绩数据,计算每个学生的总分与平均分。此过程涵盖了数据准备、Maven项目搭建、Mapper和Reducer实现以及作业运行等多个关键步骤,旨在深入理解并掌握MapReduce的工作原理和应用实践。

  • 以下是我们将要进行的步骤:

  1. 准备数据:

    • 启动Hadoop服务。
    • 在虚拟机上创建一个名为score.txt的文本文件,其中每列之间故意隔两个空格。
    • 在HDFS上创建/calcscore/input目录,并将score.txt文件上传到这个目录。
  2. 实现步骤:

    • 创建一个名为CalcScore的Maven项目,并在pom.xml文件中添加hadoopjunit依赖。
    • resources目录下创建log4j.properties文件,用于日志配置。
    • 创建一个名为ScoreMapper的映射器类,该类负责读取输入文件中的每行数据,然后将姓名和对应的科目成绩作为键值对输出。
    • 创建一个名为ScoreDriver的驱动器类,该类负责设置作业的配置、输入和输出路径,以及调用Mapper和Reducer。
    • 创建一个名为ScoreReducer的归并器类,该类负责接收Mapper输出的键值对,计算每个学生的总分和平均分,并将结果作为新的键值对输出。
  • 接下来,我们将详细讲解每个类的实现细节。

  • ScoreMapper类中,我们重写了map方法。这个方法首先获取输入行的内容,然后按照空格拆分得到字段数组。我们获取姓名,并遍历各科成绩,将每对<姓名, 成绩>写入上下文。

  • ScoreDriver类中,我们首先创建一个配置对象,并设置数据节点主机名属性。然后,我们获取作业实例,设置作业启动类、Mapper类和map任务的输出键值类型。我们定义了输入和输出目录的URI字符串,并创建了相应的Path对象。我们删除输出目录(如果已存在),然后给作业添加输入目录和设置输出目录。最后,我们等待作业完成并输出统计结果。

  • ScoreReducer类中,我们重写了reduce方法。这个方法接收Mapper输出的键值对,计算每个学生的总分和平均分,然后将结果作为新的键值对输出。

  • 最后,我们修改ScoreDriver类,设置Reducer类及其输出键值类型,然后运行ScoreDriver类。我们可以通过HDFS Shell命令查看结果文件内容。

  • 以上就是使用MapReduce框架计算学生总分与平均分的全过程。

二、提出任务

  • 成绩表,包含六个字段(姓名、语文、数学、英语、物理、化学),有五条记录
    在这里插入图片描述
  • 利用MR框架,计算每个同学的总分与平均分
    在这里插入图片描述

三、完成任务

(一)准备数据

  • 启动hadoop服务
    在这里插入图片描述

1、在虚拟机上创建文本文件

  • 创建calcscore目录,在里面创建score.txt文件
    在这里插入图片描述
  • 注意:每列之间故意隔两个空格

2、上传文件到HDFS指定目录

  • 创建/calcscore/input目录,执行命令:hdfs dfs -mkdir -p /calcscore/input
    在这里插入图片描述
  • 将文本文件score.txt,上传到HDFS的/calcscore/input目录
    在这里插入图片描述

(二)实现步骤

1、创建Maven项目

  • Maven项目 - CalcScore
    在这里插入图片描述

  • 单击【Finish】按钮
    在这里插入图片描述

2、添加相关依赖

  • pom.xml文件里添加hadoopjunit依赖
    在这里插入图片描述
<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.hw.mr里创建ScoreMapper
    在这里插入图片描述
package net.hw.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;

/**
 * 功能:成绩映射器类
 * 作者:华卫
 * 日期:2022年12月17日
 */
public class ScoreMapper extends Mapper <LongWritable, Text, Text, IntWritable>{
    @Override
    protected void map(LongWritable key, Text value, Context context) 
            throws IOException, InterruptedException {
        // 获取行内容
        String line = value.toString();
        // 按空格拆分得到字段数组
        String[] fields = line.split(" ");
        // 获取姓名
        String name = fields[0].trim();
        // 遍历各科成绩
        for (int i = 1; i < fields.length; i++) {
            // 获取成绩
            int score = Integer.parseInt(fields[i].trim());
            // 写入<姓名,成绩>键值对
            context.write(new Text(name), new IntWritable(score));
        }
    }
}

5、创建成绩驱动器类

  • net.hw.mr包里创建ScoreDriver
    在这里插入图片描述
package net.hw.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;

/**
 * 功能:成绩驱动器类
 * 作者:华卫
 * 日期:2022年12月17日
 */
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);
        }
    }
}

6、启动成绩驱动器类,查看结果

  • 运行ScoreDriver
    在这里插入图片描述

7、创建成绩归并器类

  • net.hw.mr包里创建ScoreReducer
    在这里插入图片描述
package net.hw.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;

/**
 * 功能:成绩归并器类
 * 作者:华卫
 * 日期:2022年12月17日
 */
public class ScoreReducer extends Reducer<Text, IntWritable, Text, NullWritable> {
    @Override
    protected 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 += value.get(); // 总分累加
        }
        // 计算平均分
        avg = sum * 1.0 / count;
        // 创建小数格式对象
        DecimalFormat df = new DecimalFormat("#.#");
        // 拼接每个学生总分与平均分成绩信息
        String scoreInfo = "(" + key + "," + sum + "," + df.format(avg) + ")";
        // 写入键值对
        context.write(new Text(scoreInfo), NullWritable.get());
    }
}

8、修改成绩驱动器类

  • 设置Reducer类及其输出键值类型
    在这里插入图片描述

9、启动成绩驱动器列,查看结果

  • 运行ScoreDriver
    在这里插入图片描述
  • 利用HDFS Shell命令查看结果文件内容
    在这里插入图片描述

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

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

相关文章

单词搜索 II[困难]

一、题目 给定一个m x n二维字符网格board和一个单词&#xff08;字符串&#xff09;列表words&#xff0c; 返回所有二维网格上的单词。单词必须按照字母顺序&#xff0c;通过 相邻的单元格 内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同…

面试官:并发和并行的区别

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

UDP协议工作原理及实战(二)UDP客户端代码实现

这个是一个测试我们写的函数是否正确。 启动服务&#xff1a;这里边的udpsocket->bind(port)就是对端口号进行连接。

Sectigo和Certum的IP证书区别

IP证书是比较特别的一款数字证书。大多数SSL数字证书都是针对域名站点的数字证书&#xff0c;比如单域名SSL证书、多域名SSL证书和通配符SSL证书&#xff0c;而IP证书针对的是只拥有公网IP地址的站点。签发IP证书的CA认证机构并不多&#xff0c;Sectigo和Certum旗下都有IP证书&…

【网络安全】深入理解web安全攻防策略

前言 互联网时代&#xff0c;数据安全与个人隐私信息等受到极大的威胁和挑战&#xff0c;本文将以几种常见的攻击以及防御方法展开分析。 1. XSS (跨站脚本攻击) 定义&#xff1a;通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击…

前端简单动态圣诞树动画(HTML、js、css)

效果展示&#xff1a; 注释&#xff1a; 整体圣诞树分为3个部分&#xff0c;书的主干、粒子特效、树上的卡片树上的卡片(重点)&#xff1a;每一张卡片上都有一个名字&#xff0c;代表圣诞树的叶子&#xff0c;后面可以根据自己需求更改&#xff0c;比如全部改成喜欢人的名字&am…

最大公约和最小公倍数 C语言xdoj183

问题描述&#xff1a; 输入两个正整数 m 和 n&#xff0c;求其最大公约数和最小公倍数。 输入说明&#xff1a; 输入两个正整数 m 和 n。 输出说明&#xff1a; 输出 m 和 n 的最大公约数和最小公倍数。 输入样例&#xff1a; 8 12 输出样例&#xff1a; 4 24 #include <std…

【自然语言处理】第3部分:识别文本中的个人身份信息

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

linux系统 CentOS Tomcat 部署论坛

jdk安装命令&#xff1a;yum -y install java-1.8.0-openjdk-devel.x86_64 结尾上显示下图为成功 检查jdk环境是否配置成功命令&#xff1a;java -version或javac 显示版本 显示信息 mysql安装&#xff1a; 检查是否存mariadb数据库&#xff1a;rpm -qa | grep mariad 卸载ma…

基于JetCache整合实现一级、二级缓存方案(方案实现)

目录 一、整体方案说明 1.1 需求说明 1.2 整体方案实现组件结构图 二、Caffeine缓存实现 2.1 组件说明 2.2 组件结构图 2.3 组件Maven依赖 2.4 组件功能实现源码 2.4.1 CaffeineCacheManager扩展实现 2.4.2 CaffeineConfiguration配置类实现 2.4.3 涉及其他组件的类 …

Java EE 网络原理之HTTP 响应详解

文章目录 1. 认识"状态码"(status code)2. 通过 form 表单构造 HTTP 请求3. 通过 ajax 构造 HTTP 请求 1. 认识"状态码"(status code) 表示了这次请求对应的响应&#xff0c;是什么样的状态 &#xff08;成功&#xff0c;失败&#xff0c;其他的情况&…

Vue学习之第一、二章——Vue核心与组件化编程

第一章. Vue核心 1.1 Vue简介 1.1.1 官网 英文官网: https://vuejs.org/中文官网: https://cn.vuejs.org/ 1.1.2 Vue特点 遵循 MVVM 模式编码简洁, 体积小, 运行效率高, 适合移动/PC 端开发它本身只关注 UI, 也可以引入其它第三方库开发项目 1.2 初始Vue 这里可以参考&a…

Kali Linux如何启动SSH并在Windows系统远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过[cpolar 内网穿透](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)软件实现ssh 远程连接kali! …

Java 基础学习第一弹

1. equels和的区别 equals方法用于比较对象的内容是否相等&#xff0c;可以根据自定义的逻辑来定义相等的条件&#xff0c;而操作符用于比较对象的引用是否相等&#xff0c;即它们是否指向同一块内存地址。equals方法是一个 实例方法&#xff0c;可以被所有的Java对象调用&…

文章解读与完整程序——《考虑“源-荷-储”协同互动的主动配电网优化调度研究》

摘要&#xff1a;伴随智能电网的建设和清洁能源的开发利用,配电网中的负荷类型呈现多元化发展,分布式电源、可控负荷、储能等资源的增加让单向潮流的传统配电网逐渐向双向潮流的主动配电网结构转变。在能源结构转变的同时,清洁能源自身的随机性和波动性给配电网带来了更大的调峰…

再获认可!棱镜七彩荣获ISC2023数字安全创新能力百强

12月27日&#xff0c;由北京经济和信息化局、通州区政府指导&#xff0c;中关村科技园区通州园管理委员会、ISC 平台主办&#xff0c;北京通州发展集团有限公司、赛迪顾问协办的数字安全技术创新论坛暨ISC 2023数字安全创新能力百强颁奖典礼在北京阳光国际会议中心成功举办&…

YOLOv8可视化:引入多种可视化CAM方法,为科研保驾护航

💡💡💡本文内容:调用pytorch下的CAM可视化库,支持十多种可视化方法,打开“黑盒”,让YOLOv8变得相对可解释性 收录 YOLOv8原创自研 https://blog.csdn.net/m0_63774211/category_12511737.html?spm=1001.2014.3001.5482 💡💡💡全网独家首发创新(原创),适…

实习知识整理10: 渲染默认地址以及实现渲染并选择其他地址

1. 渲染默认地址思路分析 &#xff08;1&#xff09;如果我们需要获取到默认地址可以通过userId从地址表中查找&#xff0c;因为从商品详情页点击购买按钮时&#xff0c;只传递商品的相关信息&#xff0c;所以我们就需要从session中获取用户的信息userId &#xff08;2&#…

INS量测更新

基础知识 1、ZK H X V 2、V ZK -HX 3、K Pk/k-1HT/(HPk/k-1HT R) 主要更新以下两个方程 4、Xk/k Xk/k-1 KV &#xff08;&#xff09; 5、Pk/k Pk/k-1 - KHPk/k-1 (I -KH)Pk/k-1; 剖析4和5两个方程&#xff0c;Xk/k-1,Pk/k-1时间更新已经更新完了&#x…