上面我们分析气温的那段程序,看起没有问题,用起来也没有问题。
试想一下,如果我们把全球所有气象站的数据拿来分析, 你的程序大约需要多久能计算出结果?或者说能否完成运算?
以前我们会把来自不同气象站的数据在不同时间,或者不同计算机上进行运算,最后把结果拿来,再次执行运算。
有了MapReduce咱就不用这么麻烦了,MapReduce做了这样几件事:
0、分布式并行
1、他把输入和输出分开。Mapper负责读取数据,把需要计算的数据输出给Reducer,
也就是说,我们刚才写的程序addYearAndTemperature和out他们是天然的2个程序。
2、本身就是为分布式而设计的,他会把来自多个输入(map)的结果自动的合并并输出(reduce)
3、总是读取本地数据进行运算(相当于我们让不同的计算机分析来自不同气象站的数据)
不知道我说清楚了没有,如果有不清楚的地方欢迎讨论和拍砖。
下面我们来使用hadoop来编写MapReduce程序,来完成同样的功能,注意Mapper是Reducer的输入哦。
我们先来编写Mapper吧,就是把年份和气温取出的程序。
package org.pcwl.mapper;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;
/**
* <p><b>用于读取气象信息,从气象信息中分解出年份和气温的程序。</b></p>
* <p>
* MapReduce的mapper需要继承Mapper<T1,T2,T3,T4>类
* 重写map(T1,T2,T3,T4)方法
* </p>
* <p>
* T1表示mapper的输入key类型,T2表示mapper输入的value类型,我们可以把他理解为
* <em>hadoop的文件读取其,把数据读进来之后装入到一个java.util.Map<K,V>中,
* 我们从这个java.util.Map<K,V>中读取数据, 这里T1就是这个K的类型.T2就是V的类型</em>
* <i>
* 注意:输入到mapper中的数据是以行为单位的(\n) 你懂的。
* value是当前行,key可以看作是行号
* </i>
* </p>
* <p>
* T3,T4表示mapper的输出类型,也是Reducer的输入类型,我们可以理解为<em>
* mapper程序把需要reducer计算的数据写入一个java.util.Map<K,V>中,
* T3,表示这个K的类型,T4表示这个V的类型。
* </em>
* </p>
* <p>
* <strong>
* 注意:这里类型不能使用java自身的类型,
* 我们使用<i>org.apache.hadoop.io</i>这个包下的类型
* ,他们是为分布式并行而设计的类型
* LongWritable---视为java.lang.Long的替代类型
* Text---视为java.lang.String的替代类型
* IntWritable---视为java.lang.Integer的替代类型
* </strong>
* </p>
* @author project_maker@sina.com;eastzhang.iteye.com
*
*/
public class Temperature extends Mapper<LongWritable, Text, Text, IntWritable> {
/* 已知的错误数据值 */
private static final int MISSING = 9999;
@Override
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
/* 从value取出值,得到String */
String line = value.toString();
/* 从字符串中提出年份信息 */
String year = line.substring(15, 19);
int temperature;
if (line.charAt(87) == '+') { // parseInt doesn't like leading plus signs
temperature = Integer.parseInt(line.substring(88, 92));
} else {
temperature = Integer.parseInt(line.substring(87, 92));
}
if (temperature != MISSING) {
/* 把合法数据送入到reducer */
context.write(new Text(year), new IntWritable(temperature));
}
}
}
到此我的mapper编写完成,记住它相当于 addYearAndTemperature 这个哦。
接下来我们写 Reducer , 它想当于out
package org.pcwl.reducer;
import java.io.IOException;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
/**
* <p>Reducer 程序需要继承<code>org.apache.hadoop.mapreduce.Reducer<T1,T2,T3,T4></code>
* 重写reduce<T1,Iterable<T2>,T3,T4>方法。
* <p>
* <p>
* 这里T1,T2 是 Reducer的输入类型,也是Mapper的输出类型,
* <b>注意map的输出和reduce的输入必须一致哟.<b>
* T3,T4是Reducer的输出类型,也就是写入文件中数据类型。
* 根据你程序要写入文件的结果确定类型吧。
* </p>
* @author project_maker@sina.com;eastzhang.iteye.com
*
*/
public class Temperature
extends Reducer<Text, IntWritable, Text, IntWritable> {
@Override
/**
* <strong>注意这里values是个迭代器</strong>也就是说,Reducer是对一个集合进行处理,
* 这一点在@see http://eastzhang.iteye.com/blog/1775734有体现
*/
public void reduce(Text key, Iterable<IntWritable> values,
Context context)
throws IOException, InterruptedException {
/* 要计算最高气温,我们来个无穷小,作为比较量 */
int maxValue = Integer.MIN_VALUE;
for (IntWritable value : values) {
maxValue = Math.max(maxValue, value.get());
}
/* key 是 年份, 我们把结果写入到文件中 */
context.write(key, new IntWritable(maxValue));
}
}
到此, 我们Reducer程序编写完成。
让MapReduce程序运行, 我们需要些调度器(job)作业。
package org.pcwl.job;
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.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
/**
* 运行MapReduce的程序(job)作业
* @Author project_maker@sina.com; eastzhang@iteye.com
*/
public class Temperature {
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("请输入数据源文件夹<以存在>和目标文件夹<不存在>");
System.exit(-1);
}
Job job = new Job();
job.setJarByClass(Temperature.class);
job.setJobName("计算最高气温");
/* 指定从何出读取数据 */
FileInputFormat.addInputPath(job, new Path(args[0]));
/* 指定结果写入何处,注意文件夹必须不存在 */
FileOutputFormat.setOutputPath(job, new Path(args[1]));
/* 设置Mapper程序 */
job.setMapperClass(org.pcwl.mapper.Temperature.class);
/* 设置Reducer程序 */
job.setReducerClass(org.pcwl.reducer.Temperature.class);
/* 指定输出结果类型 */
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}
到此我们这个MapReduce就搞定了, 打jar包运行它
下一篇我们将要研究一下Combiner
- 大小: 48.2 KB
- 大小: 39.6 KB
- 大小: 62.9 KB
- 大小: 64 KB
分享到:
相关推荐
理解MapReduce的工作原理对于开发和优化大数据处理应用至关重要,这也是Hadoop生态系统中的核心技能之一。通过持续学习和实践,开发者可以更好地利用MapReduce解决实际问题,驾驭海量数据的挑战。
Hadoop HDFS和MapReduce架构浅析.pdf 更多资源请点击:https://blog.csdn.net/weixin_44155966
### Hadoop+HDFS和MapReduce架构浅析 #### 摘要 本文旨在深入剖析Hadoop中的两大核心组件——HDFS(Hadoop Distributed File System)和MapReduce的工作原理及其实现机制。首先,我们将介绍Hadoop NameNode与...
Hadoop作为一个开源的分布式存储与计算框架,在处理大数据方面表现出色,其核心组件HDFS和MapReduce对于理解和运用Hadoop至关重要。 首先,Hadoop的HDFS(Hadoop Distributed File System)是一种高度容错性的系统...
标题中的“大数据云计算技术 Hadoop应用浅析”指的是对Hadoop这一大数据处理框架在云计算环境下的应用进行简要探讨。Hadoop是Apache软件基金会开发的一个开源项目,它为大规模数据处理提供分布式计算解决方案。 ...
本资料《大数据云计算技术 Hadoop应用浅析》旨在深入探讨Hadoop在大数据处理中的核心价值及其实际应用场景。 Hadoop是Apache软件基金会开发的一个开源框架,主要用于处理和存储海量数据。它基于分布式计算模型,即...
大数据云计算技术 Hadoop应用浅析(共16页).pptx 大数据云计算技术 Hadoop运维杂记(共21页).pptx 大数据云计算技术 暴风集团基于hadoop的数据平台总体架构简介(共18页).ppt 大数据云计算技术 淘宝网Hadoop与...
基于Hadoop的气象云储存与数据处理应用浅析 本文主要介绍了Hadoop架构的构成,并对Hadoop架构的MapReduce实现进行了详细的描述。同时,本文还开发出一个在Hadoop架构的基础上进行气象数值统计的实例,并根据这个...
在大数据处理领域,Apache Hadoop的MapReduce框架是不可或缺的一部分,尤其对于Java开发者而言,学习如何用Java编写MapReduce程序是提升数据处理能力的关键。本文将深入浅出地解析Java MapReduce程序的编写过程,...
5. 大规模数据处理技术:如Apache Hadoop,用于处理和存储海量数据,是“蓝云”中的重要组成部分,其MapReduce编程模型简化了大数据分析。 6. 存储结构:云计算往往依赖于存储区域网络(SAN),提供高速、灵活的...
DBInputFormat是Hadoop自0.19.0版本开始引入的一种特殊输入格式,它允许Hadoop应用程序通过标准的JDBC接口直接与现有数据库系统进行交互。这使得用户能够在MapReduce作业中处理结构化数据,而这些数据通常存储在关系...
HadoopMap/Reduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。一个Map/Reduce作业(job)通常会把输入的数据集...
DBInputFormat是Hadoop自0.19.0版本开始引入的一种特殊输入格式,它允许Hadoop应用程序通过标准的JDBC接口直接与现有数据库系统进行交互。这为那些需要处理结构化数据(通常存储在关系型数据库中)与非结构化或半...
这篇博客将对 WordCount 的源码进行初步解析,帮助初学者理解 Hadoop MapReduce 的工作原理。 首先,我们要明白 WordCount 的基本流程。它分为两个主要阶段:Map 阶段和 Reduce 阶段。Map 阶段的任务是对输入数据...
例如,利用 Spark 技术进行地理空间数据流处理,Spark 提供了更高效的内存计算,相比 Hadoop MapReduce 减少了数据读写磁盘的次数,提升了处理速度。此外,时空数据的可视化也是大数据技术的重要应用,通过GIS(地理...
【HDFS 存储系统浅析】 Hadoop Distributed File System(HDFS)是Apache Hadoop框架的核心组件之一,是一个分布式文件系统,旨在处理和存储大量数据。HDFS的设计目标是提供高容错性和高吞吐量的数据访问,适用于...
而Hadoop和MapReduce则分别是分布式存储和分布式计算的重要技术,它们使得在海量数据上进行挖掘成为可能。 根据所提供的部分内容,可以观察到在参考文献中出现了关于大数据及数据挖掘的重要文章,如Manyika等人撰写...