Fork me on GitHub
MapReduce的理解

MapReduce的理解

 我不喜欢照搬书上的东西,我觉得那样写个blog没多大意义,不如直接把那本书那一页告诉大家,来得省事。我喜欢将我自己的理解。所以我会说说我对于Hadoop对大量数据进行处理的理解。如果有理解不对欢迎批评指责,不胜感激。

Hadoop为何有如此能耐?

       Hadoop之所以能处理大量数据,是因为他提供了一个让大量机器同时处理问题的一个框架,而且高扩展性,可以随时添加机器进来。我曾经和学长讨论的时候,说过这个就像,单挑和打群架的区别。一群人里面都是一些小喽啰,单个不够厉害,但是一群小喽啰可能就会比一个陈浩南厉害了,即便暂时没浩南哥厉害,那么随着小喽啰不断增加,迟早会比浩南哥厉害的。那么如何让一群性能不是很强劲的电脑结合起来,产生惊人的处理能力了?

什么是MapReduce

       Hadoop的文件系统,对于节点管理,最终还是为了进行运算。所以其中最主要的运算核心还是MapReduce。有些书上会吧Map和Reduce翻译过来讲,我觉得很生硬,不如直接用英文来的好。不翻译过来的前提要明白Map和Reduce的内在含义。Map原意是地图,计算机上多为映射,怎么个映射法?其实就是某个键值对映射到固定的reduce。那reduce又是什么,开始我也不明白,为什么不用compute了?后来算是明白了,其实reduce是对数据集进行精简,然后得出相应结果。所以叫reduce减少的意思,有翻译为归并。

为什么提出Map和Reduce

       当我们手中有大量数据的时候,如何对数据进行处理,比如去重,排序等甚至更加复杂的处理呢?我们又要如何来用多台机器对数据进行处理?

要是我,我肯定会将大量的数据进行分类,同一类的数据集给同一台机器来处理。怎么分?怎么处理呢?这就需要看到底要对数据做那些处理了。

而这种先分类后处理的想法就是MapReduce的过程。其中分类的具体过程在mapreduce结构中称为shuffle,下面讲解mapreduce的过程中会包涵在其中,但不会单独提出来讲。

如果不对数据分类,意味着不能用多台机器对数据进行处理,因为会出现机器处理的数据之间存在某些重要的联系,这些联系决定了这类数据一定要在同一台机器上运行。所以,运算前对数据进行分类是必要的准备。也就是Map的过程,将有联系的数据分到一起,然后交给相应的reduce做处理。Reduce是对数据进行最终目的性的处理。

 MapReduce的细节处理

首先对大量的数据进行简单的分割,如下图所示,每一个split的大小可能是64M也可能是128M其大小是由硬盘传输速度决定的。

 、

图1.HDFS对大量数据进行分块

Map过程

对于每个split交给一个map来处理。过程如下。Map的输入是split里面的一行,key为偏移量,value就是该行的内容。处理的结果放入一个容器中,容器填满了就溢出到硬盘,溢出的过程会对数据进行partition和sort。Sort很容易理解,关键是partition,partition也就是前面说的分类,这一部最终决定该键值对未来会交给哪个reduce。但所有map运行完了,就会有一堆spill。当然在map的过程中reduce的准备阶段以及开始,reduce的准备阶段就是把本reduce对应的partition移动到本地来。但要进行reduce操作一定要等所有map结束,属于本reduce的partition全部移到本地,然后真正进入reduce阶段。

 

图2.Map过程

 

 

Reduce 阶段

首先数据准备,也就是上面说的,将属于本reduce的partition移动到本地来。然后进行排序最后成为reduce 的运算数据。Reduce才是真正对数据进行相应的处理产生最终结果。在map和reduce有一个环节—shuffle。我已经融合在了上面说介绍的步骤里面了。Shuffle指的就是数据通过map进行初步处理后,将同一类的数据分发给同一个reduce。

 图3.map+reduce过程

posted on 2013-09-15 00:01  HackerVirus  阅读(693)  评论(0编辑  收藏  举报