【李老师云计算】作业二:参照Eclipse Mapreduc访问Hadoop文档,求解n个数的最大值_假定有a互联网公司对3万家中小企业提供服务,所需的配置 每个季度的最后一个月需要

【李老师云计算】作业二:参照Eclipse Mapreduc访问Hadoop文档,求解n个数的最大值_假定有a互联网公司对3万家中小企业提供服务,所需的配置 每个季度的最后一个月需要3.3 Map过程的实现(评分点8)Mapper类的局部变

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

(0)
CSDN的头像CSDN
上一篇 2024年6月21日
下一篇 2024年6月21日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注