一种数据处理方法和系统的制作方法

文档序号:6605602阅读:162来源:国知局
专利名称:一种数据处理方法和系统的制作方法
技术领域
本发明涉及数据处理技术领域,尤其涉及一种数据处理方法和系统。
背景技术
映射规约(MapReduce)方法是一种典型的大规模数据处理方法,其将数据处理过程分为两个阶段,即映射(Map)阶段和规约(Reduce)阶段,在Map阶段,对每一个数据元素进行计算,在Reduce阶段,对一个列表的数据元素进行合并。图1是现有技术中的MapReduce数据处理方法流程图。如图1所示,该方法包括步骤101,读取需要处理的数据元素,对每一个数据元素进行计算,生成中间结果。本步骤属于Map阶段,需要处理的数据元素以键值数据(key/value)对的形式作为Map阶段的输入,Map阶段得到的中间结果也是以key/value对的形式表示。步骤102,对所述中间结果进行合并,得到最终的结果。本步骤中,对所述中间结果中具有相同key值的value,根据当前应用场景进行合并,得到最终的结果,例如,对具有相同key值的value,对value进行求和并,求和合并成一个key/value对,将该合并后的key/value对作为最终的结果。图2是MapReduce数据处理系统组成示意图。如图2所示,该系统包括映射模块(Mapper) 201和规约模块(Reducer) 202,Mapper 用于执行Map阶段的数据处理,得到中间结果,Reducer用于执行Reduce阶段的数据处理, 得到最终结果。图3是MapReduce数据处理系统进行数据处理的流程示意图。一次MapReduce计算请求可以被称为一次作业,如图3所示,客户端工作跟踪模块 (JobTracker)提交作业,该作业由JobTracker协调,先执行Map阶段(即图3中的Ml、M2 和M3阶段),再执行Reduce阶段(即图3中的Rl和R2),其中Map阶段和Reduce阶段的处理都受任务跟踪模块(TaskTracker)监控,但是运行在独立于TaskTracker的进程中。Map通过InputFormat,读取全部输入的一部分,在图3中,全部输入被划分为互不重叠的5部分,然后由5个Mapper分别进行处理(图3仅示出了 3个Mapper,其中一个 Mapper可以处理一个或两个或更多的输入部分)。Mapper的输入是键值对〈key 1,valuel〉, Mapper对keyl和valuel进行处理后,得到中间结果的键值对<key2,value2>,根据预设的规则将各个Mapper得到的中间结果<key2,Value2>有区分性地写到不同的输出区域中,例如将键值相同的<key2,value2>写到一个输出区域,将键值不同的<key2,value2>写到不同的输出区域,例如图3将中间结果<key2,value2>按照键值的不同分别写到Regionl和 Region2 中。Map阶段完成以后,进入Reduce阶段。Reduce阶段包括三个步骤,分别为混洗 (Shuffle)、排序(Sort)和规约(Reduce)。通过混洗和排序阶段,将Map阶段输出的中间结果分类,将一类中间结果输出到一个Reduce任务上。例如,多个Mapper产生的同一个key值的中间结果分布在不同的设备上,通过混洗和排序,将分布在不同设备上的同一个key 值的中间结果都输出到处理这个key值的Reducer所在设备上。例如,在图3中,将来自不同Mapper的具有相同key值的<key2,value2>对合并到一起,形成<key2, <value2的列表 ,做为Reducer的输入。Reducer通过对<key2, <value2的列表》进行处理,形成最终结果<key3,value3>0由图2可见,目前对大规模数据进行处理时,处理过程一共分为两个阶段,即Map 阶段和Reduce阶段,无论Map阶段输出的中间结果的数量如何,都是直接进入Reduce阶段,因此当Map阶段输出的中间结果数量较大时,将导致Reduce阶段需要处理的数据量过大,可能超出Reducer的数据处理能力,使得数据处理无法顺利完成。为了减少Reducer的数据输入量,在图3中,尽量降低各个Mapper输出的中间结果的数据量,具体地,在每个Mapper中,通过合成模块(Combiner)按照预定规则对该 Mapper得到的中间结果<key2,Value2>先进行合并,例如将key值相同的所有中间结果合并成一个中间结果,然后将合并后的中间结果输出到Reducer中,以减少各个Mapper输出到Reducer的中间结果数据量。图3中的Combiner虽然可以在一定程度上减少Mapper输出到Reducer的中间结果数据量,但是由于各个不同的Mapper输出的中间结果之间还可能存在大量的可合并数据,当各个Mapper输出的中间结果直接输出到Reducer时,可能导致Reducer需要处理的中间结果数据量仍然较大,超出Reducer的数据处理能力,使数据处理无法顺利完成。例如,在下面的应用中,假如有如下的数据域名QQ号码性别www.qq.com21201421 男www. sina. com. cn 213123 男......www. yahoo, com 231123 女如果需要统计按照性别区分,访问某一地址的不同QQ号码的数量,则在相应的 MapReduce应用中,在Mapper中,其输入是上面数据中的一行,输出的key2是“性别+_UV, Value2是域名和QQ号码,例如,对于第一行数据,Mapper的输出是〈"男_UV〃,“ www.
qq. com#21201421// >,Reducer的处理流程是将所有的value2去重并输出去重以后的数目。显然地,在这种情况下,对于Reduce任务,只有两个输入的key2,分别为“男UV" 和〃女UV"。如果我们的记录有100亿行,那么,最少有一个Reduce任务需要处理一个有 50亿条Value2记录的列表。Reduce任务需要在Value2列表中去重并计数。在大规模数据中进行一次去重计数操作,往往会超出系统的能力,例如保留去重计数中间状态需要大量的内存,处理这样大规模数据集需要的时间也可能超过允许的时间窗口等等。在上述场景下应用Combiner虽然可以一定程度上减少输入到Reducer的数据量, 但是由于数据分散在各个Mapper上,在每一个Mapper上不能合并太多的<key2,Value2>, 因此减少数据量的效果有限
发明内容
有鉴于此,本发明提供了一种数据处理方法和系统,以避免需要处理的数据量超出相应处理设备的处理能力。本发明的技术方案具体是这样实现的一种数据处理方法,该方法包括通过若干个映射模块对原始数据进行处理,得到第一中间结果数据,将所有第一中间结果数据分成第一中间结果数据组;判断各个第一中间结果数据组的数据量是否超过相应规约模块的处理能力,如果是,将每个第一中间结果数据组划分出多个第二中间结果数据组,对每个第二中间结果数据组分别进行合并规约,将合并规约后的结果输出给划分出该第二中间结果数据组的第一中间结果数据组对应的规约模块。一种数据处理系统,该系统包括第一映射模块、第一规约模块、控制模块、第二映射模块和第二规约模块;所述第一映射模块,对原始数据进行处理,得到第一中间结果数据,将所有第一中间结果数据分成第一中间结果数据组,每个第一中间结果数据组对应一个第一规约模块;所述控制模块,在第一中间结果数据组的数据量超过相应第一规约模块的处理能力时,向第二规约模块发送调用指示;所述第二规约模块,接收来自所述控制模块的调用指示后,将每个第一中间结果数据组划分出多个第二中间结果数据组,对每个第二中间结果数据组分别进行合并规约, 将合并规约后的第二中间结果数据组输出给第二映射模块;所述第二映射模块,将合并规约后的结果输出给划分出该第二中间结果数据组的第一中间结果数据组对应的第一规约模块;所述第一规约模块,对接收的数据进行规约。由上述技术方案可见,本发明在规约模块对应的第一中间结果数据组的数据量超过该规约模块的处理能力时,通过从该第一中间结果数据组进一步划分出多个第二中间结果数据组,对第二中间结果数据组分别进行合并规约,以减小每个第二中间结果数据组的数据量,然后再将合并后的第二中间结果数据组输出给划分出该第二中间结果数据组的第一中间结果数据组对应的规约模块,从而减小输出给该规约模块的数据量,达到避免需要处理的数据量超出相应处理设备的处理能力的目的。由于本发明的第一中间结果数据组是从所有的第一中间结果数据中划分得到的, 能够涵盖分散在各个映射模块上的第一中间结果数据,因此本发明通过从该第一中间结果数据组中划分出第二中间结果数据组,并对各个第二中间结果数据组进行合并规约,与按照现有技术将第一中间结果数据组直接输入到相应规约模块相比,能够有效地从整体上降低输入到所述规约模块的数据量。


