MapReduce的编程开发——求平均值

本文是关于使用Hadoop MapReduce进行平均值计算的学习笔记,详细介绍了环境配置,包括Linux Ubuntu 16.04上的Hadoop 3.0.0启动,Eclipse的Hadoop集成设置。通过编写Score.java程序,实现了读取数据文件,计算并输出平均值的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

本文主要是学习MapReduce的学习笔记,对所学内容进行记录。
实验环境:
1.Linux Ubuntu 16.04

2.hadoop3.0.0

3.eclipse4.5.1


一、启动Hadoop

  1. 进入Hadoop启动目录cd /apps/hadoop/sbin
  2. 启动Hadoop./start-all.sh
  3. 输入‘jps’,启动后显示如下信息
    在这里插入图片描述

二、环境搭配

  1. 打开eclipse->Window->Preferences;

  2. 选择Hadoop Map/Reduce,选择Hadoop包根目录,/apps/hadoop,点击Apply,点击OK;

  3. 点击window–>show view–>other–>mapreduce tools–>map/reduce locations,之后页面会出现对应的标签页;
    界面

  4. 点击3中图标1,在Local name输入myhadoop,在DFS Master 框下Port输入8020,点击Finish,出现3中右侧页面;
    在这里插入图片描述

  5. 点击3中

  6. 图标2,选择下图内容,出现第3步图中左侧内容
    在这里插入图片描述
    完成环境配置环境。

三、求平均值

  1. 新建test项目,新建average包,图片步骤可见“排序”;
  2. 新建Score类,即Score.java,编写并保存如下代码:
package average;

import java.io.IOException;
import java.util.Iterator;
import java.util.StringTokenizer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
### 使用MapReduce编程实现平均数 在MapReduce框架下,计算平均值的过程涉及两个主要阶段:`Map` 和 `Reduce`。为了完成这一目标,通常会先通过映射函数处理输入数据集中的每一项记录,将其转换成键值对的形式;之后利用规约函数来聚合这些中间结果,并最终得到所需的统计数据。 #### Map 阶段 对于每一条输入的数据行,map 函数解析该条目并将它转化为一对或多对(key,value),其中key可以是任意标识符(比如"average"),value则是具体的数值加上计数器1表示当前样本的数量。这样做的目的是为了让后续reduce过程能够区分不同类型的统计量以及累积次数信息[^2]。 ```java public class AverageMapper extends Mapper<LongWritable, Text, Text, IntSumPair> { private static final String AVG_KEY = "avg"; @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { int num = Integer.parseInt(value.toString()); context.write(new Text(AVG_KEY), new IntSumPair(num, 1)); } } ``` 这里定义了一个名为`IntSumPair`的类用于存储整型数值及其对应的权重或频次: ```java public class IntSumPair implements WritableComparable<IntSumPair> { private int sum; private int count; public IntSumPair() {} public IntSumPair(int sum, int count) { this.sum = sum; this.count = count; } // Getters and setters... @Override public void write(DataOutput out) throws IOException { out.writeInt(sum); out.writeInt(count); } @Override public void readFields(DataInput in) throws IOException { sum = in.readInt(); count = in.readInt(); } @Override public int compareTo(IntSumPair o) { return Double.compare((double)this.sum / this.count, (double)o.getSum() / o.getCount()); } } ``` #### Reduce 阶段 Reducer接收来自mapper发出的所有相同key关联起来的一系列values对象列表作为参数。在这个例子中,所有的value都具有相同的key `"avg"` ,因此reducer只需要遍历这个集合累加各个成员所携带的信息——即总数和个数,最后返回它们之间的比率作为整体均值。 ```java public class AverageReducer extends Reducer<Text, IntSumPair, Text, FloatWritable> { @Override protected void reduce(Text key, Iterable<IntSumPair> values, Context context) throws IOException, InterruptedException { int totalSum = 0; int totalCount = 0; for (IntSumPair val : values) { totalSum += val.getSum(); totalCount += val.getCount(); } float average = ((float)totalSum)/totalCount; context.write(key, new FloatWritable(average)); } } ``` 上述代码展示了如何构建一个简单的基于MapReduce架构的应用程序来进行大规模数据集中平均值得到高效计算。需要注意的是实际应用可能还需要考虑更多细节如异常情况下的健壮性等问题[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值