MapReduce分为两个部分一个是map,一个是reduce
对应的java类分别是mapper和reducer。
MapReduce的特性是对集群内的数据进行并行计算。
MapReduce的初识,例如黄匡内的是气象数据。经过第二步初始映射key是行号,value就是数据库,在经过第三步带有实际业务的映射输出把有用的数据抽出,key是年份,value是温度。然后经过shuttle(洗牌),按照年份进行进行合并也就是分组加排序的过程,把同样的key的value合并到一起并排序。然后经过reduce按照规则取出响应的数据,然后输出。
:
下面开始实践,首先创建一个mapper类。主要是实现上图第二个方块到第四个方块的转换。
public class MaxTemperatureMapper extends Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
KEYIN, VALUEIN,分别指上图方块二的key类型和value类型。 KEYOUT, VALUEOUT分别指上图方块三的key类型和value类型。
public class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable>
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; import org.apache.hadoop.metrics2.util.Quantile; public class MaxTemperatureMapper extends Mapper<LongWritable, Text, Text, IntWritable> { //温度缺失 private static final int MISSING=9999; @Override protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException { String line = value.toString(); String year = line.substring(15, 19); int airTemperature; if(line.charAt(87)=='+') { airTemperature = Integer.parseInt(line.substring(88,92)); } else { airTemperature = Integer.parseInt(line.substring(87,92)); } String quality=line.substring(92,93); if(airTemperature!=MISSING&&quality.matches("[01459]")) { context.write(new Text(year), new IntWritable(airTemperature)); } } }
在建立一个reducer,主要是实现上图的第四个方块到第五个方块的转换。
import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class MaxTemperatureReducer extends Reducer<Text, IntWritable, Text, IntWritable> { @Override protected void reduce(Text keyIn, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException { int maxValue = Integer.MIN_VALUE; for(IntWritable value:values) { maxValue = Math.max(maxValue, value.get()); } context.write(keyIn, new IntWritable(maxValue)); } }
最后创建一个类执行map和reduce
import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; public class MaxTemperature { public static void main(String[] args) { try { //作业:=map任务+reduce任务 Job job = new Job(); job.setJarByClass(MaxTemperature.class); job.setJobName("Max temperature"); //添加输入路径可以添加多个 //可以输具体文件也可以实文件夹,但不是递归处理,压缩的可以自动处理 FileInputFormat.addInputPath(job, new Path(args[0])); //设置输出数据,只能有一个,但不能提前存在,会自动创建 FileOutputFormat.setOutputPath(job, new Path(args[1])); //设置mapper类 job.setMapperClass(MaxTemperatureMapper.class); //设置reducer类 job.setReducerClass(MaxTemperatureReducer.class); //设置输出的key类型 job.setOutputKeyClass(Text.class); //设置输出的value类型 job.setOutputValueClass(IntWritable.class); //等待作业完成 System.out.println(job.waitForCompletion(true)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
把上面的三个class导出jar包 hadoop-examples.jar,输入的文件是附件的weather.rar。
win
set HADOOP_CLASSPATH=hadoop-examples.jar
linux
export HADOOP_CLASSPATH=hadoop-examples.jar
执行
hadoop com.xxxxx.hadoop.MaxTemperature file:\\\D:\hadoopdemo\weather\19*.gz D:\hadoopdemo\weather\out
报错:
java.lang.ClassCastException: class com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text
是Text的包导错了
不是:import com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider.Text;
而是:import org.apache.hadoop.io.Text;
再次执行前一定要把out文件夹删除
执行结果:
相关推荐
分布式编程环境MapReduce介绍 MapReduce是一个分布式编程环境,主要用于处理大规模数据的处理。它是Hadoop架构的一部分,提供了一个简洁的编程接口,允许用户编写分布式程序来处理大量数据。MapReduce的核心是Map和...
"大数据平台-MapReduce介绍.pdf" 大数据平台中的MapReduce是由Google公司的Jeffrey Dean和Sanjay Ghemawat开发的一个针对大规模群组中的海量数据处理的分布式编程模型。MapReduce实现了两个功能:Map函数应用于集合...
MapReduce是一种分布式计算框架,由Google提出,主要用于处理和生成大规模数据集。Hadoop是Apache开源项目,它实现了MapReduce模型,使得用户可以方便地编写处理海量数据的应用程序。 1. MapReduce编程模型 ...
### Hadoop MapReduce简介 Hadoop MapReduce 是一种软件框架,用于轻松编写应用程序,这些应用程序在大型硬件集群上处理大规模数据集。MapReduce 框架由两部分组成:一个通常在多台计算机上并行运行的 Map 函数,...
hadoop MapReduce介绍 SergeBazhievsky_Introduction_to_Hadoop_MapReduce_v2.pdf 很好的学习hadoop mapreduce计算框架的资料
MapReduce是一种分布式计算模型,由Google提出,主要应用于搜索引擎领域,用于解决大数据处理的问题。它的核心在于将复杂的分布式计算过程简化为两个基本操作:Map和Reduce。用户只需关注实现这两个函数,即可完成...
### Hadoop中的HDFS和MapReduce #### Hadoop核心组件:HDFS与MapReduce **Hadoop** 是一个能够处理海量数据的开源软件框架,它最初由Apache开发,旨在为大规模数据提供分布式处理能力。Hadoop的核心组件包括**HDFS...
MapReduce介绍 MapReduce是一个用于处理大规模数据集的软件架构,最初由Google提出。它提供了一种简单有效的编程模型,允许开发者编写并行处理大规模数据的应用程序。MapReduce的核心概念是将复杂的计算任务分解成...
### MapReduce:大规模数据处理的简化利器 #### 引言:MapReduce的诞生与使命 在MapReduce问世之前,Google的工程师们,包括其发明者Jeffrey Dean和Sanjay Ghemawat,面临着一个共同的挑战:如何高效地处理海量...
MapReduce 介绍 ---------------- MapReduce 是一种编程模型,由 Google 开发,用于处理大规模分布式数据。MapReduce 将数据处理过程分为两个阶段:Map 阶段和 Reduce 阶段。在 Map 阶段,输入数据被分割成小块,...
MapReduce 介绍 MapReduce是一个并行计算框架,将大数据量的任务拆分成小数据量的任务,分布式计算每一部分的数据,在整合每个数据节点的结果,最后汇总结果。对于可以并行计算的数据,这将降低单机的计算任务,...
1. **MapReduce介绍**: MapReduce将大规模数据处理分为两个主要阶段:Map阶段和Reduce阶段。Map阶段负责将输入数据切分成小块并进行局部处理,而Reduce阶段则汇总Map阶段的结果,进行全局计算。这种模式非常适合在...
hadoop的mapreduce的架构和原理介绍的比较详细,ppt格式.
2. MapReduce和Hadoop:介绍了MapReduce的历史及其与Hadoop的关系。Hadoop是一个开源框架,支持分布式存储和计算,MapReduce是Hadoop的核心组件之一。 3. MapReduce案例分析:通过“Hadoop Example: WordCount”...
这个文件可能是 Hadoop 官方文档中关于 WordCount 示例的一个章节,详细介绍了如何编写 Map 和 Reduce 函数,以及如何配置和运行 WordCount 作业。可能包括了 Java 代码示例,讲解如何创建 MapReduce 程序,并将其...
这篇论文详细介绍了MapReduce的概念、工作机制以及在实际中的应用。MapReduce模型通过两个主要函数——Map函数和Reduce函数来处理数据,使得程序员能够自动地并行化程序并执行于大规模集群计算环境中。 在MapReduce...
Hadoop介绍,HDFS和MapReduce工作原理
MapReduce 设计模式知识点总结 MapReduce 设计模式是大数据处理的核心组件,负责将大规模数据处理和分析任务分解为可并行处理的任务。MapReduce 设计模式主要由两个阶段组成:Map 阶段和 Reduce 阶段。 Map 阶段 ...