MapReduce框架通过把计算逻辑转移到数据所在的机器,而不是把数据转移到其能够处理的机器上,从而充利用本地性优势。

  • Combiner函数
    进行键值对的聚合操作时,会产生大量I/O和网络流量I/O,为了压缩map和reduce步骤间需要的网络带宽,程序员可以选择在map一侧进行预聚合,而预聚合通过提供的Combiner函数完成。Combiner函数和reduce函数类似,不同之处在于,前者并不传递给定键的所有值,而是把传递进来的输入值之和作为输出值传递出去。
  • 其他的MapReduce开源实现
    Sphere Starfish Riak等 这些开源项目实现了Google文档描述的特性或者其中的部分特性。
【Hadoop MapReduce 作业的 I/O性能严重依赖HDFS】

map任务包含2个子任务(map和merge),reduce任务只包含1个子任务。shuffle和sort首先发生,由系统完成。每个子任务可以拆分为多个子阶段,如:read-map、spill、mege、copy-map和reduce-write。

  • 影响MapReduce性能的因素
    1.硬件(或资源)因素,如CPU时钟,磁盘I/O,网络带宽和内存大小。
    2.底层存储系统。
    3.输入数据、分拣(shuffle)数据以及输出数据的大小,这与作业的运行时间密切相关。
    4.作业算法(或者程序),如map、reduce、partition、combine和compress。有些算法很难再MapReduce中概念化,或者在MapReduce中效率可能会降低。
  • 其他可能对MapReduce性能构成潜在影响的因素
  1. I/O模式:也就是从存储系统获取数据的方式。从底层存储系统去读数据有2中模式:
    1.1直接I/O:通过硬件控制器把数据直接从本地硬盘中读取到内存中,不需要进程间通信成本。
    1.2流式I/O:通过特定进程间通行手段,如TCP/IP和JDBC,从其他正在运行进程(典型情况是存储系统进程)读取数据。
  2. 输入数据解析:是指从存储系统获取数据时,从原始数据到键值对的转换过程。
  3. 输入数据存储:当MapReduce获取数据并进行下一步处理时,所在的存储系统必须保证高速访问和数据可用性(如HDFS和HBase)。