分享

mapreduce编程模型

hyj 2014-3-2 19:54:15 发表于 常识型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 13 63972
阅读本文可以带着下面问题
1.reduce数量由谁来决定?
2.运行作业的工具由哪些?

更多问题等待你挖掘






MapReduce的设计目标是方便编程人员在不熟悉分布式并行编程的情况下,将自己的程序运行在分布式系统上。当前的软件实现是指定一个Map(映射)函数,用来把一组键值对映射成一组新的键值对,指定并发的Reduce(化简)函数,用来保证所有映射的键值对中的每一个共享相同的键组。MapReduce编程现在基本已经成为分布式并行编程框架的Bible,很多分布式计算引擎的实现[Hadoop][CIEL][Twister][Transformer][MR-mpi][Phoenix][Dryad]都将MapReduce编程作为一个核心的编程模型。
MapReduce编程模型组件:Mapper,Reducer
    Mapping:MapReduce将Input List作为Mapping函数的输入参数,经过处理,把结果返回给Output List。举例来说,有一个函数toUpper(str),用来返回输入字符串的大写版本。那么这里的Input List指的是转换前的常规字符串列表,Mapping Function指的是toUpper函数,而Output List指的是转换后的大写字符串列表。值得注意的是,在这里Mapping并没有改变输入字符串列表,而是返回一个新的字符串列表。

    Reducing:MapReduce将Input List作为Reducing函数的输入参数,经过迭代处理,把这些数据汇集,返回一个输出值给Output Value。从这个意义上来说,Reducing一般用来生成”总结“数据,把大规模的数据转变成更小的总结数据。例如,"+"可以用来作一个reducing函数,去返回输入数据列表的值的总和。

    从工作流程来讲,MapReduce对应的作业Job首先把输入的数据集切分为若干独立的数据块,并由Map组件以Task的方式并行处理。处理结果经过排序后,依次输入给Reduce组件,并且以Task的形式并行处理。MapReduce对应的输入输出数据由HDFS的DataNode存储。MapReduce对应的Job部署在Master服务器,由Master JobTracker负责Task的调度,监控,重新执行失败的任务等等。MapReduce对应的Job部署在若干不同的Slave服务器,每个集群节点含一个slave TaskTracker,负责执行由master指派的任务。

 Hadoop框架由Java实现的,它提供了两种主要工具。

  Hadoop Streaming是一种运行作业的实用工具,它允许用户创建和运行任何可执行程序(例如:Shell工具)来做为mapper和reducer。Hadoop Pipes是一个与SWIG兼容的C++ API (没有基于JNITM技术),它也可用于实现Map/Reduce应用程序。这样,开发人员就可以利用MapReduce编程框架,开发分布式应用程序,运行在由上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上T级别的数据集。


MapReduce过程关键点
    1)Map阶段的数据本地性的考虑。
    2)Map中间结果的归并,由多个Spill文件归并成一个大文件。
    3)Reduce拷贝数据的过程

MapReduce核心:Shuffle过程
    要想理解MapReduce编程, Shuffle是必须要了解的。 Shuffle的正常意思是洗牌或弄乱,可能大家更熟悉的是Java API里的Collections.shuffle(List)方法,它会随机地打乱参数list里的元素顺序。

    在Hadoop这样的集群环境中,大部分map task与reduce task的执行是在不同的节点上。当然很多情况下Reduce执行时需要跨节点去拉取其它节点上的map task结果。如果集群正在运行的job有很多,那么task的正常执行对集群内部的网络资源消耗会很严重。这种网络消耗是正常的,我们不能限制,能做的就是最大化地减少不必要的消耗。还有在节点内,相比于内存,磁盘IO对job完成时间的影响也是可观的。从最基本的要求来说,我们对Shuffle过程的期望可以有:

    完整地从map task端拉取数据到reduce 端。
    在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗。
    减少磁盘IO对task执行的影响。












