一、概念
MapReduce是一种分布式并行编程框架
——分布式并行编程:借助一个集群的多台机器,同时并行处理大规模数据。
MapReduce最早由Google提出,Apache做了优化,成为Hadoop的两大组件之一(另一个就是HDFS)
二、特点
相比传统的MPI、OpenCL、CUDA等并行编程框架,MapReduce有许多优点
1. 容错率高
采用非共享式架构——某些节点出问题不会影响其他节点正常运行
2. 横向扩展性好
可以随意增减节点,而且可以使用廉价机器,扩展集群又好又省。
3. 编程难度低
MapReduce屏蔽了整个底层运行的所有细节,包括进程间通信、数据同步、负载均衡、失败恢复等等。框架会自动分布式部署到集群上的各个机器上,极大降低了编程难度。
4. 适合数据密集型应用
适用于非实时的批处理,以及数据密集型应用(传统的适用于计算密集型应用)。
三、策略和理念
1. 处理策略
MapReduce采用“分而治之”的数据处理策略:
(1) 把非常庞大的数据集切分成多个独立的分片(split)
(2) 然后为每一个分片单独启动一个map任务
(3) 最终并行地在多个机器上同时并行处理这些map任务
2. 设计理念
传统的数据分析常常是“数据向计算靠拢”:做数据分析时,选择一个计算节点,把分析程序放到计算节点上运行,然后把所涉及的数据从各个存储节点传输到计算节点上去。这种方式不适合海量数据,甚是会导致计算崩溃。
MapReduce相反,秉承“计算向数据靠拢”的核心理念。系统会把计算任务分散到各个节点,每个数据处理任务建立在离目标数据尽可能近的节点上,甚至就在同一台机器上。这样做最明显的好处就是大大减少了数据传输的开销,提高了分布式处理的性能。
四、架构
MapReduce采用Master/Slave架构。
一个完整架构有唯一的Master服务器,在上面运行作业跟踪器JobTracker,负责所有任务的调度处理以及失败恢复。另外还有若干台Slave服务器,在上面运行TaskTracker,负责接收JobTracker的指令来具体完成任务的处理。
五、两大函数
MapReduce函数把复杂的计算过程抽象为两个函数,即Map函数和Reduce函数
1. Map函数
输入是键值对<k1, v1>,如
<90020, "a a b a b c">
行号90020是键,文本"a a b a b c"是值。
输出是键值对列表list(k2, v2),比如我们定义Map函数是记录上面的输入做每个字母出现次数,则输出为
<"a", 3>
<"b", 2>
<"c", 1>
具体要Map出什么输出可以用户自定义。
2. Reduce函数
输入是键-值列表对<k3, list(v3)>,比如文本出现几次次a就写几个1
<"a", <1,1,1>>
输出为键值对<k4, v4>,如定义Reduce是统计a出现的次数,则对上述输入处理的结果是
<"a", 3>
同样,Reduce函数的具体算法也是用户自定义的。