MapReduce:Hadoop生态的一种简单编程模型
看完本文后,不妨回头看看这些目标都做到了吗?
- 理解MapReduce如何简化并行程序的创建
- 理解 WordCount应用程序如何使用MapReduce编程模型
- 了解MapReduce编程模型之有所能有所不能
并行编程通常需要线程、锁、信号量等复杂的专业知识,而MapReduce中只有Map和Reduce。MapReduce基于函数式编程的思想,类似于f(x)=y。Map是将一个操作应用于所有的元素,其中元素相当于x,操作结果相当于y。Reduce是对元素被操作后的结果进行一个汇总,被操作的结果相当于x,汇总结果相当于y。
下面结合WordCount例程理解Map和Reduce的过程。
WordCount相当于普通编程中的HelloWorld,但它具有代表性,大量应用程序过程都和WrodCount类似。
Step 0:文件存于HDFS
Step 1:在每个节点执行Map操作,Map操作会生成键值对,如左图中A节点中的文件中的一行为“My apple is red and my rose is blue...”,经过WordCount的map操作,生成了如右图中的键值对。
Step 2:排序和洗牌
按相同的键进行分组,移动到相同的节点。如下图,根据You、apple等将键值对排序,Node B中的word1被移动到了Node A。
Step 3:在每个节点上执行Reduce操作
在WordCount例程中,Redcue操作就是把键(key)相同的值(value)加起来。如下图,键为apple的值被加起来,apple被合并了。
再举个搜索引擎的例子:
假设左图设Step2的结果,右图是Step3的结果,搜索“apple”出来的网址就是右图的“value”。
上文中的三步Step1是争对输入数据的并行化,Step2是争对数据排序和中间数据的并行化,Step3是争对数据分组的并行化。
MapReduce的缺陷
不适用于数据频繁变化的任务
由于MapRedcue任务的进行通常是比较缓慢的,如果数据频繁变化,在MapReduce任务执行期间变化了,那将导致错误或不可预料的结果。
不适用于子任务间有依赖的任务
Map过程是若干个节点同时进行的,如果任务之间存在依赖关系,则这一条原则将被打破。
不适用于含有人机交互的分析任务
理解了MapRedcue过程会发现,给MapReduce任务一个输入,它会返回一个相应的输出,这是一个原子操作,不允许中断,更不允许有人机交互。
如果想实际跑一跑WordCount的程序,可以参考下文:https://jingyan.baidu.com/article/ce09321b7a2e052bff858fd9.html