本帖被以下淘专辑推荐:

已有(13)人评论

跳转到指定楼层
nettman 发表于 2014-3-2 20:03:51
本帖最后由 nettman 于 2014-3-2 20:18 编辑

上面对于shuffle介绍不是很详细,这里可以在补充:

MapReduce的核心是shuffle,她对于mapreduce的效率起到了至关重要的作用,now,我把我对shuffle的理解过程简单介绍一下,如果有误还请指教阿。。
MapReduce的过程(针对一个map来说):

每个Map在内存中都有一个缓存区,map的输出结果会先放到这个缓冲区当中,缓冲区有一个spill percent,这里默认是80%(可以手动进行配置),也就是说当输出到缓冲区中的内容达到80%时,就会进行spill(溢出),溢出到磁盘的一个临时文件中,也就是说这80%的内容成为一个临时文件,这里还涉及到了一个partition的概念,一个临时文件里面是进行了分区的,并且分区的数量由reduce的数量决定,即不同的分区内容传给不同的reduce。当这80%的内容在溢出时,map会继续向那20%的缓冲中输出。插入一点,在缓冲区溢出到磁盘之前,会进行sort和combiner,然后才会写道磁盘中。这两个步骤很重要,尤其是combiner,它直接决定了MapReduce的效率。并且sort和combiner这两个处理发生在在shuffle的整个过程中。这样一个map执行下来,就会在磁盘上存储几个临时文件,然后会对这几个临时文件进行一个merge,合并程一个文件,这个文件中有n个partition,n是reduce的数量。说明一下:这些临时文件和合并的文件都是在本地文件系统上存储的。

每个Map输出这样一个文件,最后不同Map生成的文件按照不同的partition传给不同的reduce,然后reduce直接把结果输出到HDFS文件系统上了。
这个是官方的一个图:

shuffle_20121016103344.png
有人认为这个图有问题,但在我个人开来,这个图描述的没有问题,如果认为确实有问题的还请指教阿。

简单说一下combiner的一个很重要的作用:combiner会对相同key的值进行合并,比如<a,1><a,1><a,1>,combiner过后合并成<a,3>,即减少了数据量,那末传向reduce的数据量就减少了,进而提高了效率
回复

使用道具 举报

nettman 发表于 2014-3-2 20:15:09
个人对上面的看法
1.reduce数量由谁来决定?
reduce数量有分区的数量来决定
2.运行作业的工具由哪些?
Hadoop Streaming是其中一种,希望楼下能够看到更多的工具。

回复

使用道具 举报

tang 发表于 2015-3-7 12:50:32
很好的解释,学习了
回复

使用道具 举报

Minimumy 发表于 2015-3-26 14:35:36
学习了!多谢!!!
回复

使用道具 举报

狂奔啦蜗牛 发表于 2015-4-1 13:01:35
长知识了  讲的不错
回复

使用道具 举报

tang 发表于 2015-4-3 19:30:11
回复

使用道具 举报

军在桥 发表于 2015-8-12 14:12:48
nettman 发表于 2014-3-2 20:15
个人对上面的看法
1.reduce数量由谁来决定?
reduce数量有分区的数量来决定

上面说的是分区的数量由reduce来决定,那reduce的数量由什么来决定呢?



回复

使用道具 举报

dingweichang 发表于 2015-10-15 16:31:07
军在桥 发表于 2015-8-12 14:12
上面说的是分区的数量由reduce来决定,那reduce的数量由什么来决定呢?

reducer最优个数与集群中可用的reducer任务槽数相关, 由mapred.tasktracker.reduce.tasks.maximum 设置。
回复

使用道具 举报

kril-x 发表于 2015-12-14 16:22:17
分区的数量由reduce来决定,那reduce的数量与reducer最优个数与集群中可用的reducer任务槽数相关, 由mapred.tasktracker.reduce.tasks.maximum 设置。
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条