总括
Hadoop的框架最核心的设计就是:HDFS和MapReduce。HDFS为海量的数据提供了存储,MapReduce则为海量的数据提供了计算。

HDFS是Google File System(GFS)的开源实现,MapReduce是Google MapReduce的开源实现。

HDFS和MapReduce实现是完全分离的,并不是没有HDFS就不能MapReduce运算。

1、MapReduce整体流程

最简单的MapReduce应用程序至少包含 3 个部分:一个 Map 函数、一个 Reduce 函数和一个 main 函数。在运行一个mapreduce计算任务时候,任务过程被分为两个阶段:map阶段和reduce阶段,每个阶段都是用键值对(key/value)作为输入(input)和输出(output)。main 函数将作业控制和文件输入/输出结合起来。

并行读取文本中的内容,然后进行MapReduce操作

Map过程:并行读取文本,对读取的单词进行map操作,每个词都以<key,value>形式生成。
我的理解:

一个有三行文本的文件进行MapReduce操作。

读取第一行Hello World Bye World ,分割单词形成Map。

<Hello,1> <World,1> <Bye,1> <World,1>

读取第二行Hello Hadoop Bye Hadoop ,分割单词形成Map。

<Hello,1> <Hadoop,1> <Bye,1> <Hadoop,1>

读取第三行Bye Hadoop Hello Hadoop,分割单词形成Map。

<Bye,1> <Hadoop,1> <Hello,1> <Hadoop,1>

Reduce操作是对map的结果进行排序,合并,最后得出词频。
我的理解:

经过进一步处理(combiner),将形成的Map根据相同的key组合成value数组。

<Bye,1,1,1> <Hadoop,1,1,1,1> <Hello,1,1,1> <World,1,1>

循环执行Reduce(K,V[]),分别统计每个单词出现的次数。

<Bye,3> <Hadoop,4> <Hello,3> <World,2>

2、WordCount代码对应图


3、WordCount源码

package org.apache.hadoop.examples;import java.io.IOException;
import java.util.StringTokenizer;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.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
/*** * 描述:WordCount explains by York* @author Hadoop Dev Group*/
public class WordCount {/*** 建立Mapper类TokenizerMapper继承自泛型类Mapper* Mapper类:实现了Map功能基类* Mapper接口:* WritableComparable接口:实现WritableComparable的类可以相互比较。所有被用作key的类应该实现此接口。* Reporter 则可用于报告整个应用的运行进度,本例中未使用。 * */public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{/*** IntWritable, Text 均是 Hadoop 中实现的用于封装 Java 数据类型的类,这些类实现了WritableComparable接口,* 都能够被串行化从而便于在分布式环境中进行数据交换,你可以将它们分别视为int,String 的替代品。* 声明one常量和word用于存放单词的变量* //实现单词统计//最为关键的Map部分与Reduce部分,需要用户自己来写/*** 本操作主要是进行map的数据处理* 在Mapper的父类里面接收的内容如下:* Object:输入数据的具体内容;* Text:每行的文本数据;* Text:每个单词分解后的统计结果;* IntWritable:输出Map记录的结果;*/private final static IntWritable one =new IntWritable(1);private Text word =new Text();/*** Mapper中的map方法:* void map(K1 key, V1 value, Context context)* 映射一个单个的输入k/v对到一个中间的k/v对* 输出对不需要和输入对是相同的类型,输入对可以映射到0个或多个输出对。* Context:收集Mapper输出的<k,v>对。* Context的write(k, v)方法:增加一个(k,v)对到context* 程序员主要编写Map和Reduce函数.这个Map函数使用StringTokenizer函数对字符串进行分隔,通过write方法把单词存入word中* write方法存入(单词,1)这样的二元组到context中*/  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);}}}public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result =new IntWritable();/*** Reducer类中的reduce方法:* void reduce(Text key, Iterable<IntWritable> values, Context context)* 中k/v来自于map函数中的context,可能经过了进一步处理(combiner),同样通过context输出    * * 本操作主要是进行reduce的数据处理* 进行合并后数据的最终统计* Reduce类要使用的数据类型如下:* Text:Map输出的文本内容;* IntWritable:Map处理得到的个数* Text:Reduce输出文本* IntWritable:Reduce的输出个数*/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);}}public staticvoid main(String[] args) throws Exception {/*** Configuration:map/reduce的j配置类,向hadoop框架描述map-reduce执行的工作*/Configuration conf =new Configuration();String[] otherArgs =new GenericOptionsParser(conf, args).getRemainingArgs();if (otherArgs.length !=2) {System.err.println("Usage: wordcount <in> <out>");System.exit(2);}Job job =new Job(conf, "word count");    //设置一个用户定义的job名称job.setJarByClass(WordCount.class);job.setMapperClass(TokenizerMapper.class);    //为job设置Mapper类job.setCombinerClass(IntSumReducer.class);    //为job设置Combiner类job.setReducerClass(IntSumReducer.class);    //为job设置Reducer类job.setOutputKeyClass(Text.class);        //为job的输出数据设置Key类job.setOutputValueClass(IntWritable.class);    //为job输出设置value类FileInputFormat.addInputPath(job, new Path(otherArgs[0]));    //为job设置输入路径FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));//为job设置输出路径System.exit(job.waitForCompletion(true) ?0 : 1);        //运行job}
}

