hadoop的job执行流程

如今随着互联网行业的告诉发展,神马都离不开大规模的数据运算和存储啦。。。就比如淘宝的在线商品数据量如今已经达到了一个令人发指的地步(具体多少不能透入哈哈)。随着业务需求的不断变化和增加,如果单靠dw、dba他们,那他们就不要想过好一个周末了。因此俺们用处了终极武器,MapReduce。
mapreduce其实是一种设计理念,来源于面向功能(方法)的程序语言。它适用的范围是大规模的并发计算。在mapreduce中,有面向用户的操作有两个,就是字面上的map和reduce。map有映射的意义,它的操作会将数据进行初步的筛选,然后map产出的数据会交由reduce处理。这其中颇有一点分治的意味。值得注意的是在map期间,一个map的结果不会影响到任何其他的map,这其实是mapreduce计算理念对计算的一种限制,这种限制可以帮助我们的程序能正常的[color=red]并发[/color]执行。当然如果你的程序之间有相互结果依赖的话就需要考虑怎么指定一个完美的mapreduce过程了,甚至需要对一个功能进行多个job的拆分。。。
那么下面俺们就俺对mapreduce流程的理解。。。
首先自然是数据的格式之类的杂碎。。在mapreduce的过程中数据是以记录为单位的,而且是采用k-v对的形式。当然这些数据类型是完全可以由自己决定的,比如文本的,我们就可以使用hadoop中的Text。。。等等等。。。记住hadoop的数据是kv的就行了。。
整个job的执行流程如下:
dataInput-->split-->Mapper-->Combine-->([color=red]产出临时数据[/color])-->Partition-->Sort-->Reducer-->最终数据。

dataInput就是俺们刚才说的kv的记录,在一个job提交之后我们需要指定一批我们要处理的数据,然后namenode通过简单的规则(可能是由分布式文件系统上的block大小决定,最好是一个block一个map)计算出map的数量。计算map和分配map的一个原则就是数据要尽量不需要通过网络传输。也就是说如果一个block的数据在机器a上,那么这个数据的map最后由a机器执行,这样想想就知道效率比网络传输高一点(当然除了那种极端情况)。其实这就是split的过程,split顾名思义,就是数据的拆分,将输入的数据拆分到每一个map。。。
然后就是我们自己实现的map了,在map里面我们可以加入任何我们需要的业务代码,在map中我们的输入都是kv形式的,而且一个map之间的数据是木有任何关系的。。

之后就是combiner,这一步不是必须的,combiner其实和之后的reducer是一样的,惟一的不同就是combiner只是进行初步的筛选将数据作为mapper的临时输出,而reduce则会将数据作为最终输出,由此可知,combiner也是一种筛选条件。。

在combiner之后,我们mapper的临时文件就产生了,这些临时文件就是存放在map执行的机器的磁盘上的(这就是为什么他们被称为是临时文件的原因了)。

在mapper之后而在reduce之前还有一步partition,分区,就是将map产出的数据分配到reduce中,默认是按照key的hash和你程序中指定的reduce数量的模。。也就是:hash(key)mod(reduceNum),方然我们可以自己指定pa'rtition方法,这样就可以随心所遇的控制reduce的数据分配了。。在这一步之后在还有一个sort操作,即排序啦。最后才是我们的reducer。。。

几个reduce就会在几个[color=red]全局文件系统[/color](在google的mapreduce中就是gfs而在hadoop中就是hdfs)中产出几个文件!这一点和map的结果产出的不同大家都看到了哇。于是我们整个数据分析的流程结束啦!


祝所有的父亲,父亲节快乐。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值