从 0 开始学大数据
李智慧
同程艺龙交通首席架构师,前 Intel 大数据架构师,《大型网站技术架构》作者
71151 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
智慧写给你的寄语 (1讲)
从 0 开始学大数据
15
15
1.0x
00:00/00:00
登录|注册

07 | 为什么说MapReduce既是编程模型又是计算框架?

MapReduce实现
MapReduce版本
单机处理
并行运行
分布式计算
强大性
简单性
Reduce函数
Map函数
洞察力
帮助理解事物本质
抽象与概括
SQL计算
WordCount程序
计算框架
编程模型
思考题
模型
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
立即购买
登录 后留言

全部留言(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-13
    2
    35
  • 朱国伟
    单机安装伪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-17
    29
  • 喜笑延开
    不能光想,必须动手实践: ## 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-23
    21
  • 有铭
    我想问一下那个计算过程的示意图里map输入部分,上面的是0,12,下面是0,13,是啥意思?

    作者回复: map函数输入的key,表示这行数据在文件中的偏移量,通常忽略掉

    2018-11-15
    3
    17
  • 小辉辉
    java8中的流式框架也用的MapReduce,之前一直没理解用MapReduce的意义何在,今天突然顿悟。 软件中很多思想和设计都是通用的,今天接触一种新东西,明天说不定在其它地方又能碰到,又能加深一遍印象。所以说学得多了,很多时间就可以融会贯通了。

    作者回复: 👍🏻

    2018-11-13
    12
  • 呆猫
    文章真的是看的赏心悦目,尤其是那段描述抽象的文字😃

    作者回复: 谢谢

    2018-11-15
    7
  • 老男孩
    老师关于抽象是洞察事物本质的总结很精辟。关于思考题,我的思路是把pageid+age作为map函数计算key值,value分别是1。然后reduce再根据key对value的集合进行sum。就可以得出sql的结果。

    作者回复: 是的

    2018-11-13
    5
  • 明天更美好
    对于大数据来说是盲区,如果应用直接往hbase中写可以吗?2.5万的并发。hbase可以满足我们的查询需求吗?还有日志分析

    作者回复: 你可能需要一个完整的技术架构方案,而不只是HBASE能不能搞定的问题,建议你看下我写另一本书《大型网站技术架构:核心原理与案例分析》,专栏后面也会对大数据架构有各个角度的探讨,欢迎持续关注

    2018-11-13
    4
  • 牛油果
    后面一段话,一看就是好人,好老师。

    作者回复: 谢谢,共勉。

    2018-11-21
    3
  • 曾海飞
    为什么相同key的合并是形成<key, value集合>而不是直接形成一个<key, value reduce后的结果>呢?后者不是效率更高吗?

    作者回复: map任务有很多,所以map任务输出的key全部合并在一起才能reduce,请看下期文章。

    2018-11-14
    3
收起评论
显示
设置
留言
62
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部