MapReduce思想理解

Map和Reduce

MapReduce是一种框架,更是一种思维方式,主要是用在大数据处理方面,当数据量过大的时候,通常需要分布式处理问题,如何分布式?其实就是map reduce解决的问题。分为map和reduce两个部分。
map:其实就是映射和拆分。这个拆分过程,主要有三个方面的拆分:1.数据规模的拆分,这个好理解,大数据嘛,就是数据太多,拆分一下。2.任务的分配,也就是分配到哪个机器最合适。3.这些拆分是可以并行计算的。第三点其实才是重中之重。当然,第三点其实也是理解map reduce最难的地方,怎么保证拆分后能并行计算?
reduce:reduce其实就是计算和汇总结果,这个过程,往往也是需要在多个分布式机器上进行。所以又回到了上面的问题,为什么这个reduce的汇总过程,可以保证并行呢?
所以,总而言之,mapreduce最神奇的地方就是,为什么使用这个框架和思想,就可以将一个现实的问题,转化成可以用分布式来解决的问题?

函数式编程思想

其实啊,说白了,map reduce其实本质上就是一个函数式编程思想的框架,所以说,当遇到一个现实中的实际问题,我们套用map reduce去实现分布式处理的过程,其实就是在无形中使用了函数式编程的思维来看待了这个问题。那问题就来到了,为什么函数式编程思维,就更适用于分布式解决问题呢?
这个问题,可以具体看我的另一篇博客,专门详细介绍了函数式编程思维:函数式编程思维和命令式编程思维对比分析
这里简单解释一下函数式思维为什么适合分布式
首先,我们一般的编程思想,都是图灵机的思想,也就是控制的是解决问题的过程,我们写的代码,会告诉计算机,第一步做什么,第二步做什么。就拿map reduce中最经典的一个问题来举例子:统计词频
不使用MapReduce
此时,如果不套用map reduce,我们一般会怎么写代码?
如果是我,我估计就是,设计一个map,key是单词,value是频率,然后直接遍历原始数据,根据key来依次累加value。
当然,这个思路肯定是没问题的。但是,如果数据量非常大呢?一个机器跑不完,必须好几台机器来跑,那么,刚才的思路,就有了一个最大的难题,划分的时候,必须按照之前遍历的顺序划分吗?因为遍历这件事,其实是在暗中规定了执行顺序的,你作为程序员,可能知道,这个统计词频的问题,没有前后顺序的。但是,计算机她不知道啊,当你代码中写了循环程序的时候,计算机就一定会按照先后顺序来计算。而一旦有了先后顺序,对于分布式来说,就是最大的问题,因为分布式最难处理的就是多台机器的同步问题。而传统的命令式编程,控制的是计算流程,而控制流程,必然会凭空产生同步异步问题,尽管问题本身可能并不需要同步。
使用MapReduce
函数式编程思想,关心的是数据的映射。总结起来就是,map过程和reduce过程。统计词频问题中,第一步,map过程,对原始数据进行拆分,映射成<key,1>。然后,第二步,reduce过程,汇总,汇总成key,n>,而真正的顺序,变成了两个函数的调用顺序,而每个函数本身执行的时候,没有顺序之分,因此,函数的执行就可以很轻松的被多个机器同时运算。

总结

MapReduce为什么适合大数据分布式计算?
因为MapReduce本身体现的就是函数式编程思维。
为什么函数式编程更适合分布式计算?
因为函数式编程关注的是数据映射,而不是解决问题的流程,减少了代码中不必要的流程控制,就巧妙避免了同步异步问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
初识 MapReduce 1 . MapReduce 计算模型介绍 1.1. . 理解 MapReduce 思想 MapReduce 思想在生活中处处可见。或多或少都曾接触过这种思想MapReduce思想核心是“ 分而治之”,适用于大量复杂的任务处理场景(大规模 数据处理场景)。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思 想,而不是自己原创。 Map 负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。 可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。 Reduce 负责“合”,即对 map 阶段的结果进行全局汇总。 这两个阶段合起来正是 MapReduce 思想的体现。 图:MapReduce 思想模型 还有一个比较形象的语言解释 MapReduce: 我们要数图书馆中的所有书。你数1号书架,我数2号书架。这就是“ Map”。 我们人越多,数书就更快。 现在我们到一起,把所有人的统计数加在一起。这就是“ Reduce”。 1.2. . Hadoop MapReduce 设计构思 MapReduce 是一个分布式运算程序的编程框架,核心功能是将用户编写的事 务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在 Hadoop 集群上。 既然是做计算的框架,那么表现形式就是有个输入(input),MapReduce 操 作这个输入(input),通过本身定义好的计算模型,得到一个输出(output)。 对许多开发者来说,自己完完全全实现一个并行计算程序难度太大,而 MapReduce 就是一种简化并行计算的编程模型,降低了开发并行应用的入门门槛。 Hadoop MapReduce 构思体现在如下的三个方面:  如何对付大数据处理:分而治之 对相互间不具有计算依赖关系的大数据,实现并行最自然的办法就是采取分 而治之的策略。并行计算的第一个重要问题是如何划分计算任务或者计算数据以 便对划分的子任务或数据块同时进行计算。不可分拆的计算任务或相互间有依赖 关系的数据无法进行并行计算!  构建抽象模型:Map 和 Reduce MapReduce 借鉴了函数式语言中的思想,用 Map 和 Reduce 两个函数提供了 高层的并行编程抽象模型。 Map: 对一组数据元素进行某种重复式的处理; Reduce: 对 Map 的中间结果进行某种进一步的结果整理。 MapReduce 中定义了如下的 Map 和 Reduce 两个抽象的编程接口,由用户去 编程实现: map: (k1; v1) → [(k2; v2)] reduce: (k2; [v2]) → [(k3; v3)] Map 和 Reduce 为程序员提供了一个清晰的操作接口抽象描述。通过以上两 个编程接口,大家可以看出 MapReduce 处理的数据类型是<key,value>键值对。  统一构架,隐藏系统层细节 如何提供统一的计算框架,如果没有统一封装底层细节,那么程序员则需要 考虑诸如数据存储、划分、分发、结果收集、错误恢复等诸多细节;为此, MapReduce 设计并提供了统一的计算框架,为程序员隐藏了绝大多数系统层面的处理细节。 MapReduce 最大的亮点在于通过抽象模型和计算框架把需要做什么(what need to do)与具体怎么做(how to do)分开了,为程序员提供一个抽象和高层的编 程接口和框架。程序员仅需要关心其应用层的具体计算问题,仅需编写少量的处 理应用本身计算问题的程序代码。如何具体完成这个并行计算任务所相关的诸多 系统层细节被隐藏起来,交给计算框架去处理:从分布代码的执行,到大到数千小 到单个节点集群的自动调度使用。 等。。。。。初级教程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值