07 | 为什么说MapReduce既是编程模型又是计算框架?
李智慧
该思维导图由 AI 生成,仅供参考
在 Hadoop 问世之前,其实已经有了分布式计算,只是那个时候的分布式计算都是专用的系统,只能专门处理某一类计算,比如进行大规模数据的排序。很显然,这样的系统无法复用到其他的大数据计算场景,每一种应用都需要开发与维护专门的系统。而 Hadoop MapReduce 的出现,使得大数据计算通用编程成为可能。我们只要遵循 MapReduce 编程模型编写业务处理逻辑代码,就可以运行在 Hadoop 分布式集群上,无需关心分布式计算是如何完成的。也就是说,我们只需要关心业务逻辑,不用关心系统调用与运行环境,这和我们目前的主流开发方式是一致的。
请你先回忆一下,在前面专栏第 4 期我们讨论过,大数据计算的核心思路是移动计算比移动数据更划算。既然计算方法跟传统计算方法不一样,移动计算而不是移动数据,那么用传统的编程模型进行大数据计算就会遇到很多困难,因此 Hadoop 大数据计算使用了一种叫作 MapReduce 的编程模型。
其实 MapReduce 编程模型并不是 Hadoop 原创,甚至也不是 Google 原创,但是 Google 和 Hadoop 创造性地将 MapReduce 编程模型用到大数据计算上,立刻产生了神奇的效果,看似复杂的各种各样的机器学习、数据挖掘、SQL 处理等大数据计算变得简单清晰起来。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
MapReduce是一种既简单又强大的编程模型和计算框架,它在Hadoop问世之前,使得大数据计算成为可能。该模型包含Map和Reduce两个过程,适用于几乎所有大数据计算需求。通过示例展示了MapReduce的计算过程,其中map函数提取文本中的单词,而reduce函数对这些值进行汇总。MapReduce计算框架能够调度执行MapReduce程序,使其在分布式的集群中并行运行。此外,文章还提到了对事物的抽象能力和洞察力的重要性。最后,文章提出了一个思考题,要求使用MapReduce实现SQL计算。文章内容涵盖了MapReduce的基本原理和应用,以及对技术能力的思考和讨论。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《从 0 开始学大数据》,新⼈⾸单¥68
《从 0 开始学大数据》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(62)
- 最新
- 精选
- 大数据技术与数仓package com.company.sparkcore import org.apache.log4j.{Level, Logger} import org.apache.spark.{SparkConf, SparkContext} object CountPVByGroup { def main(args: Array[String]): Unit = { val conf = new SparkConf() .setAppName(CountPVByGroup.getClass.getSimpleName) .setMaster("local") Logger.getLogger("org.apache.spark").setLevel(Level.OFF) Logger.getLogger("org.apache.hadoop").setLevel(Level.OFF) val sc = new SparkContext(conf) val lines = sc.textFile("file:///e:/pv_users.txt") //拼接成(1_25,1)的形式 val newKeyValue = lines.map(_.split(",")).map(pvdata => ((pvdata(0)+ "_" + pvdata(1)),1)) //对上述KV进行统计 val pvcount = newKeyValue.reduceByKey(_ + _) //将拼接符号去掉,组合成形如(1,25,1)的形式 val pvid_age_count = pvcount.map(newkv => (newkv._1.split("_")(0),newkv._1.split("_")(1),newkv._2)) //结果输出 // (1,25,1) // (2,25,2) // (1,32,1) pvid_age_count.collect().foreach(println) } }
作者回复: 👍🏻
2018-11-13235 - 朱国伟单机安装伪hadoop集群 见:https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-common/SingleCluster.html 注:在Mac中安装遇到了一些问题 但是google一下就能解决 恕不一一道来 思考题解答步骤 cat pv_users 1,25 2,25 1,32 2,25 # 导入该文件到dfs中 bin/hdfs dfs -put pv_users pv_users # 因为每一行只有pageid, age并且中间没有空格 可以直接利用hadoop自带的wordcount程序 # 读取dfs中的pv_user文件 进行统计 然后将结果输出到pv_users_count中 bin/yarn jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.9.1.jar wordcount pv_users pv_users_count # 读取统计结果 bin/hdfs dfs -cat pv_users_count/part-r-00000 1,25 1 1,32 1 2,25 2
作者回复: 👍🏻
2018-11-1729 - 喜笑延开不能光想,必须动手实践: ## Mapper public class PageMapper extends Mapper<LongWritable,Text,Text,IntWritable> { @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String data = value.toString(); String[] words = data.split("\n"); for (String word : words) { context.write(new Text(word), new IntWritable(1)); } } } ## Reducer public class PageReducer extends Reducer<Text,IntWritable,Text,IntWritable> { @Override protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int total=0; for (IntWritable value : values) { total=total+value.get(); } context.write(key, new IntWritable(total)); } } ## Main public class PageMain { public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { Job job = Job.getInstance(); job.setJarByClass(PageMain.class); job.setMapperClass(PageMapper.class); job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(IntWritable.class); job.setReducerClass(PageReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.setInputPaths(job,new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); job.waitForCompletion(true); } } ## 命令行 hadoop jar page-1.0-SNAPSHOT.jar PageMain /input/page /output5 ps:第一次运行报错了~~(不练不知道) 错误:Initialization of all the collectors failed. Error in last collector was :interface javax.xml.soap. 原因:编写Main的时候,Text的引用import错了,习惯了弹出提示直接确定~应该导入`import org.apache.hadoop.io.Text;`
作者回复: 👍🏻
2018-11-2321 - 有铭我想问一下那个计算过程的示意图里map输入部分,上面的是0,12,下面是0,13,是啥意思?
作者回复: map函数输入的key,表示这行数据在文件中的偏移量,通常忽略掉
2018-11-15317 - 小辉辉java8中的流式框架也用的MapReduce,之前一直没理解用MapReduce的意义何在,今天突然顿悟。 软件中很多思想和设计都是通用的,今天接触一种新东西,明天说不定在其它地方又能碰到,又能加深一遍印象。所以说学得多了,很多时间就可以融会贯通了。
作者回复: 👍🏻
2018-11-1312 - 呆猫文章真的是看的赏心悦目,尤其是那段描述抽象的文字😃
作者回复: 谢谢
2018-11-157 - 老男孩老师关于抽象是洞察事物本质的总结很精辟。关于思考题,我的思路是把pageid+age作为map函数计算key值,value分别是1。然后reduce再根据key对value的集合进行sum。就可以得出sql的结果。
作者回复: 是的
2018-11-135 - 明天更美好对于大数据来说是盲区,如果应用直接往hbase中写可以吗?2.5万的并发。hbase可以满足我们的查询需求吗?还有日志分析
作者回复: 你可能需要一个完整的技术架构方案,而不只是HBASE能不能搞定的问题,建议你看下我写另一本书《大型网站技术架构:核心原理与案例分析》,专栏后面也会对大数据架构有各个角度的探讨,欢迎持续关注
2018-11-134 - 牛油果后面一段话,一看就是好人,好老师。
作者回复: 谢谢,共勉。
2018-11-213 - 曾海飞为什么相同key的合并是形成<key, value集合>而不是直接形成一个<key, value reduce后的结果>呢?后者不是效率更高吗?
作者回复: map任务有很多,所以map任务输出的key全部合并在一起才能reduce,请看下期文章。
2018-11-143
收起评论