大数据之认识MapReduce

2021-12-07 17:38:59 浏览数 (1)

认识MapReduce

什么是MapReduce?
  1. MapReduce 既是一个编程模型,又是一个计算框架。
  2. 模型是对事物共性的抽象,编程模型就是对编程的共性的抽象, 最重要的共性就是:程序设计时,代码的抽象方式、组织方式或复用方式。大概是了解了 可以理解为MapReduce 就是一套抽象好的两个函数,一个是Map ,一个是Reduce。我们可以再这两个函数里面填充计算的业务逻辑。
  3. 将MapReduce分为Map和Reduce,Map就是将数据进行切分,Reduce就是将数据进行归类。MapReduce计算框架进行分类聚合,Reduce将分类聚合好的数据进行处理计算。
举个列子 统计海量词汇中重复的单词

我们看下大佬给的计算流程图:

是不是很清楚了,有无数个数据页面,MapReduce框架将这些数据读取为一行一行的(其实这个读取为一行行的,对于一个通用的框架他怎么做能知道是读取为一行一行的呢?看样子也是自定义的),我们定义的Map函数分别放入Hash表中(其实 这块就可以放我们各种的抽象好的算法逻辑,比如树了等等)然后MapReudce框架将这些数据进行聚合起来,reduce对聚合好的数据进行

计算处理reduce输出计算好的数据,也就是<word,count>。

大概是理解了MapReduce,由于还没有真正的使用Mapreduce所以还不能有真正自己的见解。

通过上面的列子我们约就是映射到我们开头所说的,MapReduce 既是一个编程模型,又是一个计算框架。再结合例子:编程模型就是Reduce 和 Map 这两个通用函数。计算框架就是MapReduce的计算框架,我们的原始数据块需要MapReduce框架处理,这块就可以理解为MapReduce是一个框架(这块太抽象了,我在勉为其难的解释)。

Mapreduce的作用

我们只要遵循 MapReduce 编程模型编写业务处理逻辑代码(编写Map和Reduce里面的函数),就可以运行在 Hadoop 分布式集群上,无需关心分布式计算是如何完成的。也就是说,我们只需要关心业务逻辑,不用关心系统调用与运行环境,这和我们目前的主流开发方式是一致的。

其他人对MapReduce的理解
  • 其实,MapReduce中的map在做select/scan,shuffle就是在做groupby,reduce在做aggregation。另外,reduce也用于实现join。
  • MapReduce 既是一个编程模型,又是一个计算框架。也就是说,开发人员必须基于 MapReduce 编程模型进行编程开发,然后将程序通过 MapReduce 计算框架分发到 Hadoop 集群中运行。我们先看一下作为编程模型的 MapReduce。
  • MapReduce 的编程模型,类似于函数式编程,按照这个模型写出的代码运行在hadoop集群,可以实现分布式计算的效果

大佬的思考: 模型是人们对一类事物的概括与抽象,可以帮助我们更好地理解事物的本质,更方便地解决问题。比如,数学公式是我们对物理与数学规律的抽象,地图和沙盘是我们对地理空间的抽象,软件架构图是软件工程师对软件系统的抽象。通过抽象,我们更容易把握事物的内在规律,而不是被纷繁复杂的事物表象所迷惑,更进一步深刻地认识这个世界。通过抽象,伽利略发现力是改变物体运动的原因,而不是使物体运动的原因,为全人类打开了现代科学的大门。这些年,我自己认识了很多优秀的人,他们各有所长、各有特点,但是无一例外都有个共同的特征,就是对事物的洞察力。他们能够穿透事物的层层迷雾,直指问题的核心和要害,不会犹豫和迷茫,轻松出手就搞定了其他人看起来无比艰难的事情。有时候光是看他们做事就能感受到一种美感,让人意醉神迷。这种洞察力就是来源于他们对事物的抽象能力,虽然我不知道这种能力缘何而来,但是见识了这种能力以后,我也非常渴望拥有对事物的抽象能力。所以在遇到问题的时候,我就会停下来思考:这个问题为什么会出现,它揭示出来背后的规律是什么,我应该如何做。甚至有时候会把这些优秀的人带入进思考:如果是戴老师、如果是潘大侠,他会如何看待、如何解决这个问题。通过这种不断地训练,虽然和那些最优秀的人相比还是有巨大的差距,但是仍然能够感受到自己的进步,这些小小的进步也会让自己产生大大的快乐,一种不荒废光阴、没有虚度此生的感觉。我希望你也能够不断训练自己,遇到问题的时候,停下来思考一下:这些现象背后的规律是什么。有时候并不需要多么艰深的思考,仅仅就是停一下,就会让你察觉到以前不曾注意到的一些情况,进而发现事物的深层规律。这就是洞察力。

我的思考: 能把一个复杂东西,进行抽象整理为一个通用的方法,函数或者显示的一个工具,其原因本质是首先你对这个事物是真的熟悉。能对其进行分层和归类(可以联想我们对业务逻辑的分层,包括DDD思想中的领域模型的创建,也就是一种抽象),我个人认为一切事物都有相同之处,这个相同之处也许在一个事物的最底层。也就想像我们java中的Object 在java中Object 就是一切事物的抽像。(瞎扯:其实我一直都想给Object对象中加一个函数叫verify()自我检验,虽然说只有有思想的事物才能自我校验,但是代码是人写的,我们赋予给他思想,可以让他自己校验,还有一方面是 我们终会有很多的校验逻辑,很烦,其实真确来说是再DTO有一个base inteface 又一个verify方法所有DTOresult 实现它都得拿到他的第一件事就是verify)。所以个人认为,提高抽象能力,也就是不断去了解和熟悉,提高对事物的认知,然后总结和思考其中的相似之处。最后在某个层面进行抽象。总而言之,一切的来源都是思考,深度思考。

0 人点赞