4,wordcount源码简化版

package com.ynnu;
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;public class WordcountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{Text k = new Text();
IntWritable v = new IntWritable(1);@Override
protected void map(LongWritable key, Text value, Context context)   throws IOException, InterruptedException {// 1 获取一行
String line = value.toString();// 2 切割
String[] words = line.split(" ");// 3 输出
for (String word : words) {k.set(word); context.write(k, v);
}
}
}
package com.ynnu;import java.io.IOException;
import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;public class WordcountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{int sum;
IntWritable v = new IntWritable();@Override
protected void reduce(Text key, Iterable<IntWritable> values,Context context) throws IOException, InterruptedException {// 1 累加求和
sum = 0;
for (IntWritable count : values) { sum += count.get();
}// 2 输出
v.set(sum); context.write(key,v);
}
}
package com.ynnu;import java.io.IOException;
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;public class WordcountDrive{public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {// 1 获取配置信息以及封装任务
Configuration configuration = new Configuration();
Job job = Job.getInstance(configuration);// 2 设置jar加载路径
job.setJarByClass(WordcountDrive.class);// 3 设置map和reduce类
job.setMapperClass(WordcountMapper.class);
job.setReducerClass(WordcountReducer.class);// 4 设置map输出
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);// 5 设置最终输出kv类型
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);// 6 设置输入和输出路径
FileInputFormat.setInputPaths(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));// 7 提交
boolean result = job.waitForCompletion(true);System.exit(result ? 0 : 1);
}
}

5,总结

1,map函数就是输入为<偏移量int型,一行数据string型>把一行以空格划分的单词放在数组,然后从数组取出来放在string类型,并且标记为1,再放到文本类型。
此时对应输出为<一个数据string型,1int型>,对应的就是文本函数括号里的东西。
操作对象为一行,划分标记1。
2,reduce函数输入不是为<一个数据string类型,1>,因为自动对数据做了groupby操作,因此输入为<一个数据string类型,放了一串int类型的数组>,操作为对数组求和,然后放入文本类型,输出为**<一个数据类型,int型>**
操作对象为一个数据,和他对应的int数组求和。
3,job函数:
1)固定的配置信息
2)设置main函数
3)设置map,reduce函数
4)设置map的key输出,value输出
5)设置reduce的key输出,value输出
6)设置输入路径和输出路径

