赞
踩
在大数据处理领域,Hadoop的MapReduce框架扮演着至关重要的角色。它提供了一种有效的方式来处理大规模数据集,实现并行计算和分布式处理。本文将介绍MapReduce的基本概念、工作原理以及如何在Hadoop环境中编写和运行MapReduce作业。
一、 MapReduce概述
1.MapReduce是一种编程模型,用于处理大规模数据集的并行计算。它将任务分解成两个关键阶段:Map阶段和Reduce阶段。在Map阶段,数据被切分成独立的数据块,并由多个Map任务并行处理;在Reduce阶段,Map任务的输出被汇总和整合,最终生成最终结果。
定义:MapReduce是一个分布式运算程序的编程框架,其核心功能是将用户编写的业务逻辑代码和自带的默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。
一个基本完整的MapReduce程序流程,包括:数据分片-数据映射-数据混洗-数据归约-数据输出
二、MapReduce工作流程
三、MapReduce技术特点
易于编程:Hadoop的一个重要设计目标是简化分布式程序设计,用户只需专注于自己的应用程序逻辑实现。
高容错性:Hadoop通过计算迁移或数据迁移等策略提高集群的可用性与容错性。
适合非交互式计算:MapReduce适用于一次性大规模数据处理,不适合需要即时交互的应用场景。
四、MapReduce适用场景
五、MapReduce的工作原理
Map阶段:
Reduce阶段:
Driver阶段:
总的来说,MapReduce采用了分布式计算的思想,通过将作业分解成Map和Reduce阶段进行并行处理,从而有效地处理大规模数据。同时,Driver阶段负责作业的配置、提交和监控,确保整个作业能够顺利执行。
- package com.hadoop.mapreduce.wordcountlinux;
-
- 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 java.io.IOException;
-
- public class WordCountMap extends Mapper<LongWritable, Text, Text, IntWritable> {
- private Text outKey = new Text();
- private IntWritable outValue = new IntWritable(1);
- @Override
- protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context)
- throws IOException, InterruptedException {
- String line = value.toString();
- String[] words = line.split(" ");
- // 遍历单词数组,为每个单词设置outKey,并输出<outKey, outValue>键值对
- for (String word : words) {
- outKey.set(word);
- context.write(outKey, outValue);
- }
- }
- }
Reduce阶段:
- package com.hadoop.mapreduce.wordcountlinux;
-
- import org.apache.hadoop.io.IntWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Reducer;
- import java.io.IOException;
-
- public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {
- private IntWritable outValue = new IntWritable();
-
- @Override
- protected void reduce(Text key, Iterable<IntWritable> values, Reducer<Text, IntWritable, Text, IntWritable>.Context context)
- throws IOException, InterruptedException {
- int sum = 0;
- // 遍历values,将每个value相加得到sum
- for (IntWritable value : values) {
- sum += value.get();
- }
- // 将sum设置为outValue,并输出结果
- outValue.set(sum);
- context.write(key, outValue);
- }
- }
Driver阶段:
- package com.hadoop.mapreduce.wordcountlinux;
-
- 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.lib.input.FileInputFormat;
- import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
- import java.io.IOException;
- public class WordCountDriver {
- public static void main(String[] args) throws IOException,
- InterruptedException, ClassNotFoundException{
- //1.获取jod
- Configuration conf =new Configuration();
- //2.设置路径
- Job job = Job.getInstance(conf);
- job.setJarByClass(WordCountDriver.class);
- //3.关联mapper和reducer
- job.setMapperClass(WordCountMap.class);
- job.setReducerClass(WordCountReducer.class);
- //4.设置map输出的key,value类型
- job.setMapOutputKeyClass(Text.class);
- job.setMapOutputValueClass(IntWritable.class);
- //5.设置最终的key,value类型
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(IntWritable.class);
- //6.设置输入路径和输出路径
- //这里设置为自己的文件路径
- FileInputFormat.setInputPaths(job,new Path("D:\\zHADOOP\\input\\inputword\\CSWJ.txt"));
- //在D:\zHADOOP\output\outputword12 的outputword12会自己生成的,如果存在则会报错
- FileOutputFormat.setOutputPath(job,new Path("D:\\zHADOOP\\output\\outputword12"));
- //7.提交job
- boolean result = job.waitForCompletion(true);
- System.exit(result ? 0 : 1);
- }
- }
示例结果:
六、总结:
Hadoop中的MapReduce是一个功能强大的分布式计算框架,它通过简化的编程接口和高效的容错机制,为用户提供了处理大规模数据集的能力。通过理解MapReduce的工作流程、技术特点和适用场景,可以更好地利用Hadoop进行数据处理和分析。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。