MapReduce(1) —— 关于MapReduce的一些问答

一部编程的发展史就是一部程序员的偷懒史。——一个根本无法反驳的真理

 

MapReduce(下称MR)同样是程序员们用来偷懒的工具。

 

来了一份大数据,我们写了一个程序准备分析它,需要怎么做?老式的处理方法不行,数据量太大时,所需的时间无法忍受,所以,必须并行计算。好比1000块砖,1个人搬需要1小时,10个人同时搬,只需要6分钟。

 

不过进行并行计算,你面临几个细思头大问题:

  1. 如何切分数据
  2. 如何处理部分失败(某一/某些部分计算失败)
  3. 对多路计算的结果进行汇总,产生最终结果

 不过不用担心,世界就是这样的,少部分人发明创造工具,大部分人使用工具。总有聪明人在合适的时候出来解决问题。

 

Google在2004年出了个paper,《MapReduce: Simplifed Data Processing on Large Clusters》,提出来一种针对大数据的并行处理模型、并基于此理论做了一个计算框架。所以,你可以说MR是一种计算模型、也可以叫它一个计算框架。广义的MR甚至还包括一套资源管理(JobTracker、TaskTracker),后面这个我们不讲,因为,过时了,时了,了。

 

Q:框架是什么?

A:就是套路,按套路走,它内部会帮你处理那些让你头大的问题。

 

作为小白系列,我们先来看看MR简单的流程图:

为例方便理解,来一个WorkCount示例(WordCount就好比大数据的HelloWorld,总要来一个)。假设我们有一个文件,包含内容:

Life for nothing, die for something

 

来统计每一个单词出现的次数

Q:Splitting是怎么做的,分成几份?

A:框架决定(通常是文件有多少个数据块,就分成几份,数据块不懂的回去看HDFS系列)。

 

Q:k1,v1是什么?

A:一般来说,k1是行号(在WordCount示例中用不到),v1是文件的某一行。本例只是概念示例,不用纠结。

 

Q:Mapping产生的结果存储在哪里?

A:所在机器的本地文件系统,非HDFS,以避免产生多余的副本(HDFS默认多个副本)。

 

Q:Shuffling是做什么的?

A:负责将Mapping产生的中间结果发给Reducer,哪些数据发个哪个Reducer,有框架决定。

 

Q:Reducer有几个,运行在哪些机器上?

A:框架决定。

 

Q:哪些是需要程序员进行代码实现的?

A:Mapping及Reducing,即图中两个红框部分。

 

好了,这期就先说到这,下期将稍微深入了解一下MR中的Shuffling、Sorting等概念。

 

喜欢本文的朋友们,欢迎长按下图关注订阅号程序员杂书馆,提前获得更多更新内容,以及领取大数据及Java经典资料。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mapreduce实例-WordCount是一个经典的MapReduce程序,用于统计文本中每个单词出现的次数。它的工作原理是将输入的文本划分为多个片段,每个片段由多个键值对组成,其中键是单词,值是1。然后通过Map阶段将每个片段中的单词提取出来,并将每个单词映射为键值对,其中键是单词,值是1。接下来,通过Shuffle和Sort阶段将具有相同单词的键值对聚集在一起。最后,通过Reduce阶段将相同单词的计数值进行累加,得到每个单词的总次数。 以下是一个示例代码片段,展示了WordCount程序的基本结构和关键组件: ```java import java.io.IOException; import java.util.StringTokenizer; 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; public class WordCount { 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); } } } 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); } } public static void main(String[] args) throws Exception { Job job = Job.getInstance(); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值