mapreduce实现wordcount 详细解析相关推荐

  1. MapReduce中wordcount详细介绍

    1.MapReduce编程模型 MapReduce采用分而治之的思想,把对大规模数据集的操作,分发给一个主节点管理下的各个分节点共同完成,然后通过整合各个节点的中间结果,得到最终结果.简单来说,Map ...

  2. 大数据入门:WordCount程序解析

    大数据入门:WordCount程序解析 文章目录 大数据入门:WordCount程序解析 一.输入 二.程序解析 三.输出 四.需要注意的地方 为一个顽固的家伙写的,都要考试了还不让我给详细讲一下,我 ...

  3. 初学Hadoop之图解MapReduce与WordCount示例分析

    Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储,MapReduce则为海量的数据提供了计算. HDFS是Google File System(GFS) ...

  4. 第一个MapReduce程序-------WordCount

    本关任务 词频统计是最能体现MapReduce思想的程序,结构简单,上手容易. 词频统计的大致功能是:统计单个或者多个文本文件中每个单词出现的次数,并将每个单词及其出现频率按照<k,v>键 ...

  5. 【Big Data - Hadoop - MapReduce】初学Hadoop之图解MapReduce与WordCount示例分析

    Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储,MapReduce则为海量的数据提供了计算. HDFS是Google File System(GFS) ...

  6. Hadoop之图解MapReduce与WordCount示例分析

    Hadoop的框架最核心的设计就是:HDFS和MapReduce.HDFS为海量的数据提供了存储,MapReduce则为海量的数据提供了计算. HDFS是Google File System(GFS) ...

  7. hexo博客主题kaze 配置详细解析

    hexo博客kaze主题配置详细解析 kaze主题官方文档:https://demo.theme-kaze.top/document/ 本解析建议结合主题官方文档进行配置. #------------ ...

  8. wordCount的解析

    wordCount的解析 MapReduce的过程 (input)<k1, v1>->map-><k2, v2>->combine-><k2, v ...

  9. spark word2vec 源码详细解析

    spark word2vec 源码详细解析 简单介绍spark word2vec skip-gram 层次softmax版本的源码解析 word2vec 的原理 只需要看层次哈弗曼树skip-gram ...

最新文章

  1. python数据分析常用的算法_萌新向Python数据分析及数据挖掘 第三章 机器学习常用算法 第二节 线性回归算法 (上)理解篇...
  2. Altium Designer 规则设置Advance(Query)的使用
  3. Linux下配置Smba服务器
  4. 按下enter键禁止页面刷新
  5. JQuery和php方面的填空题,PHP复习题(问答题)
  6. JavaScript 总结几个提高性能知识点(转)
  7. 题目1417:变形金刚
  8. 1052. Linked List Sorting
  9. Android 蓝牙技术 实现终端间数据传输
  10. 33.错误处理(2)
  11. 如何在C#中读写INI文件
  12. Win11繁体中文字体显示不全如何解决?
  13. 计算机考试关于计算量,2020年税务师考试计算器要求、考试教材变化及题型题量...
  14. 可行性分析报告-学生信息管理系统
  15. Postman测试导出导入Excel教程
  16. 写在2020年的尾巴
  17. 新媒体数据分析:新媒体运营主要做什么?
  18. [转载]删除微软拼音输入法
  19. Vue3折叠面板(Collapse)
  20. 互联网日报 | 中国移动将推超级SIM卡;B站单月活跃用户突破2亿;广汽埃安品牌宣布独立运营...

热门文章

  1. 小学计算机课教案艺术字,小学信息技术课《插入艺术字》说课稿
  2. FaceNet源码解读与使用前篇
  3. Android待机时收到screen on广播
  4. SQL学习收获与心得
  5. RHEL7关闭virbr0
  6. 易语言多线程Api封装线程等待CPU优化
  7. 单点登录之CAS原理和实现(转载)
  8. 适合苹果平板的思维导图软件有哪些
  9. ptrace linux,【ptrace注入】linux下ptrace注入器的实现
  10. 强化学习之Q-learning与Sarsa算法解决悬崖寻路问题