参考:

    • Hadoop.The.Definitive.Guide.4th

    网格计算是分布式计算的一种,是一门计算机科学。它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终结果。

    高性能计算(High Performance Computing, HPC)和网格计算(Grid Computing)社区多年来一直在做大规模的数据处理,它们使用的是消息传递接口(Message Passing Interface, MPI)这样的API。
    从广义上讲,高性能计算采用的方法是将作业分配到集群的各个机器上,这些机器访问共享文件系统,由一个存储区域网络(Storage Area Network, SAN)进行管理。这非常适合于以计算密集型为主的作业,但当节点需要访问更大的数据量(数百GB的数据,这是MapReduce开始发光的起点)时,很多计算节点就会因为网络带宽的瓶颈问题而不得不闲下来等数据。

    Hadoop 尝试在计算节点上存储数据 ,因此数据访问速度会因为它是本地数据而比较快。这项“数据本地化”(data locality)特性是hadoop数据处理的核心,并因此而获得良好的性能。意识到网络带宽是数据中心环境里最有价值的资源(到处复制数据会很容易使网络带宽饱和)之后,hadoop 通过显式网络拓扑结构来保留网络带宽。 注意,这种安排不会降低 hadoop 对计算密集型数据进行数据分析的能力。

    计算机网络拓扑结构
    计算机网络拓扑(Computer Network Topology)是指由计算机组成的网络之间设备的分布情况以及连接状态.把它两画在图上就成了拓朴图.一般在图上要标明设备所处的位置,设备的名称类型,以及设备间的连接介质类型.它分为物理拓朴和逻辑拓朴两种。

    MPI 赋予程序员很大的控制权,但需要程序员显式处理数据流机制,包括使用C语言构造底层的功能模块(例如 socket),以及高层的数据分析算法。 而hadoop却是在更高层面上完成任务,即程序员仅从数据模型(如MapReduce 的键-值对)的角度来考虑任务的执行,同时数据流仍然是隐性的。

    在大规模分布式计算环境下,协调各个进程的执行是一个很大的挑战。最困难的是合理处理系统的部分失效问题(在不知道一个远程进程是否挂了的情况下)同时,还需要继续完成整个计算。有了MapReduce 这样的分布式处理框架,程序员不必操心系统失效的问题,因为框架能够检测到失败的任务并重新在正常的机器上执行。正因为采用的是无共享(shared-nothing)框架,MapReduce 才能够呈现出这种特性,这意味着各个任务之间是彼此独立的。(这里稍简单了一些,因为 mapper 的输出是反馈给 reducer的,但这由MapReduce系统控制。这种情况下,相对于返回失败的 map,应该对返回 reduce 给予更多关注,因为它必须确保它可以检索到必要的 map 输出,如果不行,必须重新运行相关的 map 从而生成必要的这些输出。)

    因此,从程序员的角度来看,任务的执行顺序无关紧要。相比之下,MPI程序必须显式管理自己的检查点和恢复机制,虽然赋予程序员的控制权加大了,但编程的难度也增加了。

    MapReduce 限定我们处理 键值对 的类型数据(它们按照指定的方式关联在一起),mapper 和 reducer 彼此间的协作有限,一个接一个地运行(mapper 传输键/值对给 reducer)。
    对此,一个很自然的问题是:你是否能用它做点儿有用或普遍的事情?
    MapReduce 作为一个建立搜索索引产品产品系统,是由Google的工程师开发出来的,因为他们发现自己一遍一遍地解决相同的问题(MapReduce 的灵感来自传统的函数式编程、分布式计算和数据库社区),但它后来被应用于其他行业的很多应用。我们惊喜地看到许多算法的变体在 MapReduce 中得以表示,从图像图形分析,到基于图表的问题,再到机器学习算法(Apache Mahout是一个项目,目的是构建可运行于Hadoop之上的机器学习库)。它当然不能解决所有问题,但它是一个很普遍的数据处理工具。