图1是现有技术中的MapReduce数据处理方法流程图。图2是MapReduce数据处理系统组成示意图。图3是MapReduce数据处理系统进行数据处理的流程示意图。图4是本发明提供的数据处理方法流程图。
图5是本发明提供的数据处理系统的组成示意图。图6是本发明的MapReduce系统和现有技术中的MapReduce系统的结构对比图。
具体实施例方式图4是本发明提供的数据处理方法流程图。如图4所示,该方法包括步骤401,通过若干个映射模块(mapper)对原始数据进行处理,得到第一中间结果数据,将所有第一中间结果数据分成第一中间结果数据组,每个第一中间结果数据组对一个规约模块(reducer)。步骤402,判断各个第一中间结果数据组的数据量是否超过相应规约模块的处理能力,如果是,执行步骤403,否则执行步骤404。步骤403,将每个第一中间结果数据组划分出多个第二中间结果数据组,对每个第二中间结果数据组分别进行合并规约,将合并规约后的结果输出给划分出该第二中间结果数据组的第一中间结果数据组对应的规约模块,执行步骤405。其中,本步骤中对数据合并规约是指,在对数据进行规约时,将能够合并的数据进行合并,例如,在去重计数时,将重复的多个数据仅存储一个,并且存储该数据的重复次数。步骤404,将该第一中间结果数据组直接输出给相应的规约模块。步骤405,规约模块对输入的中间结果数据进行规约处理得到最终结果。在图4所示流程中,对于步骤401中的每一个第一中间结果数据,采用第二键值对<<key2,key2' >,Value2>存储第一中间结果数据<key2,Value2>,其中,第二键值对的键值<key2,key2' >中,不同的key2'取值是对相同的key2取值的进一步区分,所有第二键值对<<key2,key2 ‘ >,value2>中Value2的取值涵盖了所有第一中间结果数据 <key2,value2>中Value2的取值。换言之,对于现有技术中采用第一键值对的方式存储的第一中间结果数据组,本发明通过采用不同的key2'取值,将该第一中间结果数据组划分成多个第二中间结果数据组,各个第二中间结果数据组采用第二键值对<<key2,key2' >, value2>的方式存储,不同的第二中间结果数据组的key2'取值不同。在步骤402中,可以通过判断键值key2的每个取值对应的键值对<key2,Value2> 的总数是否超过预定数目,如果是,key2的该取值对应的第一中间结果数据组的数据量超过相应规约模块的处理能力,如果否,则key2的该取值对应的第一中间结果数据组的数据量没有超过相应规约模块的处理能力。当判断出第一中间结果数据组的数据量超过相应规约模块的处理能力时,对于各个第一中间结果数据组,根据第二键值对的键值<key2,key2' >,将相同键值<key2, key2' >对应的第一中间结果数据<key2,value2>划分为一个第二中间结果数据组,该第二中间结果数据组的键值对为<<key2,key2' >, value2>, <key2, key2' >的不同取值对应的<<key2,key2' >,value2>划分到不同的第二中间结果数据组中。对每个第二中间结果数据组分别进行合并规约时,对于<key2,key2 ‘ >的每个取值对应的所有 <<key2,key2' >,value2>,将 <key2,key2‘ > 相同的 <<key2,key2' >, value2>中的valUe2进行合并规约,存储合并规约结果。将合并规约后的结果输出给划分出该第二中间结果数据组的第一中间结果数据组对应的规约模块包括对每个第二中间结果数据组合并规约的结果,通过映射来分发数据,得到第三中间结果数据组,将每个第三中间结果数据组输出到相应的规约模块进行规约。图5是本发明提供的数据处理系统的组成示意图。如图5所示,该系统包括第一映射模块501、第一规约模块502、控制模块503、第二映射模块505和第二规约模块504。第一映射模块501,对原始数据进行处理,得到第一中间结果数据,将所有第一中间结果数据分成第一中间结果数据组,每个第一中间结果数据组对应一个第一规约模块 502。控制模块503,在第一中间结果数据组的数据量超过相应第一规约模块502的处理能力时,向第二规约模块504发送调用指示。第二规约模块504,接收来自控制模块503的调用指示后,从第一中间结果数据组划分出多个第二中间结果数据组,对每个第二中间结果数据组分别进行合并规约,将合并规约后的第二中间结果数据组输出给第二映射模块505。第二映射模块505,将合并规约后的结果输出给划分出该第二中间结果数据组的第一中间结果数据组对应的第一规约模块502。第一规约模块502,对接收的数据进行规约。其中,控制模块503,可以在第一中间结果数据组的数据量没有超过相应第一规约模块502的处理能力时,控制第一映射模块501将该第一中间结果数据组输出到相应的第一规约模块502。具体地,第一映射模块501,采用第二键值对<<key2,key2' >,value2>存储第一中间结果数据<key2,value2>,其中,第二键值对的键值<key2,key2 ‘ >中,key2'的取值是对相同的value2取值的进一步区分,所有第二键值对<<key2,key2' >,value2>中 value2的取值涵盖了所有第一中间结果数据<key2,value2>中Value2的取值。控制模块503,判断键值key2的每个取值对应的键值对<key2,Value2>的总数是否超过预定数目,如果是,key2的该取值对应的第一中间结果数据组的数据量超过相应第一规约模块502的处理能力,如果否,key2的该取值对应的第一中间结果数据组的数据量没有超过相应第一规约模块502的处理能力。第二规约模块504,对于<key2,key2 ‘ >的每个取值对应的所有<<key2, key2' >,value2>,将 <key2,key2‘ > 相同的 <<key2,key2' >,value2> 中的 value2 进行合并规约,存储合并规约结果。第二映射模块505,对第二规约模块504进行合并规约的结果,通过映射来分发数据,得到第三中间结果数据组,将每个第三中间结果数据组输出到相应的第一规约模块 502。由图4和图5所示的技术方案可知,本发明在MapReduce系统中,通过在Map阶段得到的中间结果的key中,添加新的分组信息,即添加key2'值,可以将Map阶段得到的中间结果划分为更多的中间结果数据组,对每个中间结果数据组执行合并规约操作,例如可以调用Combiner来执行合并规约操作,然后再调用新创建的Mapper将合并后的中间结果分发给规约模块,以得到最终结果。
简言之,现有技术的MapReduce处理方法中,仅包括一个Map阶段和一个Reduce 阶段,该Map阶段输出的中间结果直接输出到Reduce阶段,该Reduce阶段直接输出最终的结果,因此当该Map阶段输出的中间结果数据量过大,以致于超出该Reduce阶段中相应 Reduce任务的处理能力时,将导致数据处理无法正常进行。本发明中,可以根据Map阶段输出的中间结果的数据量,决定是否在所述Map阶段和所述Reduce阶段之间插入新的Reduce 阶段和Map阶段,如果决定插入,则在接收原始数据的Map阶段输出的中间结果数据的数据量超过相应Reduce任务的数据处理能力时,通过创建新的Reduce任务,该任务调用现有的 Combiner对该中间结果数据进行合并规约,然后再创建新的分发Mapper将合并规约后的数据分发给用以得到最终结果的Reduce任务。图6是本发明的MapReduce系统和现有技术中的MapReduce系统的结构对比图。如图6所示,现有技术中的MapReduce系统仅包括第一映射模块(Mapper) 601和第一规约模块(Reducer) 602,而本发明的MapReduce系统在现有技术中的第一映射模块 601和第一规约模块602之间增加了第二规约模块603和第二映射模块604,其中的第二规约模块603可以是新创建的Reducer,通过调用的现有技术中的Combiner进行合并规约,第二映射模块604可以通过创建新的Mapper分发器实现。对中间结果数据进行合并规约时,具体地,可以将该中间结果数据划分为更细的分组,例如通过插入新的键值key2 ‘,将每个key2取值对应的中间结果数据组<key2, value2>划分成更细的分组<<key2,key2 ‘ >,value2>,其中key2 ‘的不同取值对应了一个不同的更细分组,然后对每一个更细分组进行去重等数据合并操作。其中,也可以先判断key2的每个取值对应的<key2,Value2>的数据量是否超出了相应Reducer的处理能力,只有在超过相应Reducer的处理能力时,才将key2的每个取值对应的所有<key2,value2>划分为更细的分组。下面仍以背景技术部分提到的统计按照性别区分访问某一地址的不同QQ号码的数量的应用为例,对本发明进行示例性说明。在Map 阶段,本发明的 Mapper 的输出是 <<key2,key2' >,value2>,其中,key2 为现有技术中的Mapper输出的key,key2'是为了插入Combiner而产生的新key,该key和 key2,一起构成了 <key2,key2 ‘ >,做为调用 Combiner 时 Mapper 中间结果的 key,而 value2 还是现有技术中的Mapper输出的value。以上面提到的例子来说明如下现有技术中的Mapper 输出的〈〃男 _UV〃,“ www. qq. com#21201421 “ >,则在本发明中,输出为〈“男—UV",“ 01421〃,“ www. qq. com#21201421 “ >。其中,key2 为〃 S_UV〃 , key2'为〃 01421〃 , value % " www. qq. com#21201421 “。Mapper 的本地输出中,需要由key2和key2'形成的新key值<key2,key2 ‘ >,并存储<<key2,key2 ‘ >, value2>0另外,由于新key是由<key2,key2' >得到的,所以<key2,Value2>的值隐含在所有的 <<key2,key2' >,value2> 中。如果Map阶段的中间结果数据输出量不会造成某一个Reduce任务的输入过载,那么,不需要插入Combiner,使用<key2,value)继续处理。如果判定需要插入Combiner,则本发明的JobTracker模块会产生一个Reducer'和Mapper',其中的Reducer'通过简单调用Combiner实现,而Mapper'是一个简单的消息分发器。本发明的Reducer ‘可以通过调用Combiner完成对数据的合并规约,减少数据量,然后进入下一阶段的MapReduce过程,该过程通过Mapper ‘分发数据,执行原有的 Reducer,完成计算。可见,本发明提供的技术方案能够避免在大规模数据处理,尤其是数据统计分析中使用的去重计数操作的Reduce任务中,因为数据量过大,超出系统能力造成任务失败。具体地,通过根据Map阶段的中间结果数据量自动判定是否插入Combiner,进行数据合并,从而减小了数据量。另外,本发明根据系统运行状况选择是否插入Combiner,避免了中间结果数据量较小时也插入Combiner导致的资源浪费,当中间结果数据量较小时,Reducer可以直接计算而不必插入Combiner。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。
权利要求
1.一种数据处理方法,其特征在于,该方法包括通过若干个映射模块对原始数据进行处理,得到第一中间结果数据,将所有第一中间结果数据分成第一中间结果数据组,每个第一中间结果数据组对一个规约模块;判断各个第一中间结果数据组的数据量是否超过相应规约模块的处理能力,如果是, 将每个第一中间结果数据组划分出多个第二中间结果数据组,对每个第二中间结果数据组分别进行合并规约,将合并规约后的结果输出给划分出该第二中间结果数据组的第一中间结果数据组对应的规约模块。
2.根据权利要求1所述的方法,其特征在于,该方法进一步包括如果第一中间结果数据组的数据量没有超过相应规约模块的处理能力,则将该第一中间结果数据组直接输出给相应的规约模块。
3.根据权利要求1或2所述的方法,其特征在于,采用第二键值对<<key2,key2'>, value2>存储第一中间结果数据<key2,value2> ;其中,第二键值对的键值<key2,key2' >中,不同的key2'取值是对相同的key2取值的进一步区分,所有第二键值对<<key2,key2' >,value2>中Value2的取值涵盖了所有第一中间结果数据<key2,value2>中Value2的取值;判断各个第一中间结果数据组的数据量是否超过相应规约模块的处理能力包括判断键值key2的每个取值对应的键值对<key2,Value2>的总数是否超过预定数目,如果是,key2的该取值对应的第一中间结果数据组的数据量超过相应规约模块的处理能力;所述划分出多个第二中间结果数据组包括将相同键值key2对应的第一中间结果数据<key2,Value2>,根据第二键值对的键值 <key2, key2' >中key2'的取值,划分为多个第二中间结果数据组,该第二中间结果数据组的键值对为 <<key2,key2' >,value2>。
4.根据权利要求3所述的方法,其特征在于,所述对每个第二中间结果数据组分别进行合并规约包括对于 <key2,key2 ‘ > 的每个取值对应的所有 <<key2,key2 ‘ >,value2>,将 <key2, key2 ‘ >相同的<<key2,key2 ‘ >,value2>中的Value2进行合并规约,存储合并规约结果。
5.根据权利要求4所述的方法,其特征在于,所述将合并规约后的结果输出给划分出该第二中间结果数据组的第一中间结果数据组对应的规约模块包括对每个第二中间结果数据组合并规约的结果,通过映射来分发数据,得到第三中间结果数据组,将每个第三中间结果数据组输出到相应的规约模块,进行规约。
6.一种数据处理系统,其特征在于,该系统包括第一映射模块、第一规约模块、控制模块、第二映射模块和第二规约模块;所述第一映射模块,对原始数据进行处理,得到第一中间结果数据,将所有第一中间结果数据分成第一中间结果数据组,每个第一中间结果数据组对应一个第一规约模块;所述控制模块,在第一中间结果数据组的数据量超过相应第一规约模块的处理能力时,向第二规约模块发送调用指示;所述第二规约模块,接收来自所述控制模块的调用指示后,将每个第一中间结果数据组划分出多个第二中间结果数据组,对每个第二中间结果数据组分别进行合并规约,将合并规约后的第二中间结果数据组输出给第二映射模块;所述第二映射模块,将合并规约后的结果输出给划分出该第二中间结果数据组的第一中间结果数据组对应的第一规约模块;所述第一规约模块,对接收的数据进行规约。
7.根据权利要求6所述的系统,其特征在于,所述控制模块,在第一中间结果数据组的数据量没有超过相应第一规约模块的处理能力时,控制第一映射模块将该第一中间结果数据组输出到相应的第一规约模块。
8.根据权利要求6或7所述的系统,其特征在于,所述第一映射模块,采用第二键值对<<key2,key2' >,value2>存储第一中间结果数据<key2,Value2>,其中,第二键值对的键值<key2,key2' >中,key2'的取值是对相同的 value2取值的进一步区分,所有第二键值对<<key2,key2' >,value2>中value2的取值涵盖了所有第一中间结果数据<key2,value2>中Value2的取值;所述控制模块,判断键值key2的每个取值对应的键值对<key2,ValUe2>的总数是否超过预定数目,如果是,key2的该取值对应的第一中间结果数据组的数据量超过相应第一规约模块的处理能力,如果否,key2的该取值对应的第一中间结果数据组的数据量没有超过相应第一规约模块的处理能力;所述第二规约模块,对于<key2,key2' >的每个取值对应的所有<<key2,key2 ‘ >, value2>,将 <key2,key2 ‘ > 相同的 <<key2,key2 ‘ >,value2> 中的 value2 进行合并规约, 存储合并规约结果。
9.根据权利要求8所述的系统,其特征在于,所述第二映射模块,对第二规约模块进行合并规约的结果,通过映射来分发数据,得到第三中间结果数据组,将每个第三中间结果数据组输出到相应的第一规约模块。
全文摘要
本发明实施例公开了一种数据处理方法和系统。该方法包括通过若干个映射模块对原始数据进行处理,得到第一中间结果数据,将所有第一中间结果数据分成第一中间结果数据组,每个第一中间结果数据组对一个规约模块;判断各个第一中间结果数据组的数据量是否超过相应规约模块的处理能力,如果是,将每个第一中间结果数据组划分出多个第二中间结果数据组,对第二中间结果数据组分别进行合并规约,将合并规约后的第二中间结果数据组输出给划分出该第二中间结果数据组的第一中间结果数据组对应的规约模块。应用本发明能够避免需要处理的数据量超出相应处理设备的处理能力。
文档编号G06F9/44GK102314336SQ20101022193
公开日2012年1月11日 申请日期2010年7月5日 优先权日2010年7月5日
发明者刘奕慧, 史晓峰, 宫振飞, 张文郁, 蔡斌 申请人:深圳市腾讯计算机系统有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1