分享

分布式并行计算分析

qz2003 发表于 2013-10-16 13:41:12 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 4 6295
转自http://t.cn/aWGEH8
MapReduce作为分布式并行计算的思想,目前存大3个无法解决的问题。
1、MR思想的低效性;
2、代码的重用性----无法全局优化;
3、数据处理的线性模式;
下面对这3个问题进行详细的解释:
1、MR思想的低效性
MR的思想,会导致将一个计算分成多步来执行,每步之间还插入了数据存储等操作。MR处理数据的过程可以归纳为序列:map-reduce-map-reduce-……,其中,map框架必须存在(执行可以为空)。
A)第一种情况:“1个map+1个reduce”,这种简单的数据处理基本上所有的分布式计算框架都能有效完成,MR框架也做的不错;
B)第二种情况:“1个map+1个Combiner+1个reduce”,其中map和combiner在一个物理节点上执行,而且是在map运行结束,把数据结果存储到硬盘(内存)后才启动combiner进行计算——这是把一个计算(map+combiner)分成两步执行;
C)第三种情况:“map-reduce-map-reduce-……”的序列,其中map的执行可以为空,reduce可以省略。Map过程是一个映射过程,它的功能是把一个映射成一个的集合,那么我们可以把map操作(第一个除外)放到前一个reduce过程中去实现——MR思想再次把一个计算(reduce+map)分成两步执行。
写了这么多,可能很多人还没有明白我要说什么。以上内容总结出来就是MR的思想导致了冗余的数据存储过程。
我们看一个具体的实例证明,用hadoop的MR框架自带的wordcout代码:
WordCount 1(W1):在wordcount代码的基础上,增加一个job2,job2只有一个map过程,但map的执行内容为空;
WordCount2(W2):wordcount代码,但是reduce结果不要写DFS;
两者运行的时间差就是MR浪费掉的时间。这其中包括4个部分:
其中:
A)T_Job 1 Finished:job1 reduce结束到job2启动之间的时间减去处理中间数据的时间;(基本上大于1秒)
B)T_Job2Start:job2配置作业的时间;(3-5秒)
C)T_RM:job2 map读数据的时间+调度map任务的时间;(3(64M)+3=6秒,跟块的大小有关)
D)T_WR:job1 Reduce写DFS的时间,它跟数据量的大小有关。(修改Contextwrite的次数可以进行统计与估算)
一个空map且只运行一轮的时间是15秒,基本跟以上测试时间匹配。
2、MR代码重用性----无法全局优化
如果需要对数据抽取一部分内容,那么可以写一个MR程序,code1;
如果需要对数据中的某个内容作修改,那么可以写一个MR程序,code2;
如果需要对数据抽取一部分内容,然后再对该内容的某个部分进行修改,那么该怎么办?
方法一,对数据先执行code1,执行完成后,再执行code2。如果数据量足够大,例如code1的执行时间需要2个小时,那么,我们可以再找3个人,摆一桌麻将了。
方法二,再写一个MR程序——code12,把这两个计算放在一起做。OK,效率上来了,可是我们需要写一个新的MR程序。如果这种可并行情况较多(设为N),那么你要写全2种组合,就需要写C(N,2)=N(N-1)/2个程序;如果你要写全3种组合,……(是不是有种想找块豆腐撞死的感觉了?)
3、数据处理线性模式;
假如数据的处理流程是一个有向无环图,那么你用MapReduce就会很累了,你需要考虑如何分割任务,这些任务如何并行等。这些内容不是应该由框架完成吗?
总结一句话:MR思想除了能做分布式计算框架都能做的简单事情外,其他事情它做起来都是在浪费时间。
一个高效的分布式并行计算应该使数据流起来,它有3个特性:
1、编程框架要简单,要符合人的思考问题、解决问题的习惯;
    2、数据处理模型是基于对象的;
    3、数据处理过程是基于有向无环图的,计算框架能有效的全局并行执行过程。
   
    这里仅举一个例子:对一年内某商品的销售数据进行统计,它比去年的销售量增长了多少?(假设数据量很大,一个节点处理不了,需要集群计算)
我们思考问题的思路:
(1)计算今年的销售量和去年的销售量(该问题可分为以下2步)。
A)查询今年和去年的每条记录,看商品分别卖了多少;
    B)对A)的数据,根据商品和年进行求和。
(2)计算今年的销售量比去年的销售量增长了多少。
针对以上步骤,我们就可以写一个程序,交给机器去执行了:
(1)        从记录中抽取目标商品销售时间(今年或者去年),以及销售数据
Object_Record(商品,年,数据) :-  Object_Record(data)
(2)按照商品的销售时间对销售数量进行求和
    Object_Record(商品,年,sum(数量)):-  Object_Record(商品,年,数量)
    3)按照销售量的增长
    Object_Record(商品,今年,数量)/ Object_Record(商品,去年,数量)
编程过程就是这么简单:只要把解决问题的思路想清楚了,程序就写出来了。
那么它有什么用处呢?
1、分步式并行计算框架,解决数据分析类的应用。(市场很成熟)
2、个人云平台(未来蓝图)
每个用户(终端)都可看作是一个对象,他具有属性和动作等特征;
云平台存储的数据是用户的数据;
云平台可以为用户提供服务;
云平台提供用户数据分析等服务,可以为用户量身打造服务;
云平台可以开放分析应用接口(应用商店),可以让用户自己制作服务、销售服务。
如有问题,可以邮箱联系:qz2003@gmail.com
              
               
               

已有(4)人评论

跳转到指定楼层
dgxl 发表于 2013-10-16 13:42:06

            看你的说明,似乎写的代码与云计算无关;是否云计算是封装好的,程序员不用管,只要按自己的思路写代码就可以了?
        
回复

使用道具 举报

qz2003 发表于 2013-10-16 13:43:06

            用户写的代码,不需要考虑底层实现,底层实现是云计算封装好的。
分布式并行计算框架的一个功能就是封装并行与容错细节,对用户提供编程接口。
该接口就是一个服务,所以服务的内容反过来也影响了用户群。
        
回复

使用道具 举报

easthome001 发表于 2013-10-16 13:45:32

            好贴顶起来学习了
        
回复

使用道具 举报

modev 发表于 2013-10-16 13:46:30

            不错,受益了。。。
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条