3.3 实现Map流程(得分8)Mapper类中的局部变量,map函数的描述,补充足够的注释。
3.4 实现Reduce过程(得分9)Reducer类的局部变量,reduce函数的描述,以及足够的补充注释。
4、测试(10分):给出测试数据,运行程序,得到计算结果。
参考答案:
1.1 MapReduce编程模型
MapReduce编程模型是一个分布式计算框架。其核心思想是将大数据集分割成许多小数据块,将这些小数据块发送到多个计算节点进行处理,最后合并结果。 MapReduce编程模型由两个阶段组成:Map阶段和Reduce阶段。在映射阶段,每个计算节点处理其负责的数据块并将它们映射成一组键值对。在Reduce阶段,这些键值对根据它们的键进行合并和聚合。
1.2 MapReduce处理流程
MapReduce处理过程包括以下步骤:
输入分片:将输入数据分割成多个数据块。 Map处理:对每个数据块进行映射,并将结果输出为多个键值对。 Shuffle操作:对map输出的键值对进行合并、排序、分组等操作,合并同一键的值以产生多组键值对。 Reduce操作:对每组键值对进行Reduce操作,产生多个输出键值对。输出:将Reduce输出结果保存到输出文件。 MapReduce最大值处理
2.1 分割过程
这个问题需要将输入数据分成多个数据块。每个数据块包含多个值。由于我们想要的是最大值,所以我们可以将数据块划分为多个相同大小的子数据块,每个子数据块的大小为m。例如,如果您的输入数据为[1, 3, 5, 2, 4, 6, 7, 9, 8, 10]且m=3,则可以将数据块拆分为三个子数据块。 [1,3,5],[2,4,6],[7,9,8,10]。
2.2 地图排序合并过程
在映射阶段,每个计算节点处理其负责的数据块并将它们映射成一组键值对。由于我们需要找到最大值,因此我们可以使用每个数据块的最大值作为键,输入数据块的编号作为值。例如,对于子数据块[1, 3, 5],其最大值为5,数量为0,因此可以输出键值对(5, 0)。
Map阶段的输出结果必须进行合并,以减少Reduce阶段的数据量。在这个问题中,可以将Map输出的键值对按照键进行排序,并对同一个键的值进行合并,生成多组键值对。由于键是数字,因此我需要按升序对键进行排序。
在对键值对进行排序的过程中,您可以使用自定义比较器来指定如何对它们进行排序。对于本题中的键值对,可以通过编写比较器类来指定键的升序。示例代码如下。
公共类MaxValueComparator 扩展WritableComparator {
受保护的MaxValueComparator() {
超级(IntWritable.class,true);
}
@覆盖
公共int 比较(WritableComparable a,WritableComparable b){
IntWritable int1=(IntWritable) a;
IntWritable int2=(IntWritable) b;
返回int1.compareTo(int2)。
}
}
在合并Map阶段的输出结果时,可以通过Combine处理进一步减少数据量。 Combine进程与Reduce进程类似,但它运行在Map节点上,可以对Map节点进行合并操作。在这个问题中,可以使用Reduce过程作为Combine过程来合并相同键的值,并输出一组组合的键值对。
2.3 输出结果排序和约简
Reduce阶段允许您对每组键值对执行Reduce操作以找到最大值。例如,对于键值对集合(5, [0, 2]),可以找到对应的最大值10。对于本题中的Reduce操作,您可以创建一个Reducer类来实现它。示例代码如下。
公共类MaxValueReducer 扩展了ReducerIntWritable,IntWritable,IntWritable,IntWritable {
私有IntWritable 结果=new IntWritable();
@覆盖
公共voidreduce(IntWritable 键,IterableIntWritable 值,上下文)
抛出IOException、InterruptedException {
int max=整数.MIN_VALUE;
for (IntWritable 值: 值) {
max=Math.max(max, value.get());
}
结果集(最大值);
上下文.write(键,结果);
}
}
必须对Reduce阶段的输出结果进行排序,使得最大值排在前面。这个问题允许你以类似于Map阶段的方式对输出结果进行排序。也就是说,使用比较器类来指定键的升序。示例代码如下。
job.setSortComparatorClass(MaxValueComparator.class);
基于Eclipse的MapReduce项目求解最大值
3.1 使用Eclipse访问HDFS
基于Eclipse的MapReduce项目必须使用HDFS作为输入和输出数据源。因此,在编写任何代码之前,您必须确保Hadoop 和HDFS 已安装并在本地环境中运行。在Eclipse中,您可以通过添加Hadoop库来访问HDFS。示例代码如下。
配置conf=新配置();
conf.set(\’fs.defaultFS\’, \’hdfs://localhost:9000\’);
文件系统fs=filesystem.get(conf);
路径inputPath=new Path(\’/input\’);
路径输出路径=new Path(\’/output\’);
if (fs.exists(outputPath)) {
fs.delete(outputPath, true);
}
3.2 实施工作设置
配置MapReduce作业时,必须指定作业的输入、输出、Mapper类、Reducer类等信息。
Job job=Job.getInstance(conf, \’最大\’);
job.setJarByClass(MaxValue.class);
job.setMapperClass(MaxValueMapper.class);
job.setCombinerClass(MaxValueReducer.class);
job.setReducerClass(MaxValueReducer.class);
job.setOutputKeyClass(IntWritable.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(作业, inputPath);
FileOutputFormat.setOutputPath(作业,输出路径);
配置作业时,必须通过Job类的getInstance方法获取作业实例,并指定作业的名称和运行配置。在此问题中,您可以将作业名称指定为“maximum”。使用setJarByClass 方法指定将执行该工作的类,即MaxValue 类。使用setMapperClass、setCombinerClass 和setReducerClass 方法指定Mapper、Combine 和Reducer 类。使用setOutputKeyClass 和setOutputValueClass 方法指定输出键和值类型。最后,使用FileInputFormat 和FileOutputFormat 类的addInputPath 和setOutputPath 方法指定作业的输入和输出路径。
公共类MaxValue {
公共静态无效主(字符串[] args)抛出异常{
配置conf=新配置();
conf.set(\’fs.defaultFS\’, \’hdfs://localhost:9000\’);
文件系统fs=filesystem.get(conf);
路径inputPath=new Path(\’/input\’);
路径输出路径=new Path(\’/output\’);
if (fs.exists(outputPath)) {
fs.delete(outputPath, true);
}
Job job=Job.getInstance(conf, \’最大\’);
job.setJarByClass(MaxValue.class);
job.setMapperClass(MaxValueMapper.class);
job.setCombinerClass(MaxValueReducer.class);
job.setReducerClass(MaxValueReducer.class);
job.setOutputKeyClass(IntWritable.class);
job.setOutputValueClass(IntWritable.class);
FileInputFormat.addInputPath(作业, inputPath);
FileOutputFormat.setOutputPath(作业,输出路径);
布尔成功=job.waitForCompletion(true);
如果(成功){
System.out.println(\’作业成功完成。\’);
}
}
}
在main函数中,我们首先创建一个配置对象,并将默认文件系统设置为本地HDFS。接下来,获取FileSystem 对象并指定输入和输出路径。配置作业后,调用waitForCompletion 方法等待作业运行完成。最后输出作业执行结果。如果作业执行成功,则会输出“作业已成功完成”。
3.3 Map处理的实现
公共类MaxValueMapper 扩展MapperLongWritable, Text, IntWritable, IntWritable {
私有最终IntWritable 1=new IntWritable(1);
私有IntWritable 数字=new IntWritable();
@覆盖
public void map(LongWritable key, text value, context context) 抛出IOException, InterruptedException {
String[] number=value.toString().split(\’,\’);
for (字符串s : 数字) {
number.set(Integer.parseInt(s));
上下文.write(1, 数字);
}
}
}
Mapper 类首先声明两个局部变量。一个IntWritable 类型的变量用作键,另一个IntWritable 类型的数值变量用作值。 map 函数首先将一行输入文本转换为字符串数组,然后迭代该数组。将数组中的每个元素转换为整数并将其分配给数值变量。接下来,调用Context 对象的write 方法写入上下文,使用1 作为键,数字作为值。这样Map函数就输出了每个输入值与固定键1的组合。
在Reducer类中,我们首先还声明一个局部变量来存储输入值的最大值。对于每个键值对,reduce 函数将值转换为整数,并将其与当前最大值进行比较。如果该值大于当前最大值,则将其分配给最大值变量。最后,调用Context对象的write方法将最大值写入上下文。
公共静态类MaxReducer 扩展了ReducerIntWritable,IntWritable,IntWritable,IntWritable {
私有IntWritable 结果=new IntWritable();
公共voidreduce(IntWritable 键,IterableIntWritable 值,上下文)
抛出IOException、InterruptedException {
int max=整数.MIN_VALUE;
for (IntWritable val : 值) {
max=Math.max(max, val.get());
}
结果集(最大值);
上下文.write(键,结果);
}
}
这是完整的代码:
导入java.io.IOException;
导入org.apache.hadoop.conf.Configuration。
导入org.apache.hadoop.fs.Path。
导入org.apache.hadoop.io.LongWritable。
导入org.apache.hadoop.io.Text。
导入org.apache.hadoop.mapreduce.Job。
导入org.apache.hadoop.mapreduce.Mapper。
导入org.apache.hadoop.mapreduce.Reducer。
导入org.apache.hadoop.mapreduce.lib.input.TextInputFormat。
导入org.apache.hadoop.mapreduce.lib.output.TextOutputFormat。
公共类MaxValue {
公共静态类MaxValueMapper 扩展MapperLongWritable, Text, LongWritable, LongWritable {
private LongWritable lineNumber=new LongWritable();
私有LongWritable maxNumber=new LongWritable();
@覆盖
public void map(LongWritable key, text value, context context) 抛出IOException, InterruptedException {
字符串行=value.toString();
String[] number=line.split(\’,\’);
最大值=Long.MIN_VALUE;
for (字符串编号: 编号) {
long currentNumber=Long.parseLong(number.trim());
if (当前数量最大值) {
最大值=当前数量;
}
}
lineNumber.set(key.get());
maxNumber.set(max);
context.write(行数, 最大数);
}
}
公共静态类MaxValueReducer 扩展了ReducerLongWritable,LongWritable,LongWritable,LongWritable {
私有LongWritable maxLineNumber=new LongWritable();
私有LongWritable maxValue=new LongWritable(Long.MIN_VALUE);
@覆盖
公共voidreduce(LongWritable 键,IterableLongWritable 值,上下文)
抛出IOException、InterruptedException {
长localMax=Long.MIN_VALUE;
for (LongWritable 值: 值) {
长currentValue=value.get();
if (currentValue localMax) {
localMax=当前值;
}
}
if (localMax maxValue.get()) {
maxValue.set(localMax);
maxLineNumber.set(key.get());
最后一个字
最近很多朋友都在索要Linux学习资料,我就翻箱倒柜,整理了一些视频、电子书、PPT等优质资源分享给大家。
### 预览数据
为您整理的视频资料:
![](https://img-blog.csdnimg.cn/img_convert/562f77e2e7ed574d141f9e7e8cdb286d.png)
为您整理的电子书资料:
![](https://img-blog.csdnimg.cn/img_convert/7f65a0fb50c38159fa0e8a8777863569.png)
**如果您觉得本文对您有帮助,请点赞、收藏、转发给您的朋友。这将增加你继续创作的动力。 **
最大卡尔);
maxLineNumber.set(key.get());
最后一个字
最近很多朋友都在索要Linux学习资料,我就翻箱倒柜,整理了一些视频、电子书、PPT等优质资源分享给大家。
### 预览数据
为您整理的视频资料:
[外部链接图像正在传输.(img-12KtGlB9-1718915028619)]
为大家整理的电子书资料:
[外部链接图像正在传输.(img-JjGSEnNe-1718915028620)]
**如果您觉得本文对您有帮助,请点赞、收藏、转发给您的朋友。这将增加你继续创作的动力。 **
#关于【李博士的云计算】上面练习2:参考Eclipse Mapreduc访问Hadoop文档并求解n个最大值_假设有一家互联网公司服务于3万家中小企业。配置在每个季度末进行。每月所需的相关内容来源网络仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91322.html