一种分布式多维离散数据的计算方法与流程

文档序号:11677368阅读:390来源:国知局
本发明涉及一种分布式多维离散数据的计算方法,属于计算机数据处理
技术领域

背景技术
:维度是描述现实世界事物的参数个数,随着对物理世界认知的加深,人们不再仅仅使用一个维度来描述现实事物,而是采用多个维度来详尽的对事物进行描述。多维离散数据是指以某些维度为基准对数据进行离散化划分存储的数据集合,以这种数据为基础的应用广泛存在,例如,在气象预报系统中,用户需要使用预报模式、物理量类型、预报时刻、预报时效、地理高度等5个维度共同刻画一个气象预报数据,通过物理量类型和地理高度两个维度的组合为基准对数据进行离散化划分,并在多台计算机以这两个维度为键进行分布式存储,最终同一个键的数据将会被存储在同一台机器上。新兴的分布式计算系统采用多台计算机对数据进行并行的处理,在处理海量数据方面有较强的优势,以mapreduce,spark等为代表的分布式计算系统已经被广泛的应用于大数据场景。分布式计算其实质是将大的任务分解成若干个小任务,将这些小任务分配给多台机器,每个小任务从存储系统中读取本任务的数据进行处理,这样可以节约运行时间,大大提高计算效率。相对于集中式计算,有些任务可能需要大量的计算能力才能完成,如果采用集中式将会使得计算的时间特别长,特别是在任务资源(内存)要求比较大的情况下,单机往往无法计算。面对新兴的分布式计算系统,以及现有的分布式存储系统,多维离散数据的计算带来了存储层和计算层之间数据对接的问题,即每个小任务应该分配到哪台计算机上,基于此提出了存储层和计算层之间跨层优化的概念,并给出了解决任务和数据对接的方案。目前工业界在对于分布式计算和分布式存储系统之间的对接主要在于粗粒度的任务本地化计算。以分布式计算系统spark和分布式存储系统cassandra为例,cassandra对数据表中的每条记录按照记录的分区键计算一个哈希码,并按照哈希码将这条记录存储到某一台计算机上。spark在对cassandra的整个表进行处理时,spark可以通过cassandra提供的函数得到每个节点上的哈希码分布范围,在spark做任务分配时,为每个哈希码分布范围生成一个任务,并将该任务分配到哈希码分布范围所处的机器上,将这种分配方式称为粗粒度的任务分配。然而对于离散的数据(即cassandra表中离散选取的一些行列对应的值),由于spark只能得到每个离散数据的分区键值,无法得到分区键值对应的哈希码,所以不知道离散数据所在的机器。因此在任务分配时将这种离散数据的任务分配到集群中多台计算机中的任意一台,使任务在计算时无法保证和数据在同一台机器上,从而带来数据在集群中传输的网络开销,导致系统性能大大降低。因此对离散数据在计算层和存储层之间的跨层优化将对分布式计算性能的提升大有裨益。技术实现要素:本发明的目的是提出一种分布式多维离散数据的计算方法,对分布式计算系统和存储系统源码的深入剖析,分析存储系统中数据和机器的分布规律,并将此规律应用于分布式计算系统,达到跨层优化的目的。本发明提出的分布式多维离散数据的计算方法,包括以下步骤:(1)根据分布式存储系统的数据划分规则,在分布式计算系统中建立一个多维离散数据的分区键值ki与哈希码的映射函数fhash;(2)分布式计算系统从分布式存储系统获取包含有多维离散数据信息的元数据,元数据为多维离散数据在分布式存储系统中所有主机的哈希码区间,将获取的所有元数据的哈希码区间的起始哈希码集合记为m,m={m1,m2,m3,...,mi,...,mn},其中mi为第i个哈希码区间的起始哈希码,将集合m中的起始哈希码按照从小到大排列,将集合m的元素个数记为|m|;将所有与起始哈希码相对应的主机集合记为h,h={h1,h2,h3,...,hz,...,hn},其中hz表示第z个起始哈希码所在的主机;(3)在分布式计算系统中建立一个上述步骤(1)的分区键值ki与步骤(2)的主机集合的键机映射表,记作fstatic,fstatic:分区键值→主机集合;设定一个描述分区键值固定性的参数wstatic,根据参数wstatic,对上述步骤(1)的分布式存储系统中多维离散数据的分区键值的固定性进行判断,若wstatic为假,则进行步骤(5),若参数wstatic为真,则进行步骤(4);(4)对分布式计算系统的键机映射表fstatic进行更新,具体过程如下:(4-1)判断在分布式计算系统的指定路径上是否存在键机映射表的记录文件,若存在记录文件,则将键机映射表的记录文件加载到分布式计算系统的内存中用于对步骤(3)的键机映射表fstatic进行初始化,进行步骤(5);若不存在记录文件,则进行步骤(4-2);(4-2)对分布式存储系统中的分区键值集合k={k1,k2,k3,...,ki,...ks}的每一个分区键值计算对应的主机位置。具体步骤如下:(4-2-1)设置变量i=1,将分区键值集合k的第i个分区键值记作ki,分区键值集合k的分区键值个数记作|k|;(4-2-2)根据上述步骤(1)的映射函数fhash,得到ki的哈希码fhash(ki),在上述步骤(2)的哈希码区间的起始哈希码集合m中从左到右查找第一个大于哈希码fhash(ki)的哈希码区间起始值所在的位置p,p∈[1,|m|],若在集合m中查找到满足条件的哈希码区间起始值的位置j,则使p=j,若在集合m中未查找到满足条件的哈希码区间起始值,则使p=1;(4-2-3)将第i个分区键值ki和上述步骤(2)的集合h中的第p个主机hp存储到步骤(3)的fstatic,并使i=i+1,对i进行判断,若i≤|m|,则返回步骤(4-2-2),若i>|m|,则进行步骤(4-4);(4-4)将fstatic存储到分布式计算系统的指定路径,以便下次分布式计算系统启动时快速加载,进行步骤(5);(5)分布式计算系统进行任务分配和计算,包括以下步骤:(5-1)在上述步骤(3)的键机映射表fstatic中查找任务分配处理的多维离散数据的分区键值k,若分区键值k在键机映射表fstatic中,则根据上述步骤(3)的键机映射表fstatic,从主机集合中找出与任务分配处理的多维离散数据的分区键值相对应的主机,并将任务分配到该主机,进行分布式多维离散数据的计算;若k不在键机映射表fstatic中,则进行步骤(5-2);(5-2)在上述步骤(2)的哈希码区间的起始哈希码集合m中从左到右查找第一个大于哈希码fhash(k)的哈希码区间起始值所在的位置p,p∈[1,|m|],若在集合m中查找到满足条件的哈希码区间起始值的位置j,则使p=j,若在集合m中未查找到满足条件的哈希码区间起始值,则使p=1;(5-3)将上述步骤(2)集合h中的第p个主机hp作为该任务所处理数据的主机,将该任务分配到主机hp上,进行分布式多维离散数据的计算,并将分区键值k和hp存储到fstatic,以便下次快速从fstatic中查找分区键值对应的主机。本发明提出的分布式多维离散数据的计算方法,其优点是:1、本发明的分布式多维离散数据的计算方法,大大提高了分布式计算系统的多维离散数据处理能力。通过解决多维离散数据存储层和计算层之间的跨层优化问题,有效地降低了分布式计算系统在处理多维离散数据时,由于任务和数据无法在同一台机器上而带来的网络开销,从而大大提高分布式计算系统的多维离散数据处理能力。在使用分布式计算系统spark和分布式存储系统cassandra处理离散气象数据时,采用此方法后处理速度提高了将近4倍,实验结果有力地证明了此方法的有效性。2、本发明方法简单易用且效果显著,通过元数据和哈希函数得到数据分区键值与主机之间的映射关系,计算层直接通过数据的分区键值即可得到数据所在主机,在任务分配时直接分配到相应的主机即可。实现起来极其简单,而且效果非常好。3、本发明方法有很强的适应性,能够适应于多种分布式计算系统和分布式存储系统。附图说明图1是本发明的分布式多维离散数据的计算方法的系统启动流程框图。具体实施方式本发明提出的分布式多维离散数据的计算方法,流程框图如图1所示,包括以下步骤:(1)根据分布式存储系统的数据划分规则,在分布式计算系统中建立一个多维离散数据的分区键值ki与哈希码的映射函数,分区键值决定多维离散数据在分布式存储系统中的存储位置,该映射函数可以利用已有的murmurhash3或者信息摘要(md5)哈希算法得到。将分区键值与哈希码的映射函数记作fhash,fhash:分区键值→哈希码;(2)分布式计算系统从分布式存储系统获取包含有多维离散数据信息的元数据,元数据为多维离散数据在分布式存储系统中所有主机的哈希码区间,将获取的所有元数据的哈希码区间的起始哈希码集合记为m,m={m1,m2,m3,...,mi,...,mn},其中mi为第i个哈希码区间的起始哈希码,将集合m中的起始哈希码按照从小到大排列,将集合m的元素个数记为|m|;将所有与起始哈希码相对应的主机集合记为h,h={h1,h2,h3,...,hz,...,hn},其中hz表示第z个起始哈希码所在的主机;(3)在分布式计算系统中建立一个上述步骤(1)的分区键值ki与步骤(2)的主机集合的键机映射表,记作fstatic,分区键值→主机集合;设定一个描述分区键值固定性的参数wstatic,根据参数wstatic,对上述步骤(1)的分布式存储系统中多维离散数据的分区键值的固定性进行判断,若wstatic为假,则进行步骤(5),若参数wstatic为真,则进行步骤(4);(4)对分布式计算系统的键机映射表fstatic进行更新,具体过程如下:(4-1)判断在分布式计算系统的指定路径上是否存在键机映射表的记录文件,若存在记录文件,则将键机映射表的记录文件加载到分布式计算系统的内存中用于对步骤(3)的键机映射表fstatic进行初始化,进行步骤(5);若不存在记录文件,则进行步骤(4-2);(4-2)对分布式存储系统中的分区键值集合k={k1,k2,k3,...,ki,...ks}的每一个分区键值计算对应的主机位置。具体步骤如下:(4-2-1)设置变量i=1,将分区键值集合k的第i个分区键值记作ki,分区键值集合k的分区键值个数记作|k|;(4-2-2)根据上述步骤(1)的映射函数fhash,得到ki的哈希码fhash(ki),在上述步骤(2)的哈希码区间的起始哈希码集合m中从左到右查找第一个大于哈希码fhash(ki)的哈希码区间起始值所在的位置p,p∈[1,|m|],若在集合m中查找到满足条件的哈希码区间起始值的位置j,则使p=j,若在集合m中未查找到满足条件的哈希码区间起始值,则使p=1;(4-2-3)将第i个分区键值ki和上述步骤(2)的集合h中的第p个主机hp存储到步骤(3)的fstatic,并使i=i+1,对i进行判断,若i≤|m|,则返回步骤(4-2-2),若i>|m|,则进行步骤(4-4);(4-4)将fstatic存储到分布式计算系统的指定路径,以便下次分布式计算系统启动时快速加载,进行步骤(5);(5)分布式计算系统进行任务分配和计算,包括以下步骤:(5-1)在上述步骤(3)的键机映射表fstatic中查找任务分配处理的多维离散数据的分区键值k,若分区键值k在键机映射表fstatic中,则根据上述步骤(3)的键机映射表fstatic,从主机集合中找出与任务分配处理的多维离散数据的分区键值相对应的主机,并将任务分配到该主机,进行分布式多维离散数据的计算;若k不在键机映射表fstatic中,则进行步骤(5-2);(5-2)在上述步骤(2)的哈希码区间的起始哈希码集合m中从左到右查找第一个大于哈希码fhash(k)的哈希码区间起始值所在的位置p,p∈[1,|m|],若在集合m中查找到满足条件的哈希码区间起始值的位置j,则使p=j,若在集合m中未查找到满足条件的哈希码区间起始值,则使p=1;(5-3)将上述步骤(2)集合h中的第p个主机hp作为该任务所处理数据的主机,将该任务分配到主机hp上,进行分布式多维离散数据的计算,并将分区键值k和hp存储到fstatic,以便下次快速从fstatic中查找分区键值对应的主机。下面以业界使用比较广泛的分布式计算系统spark和分布式存储系统cassandra为代表,并结合附图和具体实施例进一步详细说明如下。定义cassandra表结构以及数据在集群中的分布情况,本步骤不属于本发明提出的跨层优化方法,但为了方便说明本发明的具体实施例,需要先定义数据以及集群状况。本发明以气象预报数据为例进行说明,该气象数据在cassandra中的存储如表1所示:表1数据表格式数据以(分区键,列名)->griddata的形式进行索引,例如griddata32需要通过(wind/800pa,2015021808/06)进行查找。cassandra通过该分区键来确定此条数据应该存储在哪台机器上,在气象数据的存储中,分区键设计成物理量和层次组合的形式,例如temper/800pa表示气压为800pa的高空的温度,列名设计成天气预报起报时间和预报时效的组合,例如2015021808/06表示2015年02月18日08点预测的未来6小时时的情况。griddata表示在地球经纬度网格(以一定的距离切分经纬线)上每个经纬线交点的物理量值,可以理解成一个二维矩阵,行表示纬线对应的值,列表示经线对应的值。最后以(temper/200pa,2015021808/06)->griddata32为例,本映射表示在2015年02月18日08点预测的未来6小时时在200pa高空中温度的分布网格。表2集群机器和数据分布情况主机名主机地址哈希码区间pc1192.168.3.10~85pc2192.168.3.286~171pc3192.168.3.3172~256集群机器和数据分布情况如表2所示,假定spark集群和cassandra集群部署都部署在pc1~pc3这三台机器上,数据以单副本的形式存储。每台机器的哈希码范围如表所示,例如“0~85”表示哈希码范围在[0,85]的数据全部存储在pc1上。(1)根据分布式存储系统的数据划分规则,在分布式计算系统中建立一个多维离散数据的分区键值与哈希码的映射函数,分区键值决定多维离散数据在分布式存储系统中的存储位置,该映射函数可以利用已有的murmurhash3或者信息摘要(md5)哈希算法得到。将分区键值与哈希码的映射函数记作fhash,fhash:分区键值→哈希码,分区键值记为ki;通过这步得到分区键值到哈希码的对应关系如表3所示(为简单起见,这里的token计算并不是真正的md5值,而是采用0到255的一个整数代替);表3分区键哈希码temper/800pa71temper/200pa156wind/800pa23wind/200pa234rain/1000pa134rain/200pa255(2)分布式计算系统从分布式存储系统获取包含有多维离散数据信息的元数据,元数据为多维离散数据在分布式存储系统中所有主机的哈希码区间,将获取的所有元数据的哈希码区间的起始哈希码集合记为m,m={m1,m2,m3,...,mi,...,mn},其中mi为第i个哈希码区间的起始哈希码,集合m中的起始哈希码按照从小到大排列,将所有与起始哈希码相对应的主机集合记为h,h={h1,h2,h3,...,hz,...,hn},其中hz表示第z个起始哈希码所在的主机;具体地,通过调用cassandra的storageservice对外提供的getallranges方法得到类似表2的文本数据。通过解析主机地址和哈希码范围两列可以得到m和h。(3)在分布式计算系统中建立一个上述步骤(1)的分区键值ki与步骤(2)的主机集合的键机映射表,记作fstatic,分区键值→主机集合;设定一个描述分区键值固定性的参数wstatic,根据参数wstatic,对上述步骤(1)的分布式存储系统中多维离散数据的分区键值的固定性进行判断,若wstatic为假,则进行步骤(5),若参数wstatic为真,则进行步骤(4);(4)对分布式计算系统的键机映射表fstatic进行更新,具体过程如下:(4-1)判断在分布式计算系统的指定路径上是否存在键机映射表的记录文件,若存在记录文件,则将键机映射表的记录文件加载到分布式计算系统的内存中用于对步骤(3)的键机映射表fstatic进行初始化,进行步骤(5);若不存在记录文件,则进行步骤(4-2);(4-2)对分布式存储系统中的分区键值集合k={k1,k2,k3,...,ki,...ks}的每一个分区键值计算对应的主机位置,具体步骤如下:(4-2-1)设置变量i=1,将分区键值集合k的第i个分区键值记作ki,分区键值集合k的分区键值个数记作|k|;(4-2-2)根据上述步骤(1)的映射函数fhash,得到ki的哈希码fhash(ki),在上述步骤(2)的哈希码区间的起始哈希码集合m中从左到右查找第一个大于哈希码fhash(ki)的哈希码区间起始值所在的位置p,p∈[1,|m|],若在集合m中查找到满足条件的哈希码区间起始值的位置j,则使p=j,若在集合m中未查找到满足条件的哈希码区间起始值,则使p=1;(4-2-3)将第i个分区键值ki和上述步骤(2)的集合h中的第p个主机hp存储到步骤(3)的fstatic,并使i=i+1,对i进行判断,若i≤|m|,则返回步骤(4-2-2),若i>|m|,则进行步骤(4-4);(4-4)将fstatic存储到分布式计算系统的指定路径,以便下次分布式计算系统启动时快速加载,进行步骤(5);具体地,对于分区键值比较固定的业务,当本系统第一次启动时,可以通过cassandra提供的cql3接口查询所有的分区键值,对每一个分区键值执行如下操作:首先判断是否在fstatic中,如果在则继续计算下一个,否则调用步骤2的fhash得到该分区键值对应的哈希码,对表1的分区键计算哈希码的结果如表3所示。计算完哈希码后,根据m和h来得到分区键对应的主机,结果如表4所示:表4左边三列表示原始数据,最右边两列表示分区键对应的哈希码和主机,这里的主机即该分区键对应的数据的存储位置。最后,我们需要将表4第一列和最右边两列存储成哈希表的形式并持久化到磁盘。至此完成计算系统启动时的预处理工作。(5)分布式计算系统进行任务分配和计算,包括以下步骤:(5-1)在上述步骤(3)的键机映射表fstatic中查找任务分配处理的多维离散数据的分区键值k,若分区键值k在键机映射表fstatic中,则根据上述步骤(3)的键机映射表fstatic,从主机集合中找出与任务分配处理的多维离散数据的分区键值相对应的主机,并将任务分配到该主机,进行分布式多维离散数据的计算;若k不在键机映射表fstatic中,则进行步骤(5-2);(5-2)在上述步骤(2)的哈希码区间的起始哈希码集合m中从左到右查找第一个大于哈希码fhash(k)的哈希码区间起始值所在的位置p,p∈[1,|m|],若在集合m中查找到满足条件的哈希码区间起始值的位置j,则使p=j,若在集合m中未查找到满足条件的哈希码区间起始值,则使p=1;(5-3)将上述步骤(2)集合h中的第p个主机hp作为该任务所处理数据的主机,将该任务分配到主机hp上,进行分布式多维离散数据的计算,并将分区键值k和hp存储到fstatic,以便下次快速从fstatic中查找分区键值对应的主机。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1