数据洗牌时内存溢出的修复方法及装置
技术领域
本发明涉及大数据处理领域,尤其涉及一种数据洗牌时内存溢出的修复方法及装置。
背景技术
现今大数据时代下,想要占据领先地位,就需要深挖数据科学领域,走在学术前沿,才能在底层算法和模型方面走在前面,而Spark的这种学术基因,使得它从一开始就在大数据领域建立了一定优势。无论是性能,还是方案的统一性,对比传统的Hadoop,优势都非常明显。
然而Spark属于内存计算机制,当进行数据洗牌如GroupByKey操作时,需要按相应Key的值将数据进行分组,并将分组后的数据传送至reduce阶段。在这过程中GroupByKey的算子需要将所有的键值的记录放到单台服务器上,利用服务器的内存资源进行运算。
在上述进行GroupByKey的过程中,发明人发现:当某个键值出现非常多条的重复记录时,比如有上千万个重复的键值记录a,那么进行单机Reduce计算时,GroupByKey的算子需要将所有的重复的键值记录装载进内存才能运算,当记录数特别多,以至于内存装不下时,便会报出内存溢出的错误。
发明内容
本发明提供了一种数据洗牌时内存溢出的修复方法及装置,能够解决在数据洗牌时,由于某个键值记录数特别多以至于内存装不下时,报内存溢出的问题。
为解决上述技术问题,一方面,本发明提供了一种数据洗牌时内存溢出的修复方法,该方法包括:
当对数据进行洗牌发生内存溢出时,找出目标键值记录,所述目标键值记录为记录数超过预设阈值的键值记录;
对所述目标键值记录进行数据分流处理;
将非目标键值记录重新进行洗牌,并做规约reduce操作,获得初步处理结果;
将所述数据分流处理的结果与所述初步处理结果进行叠加,并做reduce操作,获得最终处理结果。
另一方面,本发明还提供了一种数据洗牌时内存溢出的修复装置,该装置包括:
查找单元,用于当对数据进行洗牌发生内存溢出时,找出目标键值记录,所述目标键值记录为记录数超过预设阈值的键值记录;
分流单元,用于对所述查找单元查找的所述目标键值记录进行数据分流处理;
处理单元,用于将所述查找单元未查找的非目标键值记录重新进行洗牌,并做规约reduce操作,获得初步处理结果;
叠加单元,用于将所述分流单元获得的所述数据分流处理的结果与所述处理单元获得的所述初步处理结果进行叠加,并做reduce操作,获得最终处理结果。
本发明提供的数据洗牌时内存溢出的修复方法及装置,能够找出导致数据洗牌出现内存溢出的目标键值记录,然后对目标键值记录进行数据分流,其他的数据进行重新洗牌,最后将数据分流的结果和其他数据的洗牌结果进行叠加进入下一步的reduce计算。与现有技术相比,本发明能够在数据洗牌出现内存溢出后进行修复,所以可以解决在数据洗牌时,由于某个键值记录数特别多以至于内存装不下时,报内存溢出的问题。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
图1示出了本发明实施例提供的一种数据洗牌时内存溢出的修复的方法流程图;
图2示出了本发明实施例提供的一种当对数据进行洗牌发生内存溢出时,找出目标键值记录的方法流程图;
图3示出了本发明实施例提供的一种数据二次洗牌的方法流程图;
图4示出了本发明实施例提供的一种数据洗牌时内存溢出的修复装置的组成框图;
图5示出了本发明实施例提供的另一种数据洗牌时内存溢出的修复装置的组成框图;
图6示出了本发明实施例提供的又一种数据洗牌时内存溢出的修复装置的组成框图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
为解决现有技术在数据洗牌时,由于某个键值记录数特别多以至于内存装不下时,报内存溢出的问题,本发明实施例提供了一种数据洗牌时内存溢出的修复方法,如图1所示,该方法包括:
101、当对数据进行洗牌发生内存溢出时,找出目标键值记录,目标键值记录为记录数超过预设阈值的键值记录。
在本实施例中,对数据进行洗牌是主要是指Spark领域中的Shuffle过程。Shuffle程是指按照一定的规则对数据进行处理,例如按照键值进行排序(GroupByKey),或者其他的规则。
预设阈值用于限定一条键值记录重复的记录数,本实施例对预设的阈值没有具体的限制,根据实际的情况来决定。
通常,洗牌过程中发生内存溢出的原因在于洗牌过程涉及的键值记录条数过多,而其中又存在一些记录数较多的键值记录。因此,将这些记录数较多的键值记录作为目标键值记录进行查找,并将其从需要洗牌的数据中分离出来进行单独的处理,就可以有效减少内存中的记录条数,从而避免出现内存溢出错误后不能继续进行数据处理的问题。
另外,在本实施例中,找出目标键值记录的方式可以根据实际应用的情况不同进行选择。
102、对目标键值记录进行数据分流处理。
将步骤101中获得的目标键值记录进行数据分流处理。
本实施例中对目标键值记录进行数据分流处理的原理是将目标键值记录拆分为数据流进行计算,即每出现一个键值记录就立即处理,而不是缓存起来成一批进行处理。这样就可以实现出现一个键值记录就加一个键值记录,最终得到所有的键值记录的总数的目的。这个数据分流的结果跟进行数据洗牌的结果是一样的,因此可以很方便并入正常的洗牌结果中进行下一步的reduce计算。
103、将非目标键值记录重新进行洗牌,并做规约reduce操作,获得初步处理结果。
由于步骤102已经对目标键值记录进行了数据分流处理,因此非目标键值记录就可以进行重新洗牌,并进行下一步reduce操作。
将非目标键值记录重新洗牌与出现内存溢出前的数据洗牌过程是相同的,没有改变原先的洗牌方法,这样做也是对原先的洗牌方法的有效利用,使整个的修复方法更为简单。
104、将数据分流处理的结果与所述初步处理结果进行叠加,并做reduce操作,获得最终处理结果。
在本实施例中,为了使经过数据分流处理的结果和数据洗牌的结果达到一致,将步骤102中得到的数据分流处理的结果与步骤103中得到初步处理结果进行叠加,然后重新进行一次reduce的计算就可以得到最终的处理结果。
本发明实施例提供的数据洗牌时内存溢出的修复方法,能够找出导致数据洗牌出现内存溢出的目标键值记录,然后对目标键值记录进行数据分流,其他的数据进行重新洗牌,最后将数据分流的结果和其他数据的洗牌结果进行叠加进入下一步的reduce计算。与现有技术相比,本发明实施例能够在数据洗牌出现内存溢出后进行修复,所以可以解决在数据洗牌时,由于某个键值记录数特别多以至于内存装不下时,报内存溢出的问题。
作为对图1所示实施例的细化及扩展,本发明还提供了以下不同实施例。
本实施例中给出了两种找出目标键值记录的方式。应当明确,以下实现方式中的具体公式、算法、参数仅为示例性说明,不作为对实际应用的具体限制。
如图2所示,一种找出目标键值记录的方式,包括:
201、按照重复记录数由多到少排序的顺序,找出前N个键值记录,其中N为大于1的正整数。
本实施例中,将数据洗牌时出现内存溢出的数据,按照键值重复记录数由多到少排序的顺序,找出前N个键值记录,其中N为大于1的正整数。
N的大小不是一个确定的值,可以根据经验或者是实际的数据处理场景进行自定义。
202、分别计算N个键值记录占用的内存大小,包括:
首先,将键值记录的条目数值,记为n_key的形式。其中n为键值记录的重复条数,key表示键值名,根据不同的键值名选择不同的字符或字符串来定义。
其次,计算单行键值记录的内存空间大小,记为s_key的形式,其中单行键值记录的内存空间大小为键值长度和值列长度的总长度。
其中s表示单行键值记录,key表示键值名,根据不同的键值名选择不同的字符或字符串来定义。
本实施例中单行键值记录的内存空间大小的具体计算方法是将键值长度和值列长度相加。键值长度指键值名的长度,即key的长度;值列长度指键值对应的值的长度,即value值的长度,其中,键值长度及值列长度分别由具体的key和value所对应的字符串所占字节数决定。
为了更清楚表达单行键值记录的内存空间大小的方法,给出了一个例子进行说明。比如某单行键值记录为:key为a,Value为1,则它的单行键值记录的空间大小为:a的长度+1的长度=a占的字节数+1占的字节数=4个字节+1个字节=5个字节,所以单行键值记录为:key为a,Value为1,它对应的单行键值记录的空间大小为5个字节。
然后,计算n_key*s_key,获得键值记录占用的内存大小。
按照上述方法分别对N个键值记录计算获得N个键值记录占用内存大小。
203、将计算出的内存大小分别与最小的单机内存值进行比较。
将步骤202获得的N个键值记录占用的内存大小分别与最小单机内存值进行比较。
204、将内存大小超过所述单机内存值的键值记录确定为目标键值记录。
根据步骤203获得的比较结果来确定筛选目标键值记录,超出最小单机内存值的键值记录作为目标键值记录。未超出最小单机内存的键值记录继续参加后续的数据洗牌。
另一种找出目标键值记录的方式,包括:
找出重复记录数最多的键值记录作为目标键值记录,找出最多的目标键值记录的方法有多种,本实施例中给出了三种方式:
方式一
在数据处理之前,通过数据检测的方式找出所述重复记录数最多的键值记录。
在数据处理之前是指在数据进入Spark之前,然后可以对数据进行一个提前处理,找出重复数最多的键值记录,方便后期的数据直接分流处理,可以节省时间。在不同的应用场景中可以选择使用不同的方式处理。
若数据是日志文件可以用日志查询工具进行查询找出重复记录数最多的键值记录;若存储在数据库里的数据,可通过数据库查询语句进行查询找出重复记录数最多的键值记录;若在分析领域,可以通过历史数据进行预估找出重复记录数最多的键值记录,比如某个列经常会没有传值,从而被记录为默认值,那么默认值则极有可能是记录数最多的那个键值;若为商业场景,可以根据不同的具体商业数据特点情况来具体判断。
方式二
根据发生数据洗牌内存溢出错误的历史记录找出重复记录数最多的键值记录。
本实施例中,历史记录是指所有的在本次数据处理之前所有的键值记录,它包括数据处理过程中经常发生内存溢出的键值记录。
找出重复记录数最多的键值记录的具体过程是:将发生内存溢出的数据中的所有的键值记录与历史记录中的键值记录进行比对,若某个键值记录在历史记录里可以找到对应的键值记录,则表示该键值记录有可能是导致内存溢出的键值记录,本实施例中只找出在历史记录中可以找到的、并且被记录的发生内存溢出错误最多的键值记录作为重复记录数最多的键值记录。
方式三
通过强行计算的方式找出重复记录数最多的键值记录,包括:
首先,洗牌时发生内存溢出的数据进行映射操作,映射操作是为每个发生内存溢出的数据的键值列派生一个值为1的记录,用于统计每个键值的记录数;
其次,映射操作后的数据按键值进行分组,并对每组所有的记录数进行累加;
筛选出记录数最多的键值记录。
为了更清楚的表达强行计算的过程,下面用一个具体的例子对强行计算的实现方式进行说明。例如通过对列k1进行数据洗牌时报了内存溢出错误,我们需要筛选出k1这列里所有的值中,重复记录数最多的那些值,具体的实现语句就是:rdd.Map(k1,1).ReduceByKey(k1,_+_)。
其中rdd表示表执行数据洗牌时失败的数据集合;Map表示映射,映射中每个元素都是独立的,是对每个元素进行一些偏移;ReduceByKey表示按键值进行规约。因此,rdd.Map(k1,1)表示为发生内存溢出的数据的k1列派生一个值为1的记录,ReduceByKey(k1,_+_)表示按k1列中的键值来进行分组,并将所有分组里的记录数进行累加。最后就可以得到k1列中所有键值的记录数,从中筛选出记录数最多的键值记录。
找出键值最多的键值记录是基于键值记录数的多少与其占用内存空间大小成正比的原理,因此属于合理的预估。
进一步的,实际应用中,在对目标键值记录进行分流后,剩余键值记录的洗牌过程可能还会造成内存溢出的情况,因此在本发明的另一实施例中,可以在二次洗牌时再次找出剩余键值记录中的目标键值记录(为区分于前述目标键值记录,本实施例中将其称为次级目标键值记录),并对其做进一步分流处理,如此反复循环,直至洗牌过程不再发生内存溢出为止。具体的,如图3所示,二次洗牌的流程包括:
301、若再次发生内存溢出,则从非目标键值记录中查找重复记录数最多的键值记录作为次级目标键值记录。
在执行完图1步骤103后,若再次发生内存溢出,则从非目标键值记录中进一步查找次级目标键值记录。查找次级目标键值记录的方式与上述几种查找目标键值记录的实现方式相同,实际应用中,可以根据实际的用户需要或是实际的处理效果来选择不同的实现方式。
302、对次级目标键值记录进行数据分流处理。
303、将非次级目标键值记录重新进行洗牌。
步骤302至步骤303分别与图1中步骤102和步骤103的实现方式对应相同,此处不再赘述。
304、重复步骤301至步骤303,直至非次级目标键值记录重洗牌不再出现内存溢出为止。
305、将所有的次级目标键值记录统计到一起作为目标键值记录,将最后一次不再发生内存溢出的非次级目标键值记录记为非目标键值记录。
进一步的,作为对上述图1至图3所示方法的实现,本发明另一实施例还提供了一种数据洗牌时内存溢出的修复的装置,用于对上述图1至图3所示的方法进行实现。如图4所示,该装置包括:查找单元41、分流单元42、处理单元43、叠加单元44;其中,
查找单元41,用于当对数据进行洗牌发生内存溢出时,找出目标键值记录,目标键值记录为记录数超过预设阈值的键值记录;
分流单元42,用于对查找单元41查找的目标键值记录进行数据分流处理;
处理单元43,用于将查找单元41未查找的非目标键值记录重新进行洗牌,并做规约reduce操作,获得初步处理结果;
叠加单元44,用于将分流单元42获得的数据分流处理的结果与处理单元43获得的初步处理结果进行叠加,并做reduce操作,获得最终处理结果。
进一步的,如图5所示,查找单元41包括:
查找模块411,用于按照重复记录数由多到少排序的顺序,找出前N个键值记录,其中N为大于1的正整数;
计算模块412,用于分别计算查找模块411查找的N个键值记录占用的内存大小;
比较模块413,用于将计算模块412计算出的内存大小分别与最小的单机内存值进行比较;
确定模块414,用于在比较模块413比较后,将内存大小超过单机内存值的键值记录确定为目标键值记录。
进一步的,计算模块412用于:
将键值记录的条目数值,记为n_key的形式;
计算单行键值记录的内存空间大小,记为s_Key的形式,其中单行键值记录的内存空间大小包含键值长度和值列的长度的总长度;
计算n_key*s_Key,获得键值记录占用的内存大小。
进一步的,查找单元41用于:
找出重复记录数最多的键值记录作为目标键值记录。
进一步的,查找单元41进一步用于:
在将非目标键值记录重新进行洗牌之后,若再次发生内存溢出,则从非目标键值记录中查找重复记录数最多的键值记录作为次级目标键值记录;
分流单元42,用于:
将次级目标键值记录进行数据分流处理。
进一步的,如图6所示,查找单元41包括:
检测模块415,用于在数据处理之前,通过数据检测的方式找出重复记录数最多的键值记录;
历史查找模块416,用于根据发生数据洗牌内存溢出错误的历史记录找出重复记录数最多的键值记录;
强行计算模块417,用于通过强行计算的方式找出重复记录数最多的键值记录。
进一步的,检测模块415用于:
使用日志查询工具或通过数据库查询找出重复记录数最多的键值记录;
根据历史数据分析查找出重复记录数最多的键值记录。
进一步的,历史查找模块416用于:
根据历史记录预估重复记录数最多的键值记录。
进一步的,强行计算模块417用于:
对洗牌时发生内存溢出的数据进行映射操作,映射操作是为每个发生内存溢出的数据的键值列派生一个值为1的记录,用于统计每个键值的记录数;
对映射操作后的数据按键值进行分组,并对每组所有的记录数进行累加;
筛选出记录数最多的键值记录。
本实施例提供的数据洗牌时内存溢出的修复装置,能够通过找出导致数据洗牌出现内存溢出的目标键值记录,然后对目标键值记录进行数据分流,其他的数据进行重新洗牌,最后将数据分流的结果和其他数据的洗牌结果进行叠加进入下一步的reduce计算。与现有技术相比,本实施例能够在数据洗牌出现内存溢出后进行修复,所以可以解决在数据洗牌时,由于某个键值记录数特别多以至于内存装不下时,报内存溢出的问题。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的发明名称(如确定网站内链接等级的装置)中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。