您的位置 首页 知识

mapreduce编程(Hadoop基础-MapReduce编程模型(一)-以wordcount和sort为例)

mapreduce编程
     在<<Hadoop基础-不使用分布式系统怎么做并行计算>>中提到了做并行计算需要解决的几个问题。HDFS为位于不同节点的计算任务提供了统一的存储空间,避免了数据的反复拷贝。而MapReduce编程模型解决的三个问题分别是:任务划分和调度、负载均衡和错误处理。
    在MapReduce编程模型出现之前,还有很多几种主流的编程模型如BSP(
Bulk Synchronous Parallel)和MPI(Message Passing Interface)。这三种编程模型最大的区别是BSP和MPI对程序设计者的技术功底要求有较高的门槛,设计者必须在代码中考虑调度、负载均衡和错误处理的问题。而MapReduce则以完全自动化的方式实现了任务划分和调度、负载均衡和错误处理,程序设计者有更多的精力关注数据处理的业务逻辑。      本文分别以wordcount和sort为例,来讲解MapReduce编程模型的工作流程。一、MapReduce编程模型-wordcount(单词计数)

图1-1 wordcount在MapReduce模型下的工作流程图
图1-1描述了MapReduce编程模型下wordcount的工作流程。了解这个工作流程,需要注意以下几点:
1、MapReduce编程模型有Map和Reduce两个阶段(Stage),但是每个阶段都可以进一步的划分。
2、蓝色方框都是文件或数据块,椭圆型为计算任务,左边浅绿色椭圆为Map任务,右边浅红色椭圆为Reduce任务。图中有3个Map任务和4个Reduce任务。箭头代表数据流动的方向,Shuffling对应的箭头代表数据通过网络传输,其它箭头代表本地数据传输。
3、左边的蓝色方框可以理解为一个文件,这个文件被分成了3个block(block默认64MB)。3个block位于三个不同的计算节点,每个计算节点启动一个Map任务。
4、整个流程的输入数据(最左边蓝色方框),输出结果(最右边的蓝色方框)都保存在HDFS之上。但是,Map任务的输出和Reduce任务的输入(两列椭圆之间的数据)不在HDFS之上,位于任务所在节点的本地磁盘。
5、shuffle的过程就是把三个Map任务的输出重新划分为四份数据,每个Reduce任务一份数据。数据划分好坏的标准是每个Reduce任务尽量处理相等的数据量。假设所有数据都被划分到第一个Reduce任务,其它三个Reduce任务不处理任何数据,这样在Reduce阶段就不存在并行计算。

二、MapReduce编程模型-sort(排序)

图1-2 sort在MapReduce模型下的工作流程图
图1-2 描述了MapReduce编程模型下sort的工作流程。了解这个工作流程需要注意以下几点:
1、输入数据对应4个数据块block,每个block启动一个Map任务。其中Map任务有4个,Reduce任务有2两个。
2、shuffle数据划分的规则是:1***和2***形式的键划分到第一个Reduce任务;3***和4***形式的键值划分到第二个Reduce任务。
3、考虑Map的输入、Map的输出、Reduce的输入、Reduce的输出等四个不同位置的数据,我们可以发现数据发生了如下变化:
      Map的输入:块间无序,块内无序
      Map的输出:块间无序,块内有序
      Reduce的输入:块间有序,块内无序
      Reduce的输出:块间有序,块内有序
sort程序的特征就是处处存在排序!    

三、思考题
3.1 MapReduce模型适合哪些应用场景?
      MapReduce并不能解决所有的并行计算问题,后续会讲解适合MapReduce编程模型的典型应用场景。
3.2 MapReduce还可以怎么样简化?
     使用SQL语句,自动翻译成MapReduce程序,来实现统计分析和计算

3.3 wordcount和sort两个程序特征有什么不一样?
      输出数据量与输入数据量的比值。wordcount一般来讲数据量会变小(万分之一也有可能),但是sort的输出数据量与输入数据量相等!

mapreduce编程相关文章