马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
Hadoop的MapReduce详解
一、弁言
MapReduce是一个由Google提出并实现的软件框架,用于大规模数据集(大于1TB)的并行盘算。在Hadoop项目中,MapReduce被用来举行分布式数据处理惩罚。它将任务分为Map阶段和Reduce阶段,Map阶段负责处理惩罚输入数据并产生中央结果,Reduce阶段则对Map阶段的中央结果举行汇总以得到终极结果。
二、MapReduce的核心概念
1、Map阶段
Map阶段是MapReduce框架中的第一个阶段,它的紧张任务是处理惩罚输入数据并天生中央结果。Map函数汲取输入的键值对,并产生一组中央键值对,这些中央结果会被框架主动网络并通报给Reduce阶段。
1.1、Map函数的实现
- public static class TokenizerMapper
- extends Mapper<Object, Text, Text, IntWritable>{
-
- private final static IntWritable one = new IntWritable(1);
- private Text word = new Text();
-
- public void map(Object key, Text value, Context context
- ) throws IOException, InterruptedException {
- StringTokenizer itr = new StringTokenizer(value.toString());
- while (itr.hasMoreTokens()) {
- word.set(itr.nextToken());
- context.write(word, one);
- }
- }
- }
复制代码 在上述代码中,Mapper类继续自org.apache.hadoop.mapreduce.Mapper类,map方法汲取输入的文本行,并将其分割成单词,每个单词作为键,对应的值固定为1。
2、Reduce阶段
Reduce阶段是MapReduce框架中的第二个阶段,它汲取来自Map阶段的中央结果,并举行汇总处理惩罚,终极输出盘算结果。
2.1、Reduce函数的实现
- public static class IntSumReducer
- extends Reducer<Text,IntWritable,Text,IntWritable> {
- private IntWritable result = new IntWritable();
- public void reduce(Text key, Iterable<IntWritable> values,
- Context context
- ) throws IOException, InterruptedException {
- int sum = 0;
- for (IntWritable val : values) {
- sum += val.get();
- }
- result.set(sum);
- context.write(key, result);
- }
- }
复制代码 在上述代码中,Reducer类继续自org.apache.hadoop.mapreduce.Reducer类,reduce方法汲取类似的键和该键对应的全部值的聚集,盘算这些值的总和,并将结果输出。
三、MapReduce的实验流程
MapReduce的实验流程大抵可以分为以下几个步调:
- 输入分片:Hadoop将输入数据切分成多个数据块,并为每个数据块分配一个Map任务。
- Map任务实验:每个Map任务对分配到的数据块举行处理惩罚,并产生中央结果。
- Shuffle和Sort:Map任务产生的中央结果被Shuffle(重新分配)和Sort(排序)。
- Reduce任务实验:Reduce任务对排序后的中央结果举行处理惩罚,并输出终极结果。
- 输出结果:Reduce任务的输出结果被写入到HDFS中。
四、MapReduce的使用实例
Word Count示例
Word Count是MapReduce中的经典应用之一,其紧张任务是统计文本文件中每个单词出现的次数。以下是Word Count的实现步调和代码示例:
1. Mapper类
Mapper类负责读取输入的文本行,并将其分割成单词,然后输出键值对,此中键是单词,值是1。
- public class TokenizerMapper
- extends Mapper<Object, Text, Text, IntWritable>{
-
- private final static IntWritable one = new IntWritable(1);
- private Text word = new Text();
-
- public void map(Object key, Text value, Context context
- ) throws IOException, InterruptedException {
- StringTokenizer itr = new StringTokenizer(value.toString());
- while (itr.hasMoreTokens()) {
- word.set(itr.nextToken());
- context.write(word, one);
- }
- }
- }
复制代码 2. Reducer类
Reducer类汲取类似的键和该键对应的全部值的聚集,盘算这些值的总和,并将结果输出。
- public static class IntSumReducer
- extends Reducer<Text,IntWritable,Text,IntWritable> {
- private IntWritable result = new IntWritable();
- public void reduce(Text key, Iterable<IntWritable> values,
- Context context
- ) throws IOException, InterruptedException {
- int sum = 0;
- for (IntWritable val : values) {
- sum += val.get();
- }
- result.set(sum);
- context.write(key, result);
- }
- }
复制代码 3. 实验Word Count
实验Word Count的下令如下:
- hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.4.jar wordcount input.txt output
复制代码 这里input.txt是输入文件,output是输出目次。实验后,输出目次中会包罗处理惩罚结果,通常包罗_SUCCESS和part-r-00000两个文件,此中part-r-00000包罗了终极的单词计数结果。
五、总结
MapReduce是一种强盛的分布式数据处理惩罚框架,它通过将复杂的数据处理惩罚任务分解为简朴的Map和Reduce操纵,使得对大规模数据集的处理惩罚变得简朴和高效。明白MapReduce的工作原理和核心概念对于大数据处理惩罚范畴的开辟者来说至关紧张。
版权声明:本博客内容为原创,转载请保存原文链接及作者信息。
参考文章:
- Hadoop条记_3
- (超具体)MapReduce工作原理及根本编程
|