一种基于Spark的网格水文模型分布式计算方法

文档序号:25420207发布日期:2021-06-11 21:31阅读:357来源:国知局
一种基于Spark的网格水文模型分布式计算方法

本发明属于信息技术领域,特别涉及一种基于spark的网格水文模型分布式计算方法。



背景技术:

传统的集总式水文模型在流域上采用平均的、单一化的参数来描述整个流域的水文特征,没有考虑流域不同区域的空间异质性,因此对于复杂流域(下垫面变化大、空间降雨分布变化大)不能进行很好的模拟。分布式水文模型是根据流域下垫面的特征将流域划分成大小不同、空间不规则的子流域,以考虑流域的空间异质性,通过并行计算提高模型计算的效率。网格水文模型属于分布式水文模型的一种,它将流域划分为多个网格单元,每个矩形区域的网格拥有独立的参数和数据,用于描述本网格内流域的水文特征和产汇流,更加精细化地考虑流域各种地理要素的空间异质性,与集总式水文模型和普通的分布式水文模型相比,网格水文模型能更精细更准确的描述流域的水文过程,是探索和认识复杂水文循环过程的有效手段和解决众多水文实际问题的有效工具。

网格水文模型的计算过程包括每个网格的蒸散发、产流等,以及整个流域的不同网格之间的坡面和河道的汇流等,所以与集总式水文模型相比,网格水文模型的计算量要高的多。传统的串行计算模式已经无法满足网格水文模型在大流域上的实时模拟和预报需求,因此,提高网格水文模型的计算效率,是水文预报领域实现网格水文模型实用化迫切需要解决的问题。

现有的分布式水文模型通常采用基于超级计算机资源的并行化计算模式,以子流域为计算单元,在子流域与子流域的计算出口处进行数据交互,实现子流域级别的并行计算。存在的问题主要是,一方面,没有解决子流域内部的并行计算问题,子流域内部的计算依然采用串行计算方式,尤其是坡面与河道汇流模块,造成计算复杂度高;另一方面,现有分布式模型的并行计算方法以子流域单元的计算次序为依据进行任务分发与数据聚合操作,多次的任务分发与数据聚合操作会造成大量的运行时间浪费而且会造成内存溢出的情况。因此现有的并行计算方法,不能适应大流域的计算需求,同时对计算机资源要求较高,不能适应仅包含若干台性能有限的pc机的实验室环境下的水文预报模拟研究需求。同时为了预报成果能够与一些通用的处理软件无缝对接,采用netcdf(networkcommondataform)格式进行计算参数以及模型预报结果的描述。

分布式计算模式采用若干台独立计算机构成的集群作为计算资源,由任务分解服务器将应用分解成许多小的子任务,分配给集群中的多台计算节点进行处理,最后对各节点的计算结果进行聚合产生最终结果。分布式计算模式通过多台计算机的同时计算以节约整体计算时间,提高计算效率,对构成集群的独立计算机的性能要求不高,能够适应仅包含若干台性能有限的pc机的实验室环境下的水文预报模拟研究需求。spark框架是目前主流的分布式计算框架之一,它可以把计算任务分配到多台计算机,让每一台计算机都承担着一部分计算和数据存储任务。相比于hadoop的mapreduce离线数据处理框架来说,spark分布式计算框架能够实现实时计算以及数据的流式计算,除此之外,spark还具有基于内存计算、吞吐量达、容错率高等特点。



技术实现要素:

发明目的:为了克服现有技术中存在的问题,本发明提供一种基于spark的网格水文模型分布式计算方法,能够提高计算效率,同时计算结果能够与常见的通用软件进行无缝对接。

技术方案:为实现上述目的,本发明提供一种基于spark的网格水文模型分布式计算方法,包括如下步骤:

(1)采用netcdf数据格式描述模型参数,建立参数描述文件pfile;

(2)采用xml描述模型构件及其依赖关系,建立模型描述文件mfile;

(3)基于spark的模型构件调度和计算模型gridcsc分析模型描述文件mfile,根据模型计算构件之间的依赖关系、网格依赖关系以及相应的模型参数,进行模型的分布式计算;

(4)参数聚合构件在master节点中聚合每个构件计算的rdd结果,并通过广播发送给各worker节点,供后继构件计算使用;

(5)计算完毕后,参数聚合构件采用netcdf格式输出各构件的计算结果。

进一步的,所述步骤(1)中进行参数数据描述时,描述的参数包括:

模型参数:模型参数是指模型在执行时所需要的相关系数、常量;

流域下垫面参数:流域下垫面参数是描述流域下垫特征信息;包括流域高程、流域水系、流域网格依赖关系、植被覆盖、土质类型;

流域历史降雨和水文数据:流域历史降雨和水文数据是已经监测的流域降雨、流量水位数据、蒸散发数据以及土壤含水量数据;

流域实时、未来降雨参数:流域实时、未来降雨是从其他来源获取的流域当前时刻以及未来降雨的数据,用于模型的预报。

进一步的,所述步骤(1)中进行参数数据描述时,描述规范包括:

坐标系统、时间系统以及参属性的描述遵守netcdf-cf-1.6即climateandforecastconvension1.6)版本的约束;对每个参数的描述包括:参数名称、参数标识、参数类型、参数值、参数说明五方面;其中,流域下垫面参数,流域历史降雨、水文数据,流域实时和未来降雨数据的描述采用多维向量的网格化进行描述;

网格化参数描述时,坐标系统采用经纬度坐标,定义坐标变量lon、lat分别标识经度和纬度,单位即untis属性分别为degree_east和degree_north;取值为float类型;时间系统通过时间坐标变量的untis属性设置起始时间,通过时间坐标变量的取值确定每个数据的时间点。

进一步的,所述步骤(2)中采用xml描述模型构件及其依赖关系时,描述规范包括:

(2.1)描述的构件根据网格水文模型不同而不同,包括:蒸散发模块、产流模块、分水源模块和汇流模块;构件属性包括:构件名称、构件标识、构件编号、构件访问接口方面描述构件的基本信息;

(2.2)通过模型构件前置属性描述构件之间的依赖关系,并确定构件计算顺序;每个构件有1个或者多个前置构件。

进一步的,所述步骤(3)中基于spark的模型构件调度和计算模型gridcsc进行模型的分布式计算时,其步骤包括:

(3.1)从mfile获取模型构件信息以及构件之间的依赖关系,根据计算构件之间的依赖关系确定构件的计算顺序图;

(3.2)循环对所有同时计算的构件进行并行计算,每次循环计算没有任何前置依赖的构件,直到所有构件计算完毕;若构件a的前置构件已经计算时,则认为构件a没有前置依赖;

(3.3)构件计算时,如果该构件中的网格是独立的,则进行独立网格计算,如果待计算的网格之间具有依赖关系,则采用依赖网格计算;

(3.4)构件计算的结果通过处于master的参数聚合构件聚合成rdd结构,并通过广播传递给下一个依赖的构件。

进一步的,所述步骤(3.3)中进行独立网格计算时,其步骤包括:

(3.3.1)利用hash分区方法进行网格计算任务分区划分,确定分配到每个worker上的待计算网格;

(3.3.2)master节点将计算网格分配给对应的worker节点,master节点从参数文件pfile中或rdd中解析出计算所需参数,根据分区结果将网格参数传输给对应计算节点,worker节点调用构件计算接口,进行网格计算;

(3.3.3)参数聚合构件聚合各worker节点的计算结果,形成构件计算结果的rdd存储。

进一步的,所述步骤(3.3.1)中利用hash分区方法进行网格划分时,其步骤包括:

(3.3.1.1)获取每个网格单元的坐标(x,y),将网格单元参数信息组织为<key,value>的形式,其中key对应网格单元坐标(x,y),value对应网格参数值;

(3.3.1.2)根据公式workerid=key.hashcode%workernum得到分区的坐标;其中workerid表示key对应的数据应该被分配到的worker节点标识,key.hashcode表示key在哈希运算中的哈希值,workernum集群中worker节点的个数。

进一步的,所述步骤(3.3)中进行依赖网格计算时,其步骤如图4所示,包括:

(3.3.1)通过“流域网格依赖关系”参数信息得到网格之间的依赖关系;

(3.3.2)根据网格依赖关系通过动态数据划分方法进行网格计算任务划分,确定当前可计算的网格中分配到每个worker上的待计算网格;

(3.3.3)master节点将计算网格分配给对应的worker节点,master节点从参数文件pfile中或rdd中解析出计算所需参数,根据分区结果将网格参数传输给对应计算节点,worker节点调用构件计算接口,进行网格计算;

(3.3.4)参数聚合构件聚合各worker节点的计算结果,形成构件计算结果的rdd存储;

(3.3.5)判断网格是否计算完毕,若没有计算完,则删除已完成计算网格,更新未计算网格对应的上游网格信息,然后转到(3.3.2)。

进一步的,所述步骤(3.3.2)中动态数据划分方法时,其步骤包括:

(3.3.2.1)计算集群可用资源:计算集群中的最大并行数,设有n个同构的计算机作为worker节点,每个节点有m个cpu核数,那么该集群的最大并行数为n*m个,即集群一次最多可以执行n*m个任务;以这个为基础在构件计算中对数据进行分区;

(3.3.2.2)计算网格所有的上游网格坐标:根据计算网格计算次序对应的网格单元个数,先解析出栅格计算次序和流向信息参数,计算出计算次序i对应的网格单元坐标以及每个网格单元对应的上游网格坐标;

(3.3.2.3)根据计算次序对应网格个数对数据进行分区:假设首先寻找网格单元个数大于n*m的计算次序,设计算次序为p的节点有k个,其中k≥n*m,p为满足要求的最大计算次序;则上游网格个数集合表示为t={c1,c2,......,ck};其中ci为第i个网格对应的上游网格的数量;然后计算每个分区分配的网格数量为将k个网格对应的上游网格坐标均等分为n*m份,得到每一个数据块的网格数量为num={num1,num2,......,numn*m},若对于任意的均满足gnumequals*(1-q)≤numi≤gnumequals*(1+q),则计算次序p即为此次计算的次序,将计算次序p对应节点的上游网格数据等份的分配给n*m个执行器;

(3.3.2.4)判断是否存在满足条件的次序,如果存在则对分区内部网格单元根据计算次序进行排序,至此完成动态数据划分操作。如果不存在则更新可分区个数再重新进行分区并返回步骤(3.3.2.3)。

有益效果:本发明与现有技术相比具有以下优点:

现有的网格水文模型计算通常基于超级服务器采用并行计算模式,对计算硬件资源要求较高,同时在计算时,以子流域为单元,子流域内部采用串行方式,没有充分提高计算效率,另外,分布式计算时,没有能够根据网格单元之间的关系,进行合理的任务划分,造成任务和数据分发不平衡,影响计算效率。本发明提出了基于spark的分布式计算模式,普通的pc机构成的集群即可满足计算要求,减少了对计算硬件资源的需求,同时,在计算内容上,以网格为并行计算单元,提高了计算的并行效率,最后,在数据分发时,提出的基于集群计算能力的数据动态分配方法,解决了传统分布式计算中数据分发中的数据不平衡问题,在保证计算次序正确的基础上,最大程度上减少任务分发和数据聚合的操作,保证了每一次的网格计算操作都尽可能的利用集群的资源,从而提高模型整体的分布式计算效率。

附图说明

图1为本发明的流程图;

图2为构件依赖关系描述示例图;

图3为具体实施例中基于xml的构件描述结构图;

图4为具体实施例中依赖网格计算流程图;

图5为具体实施例中的测试结果对比图。

具体实施方式

下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。

本发明提供一种基于spark的网格水文模型分布式计算方法,包括如下步骤:

1.模型计算的总体流程为:首先采用netcdf(networkcommondataform)数据格式描述模型参数,建立参数描述文件pfile;然后采用xml描述模型构件及其依赖关系,建立模型描述文件mfile;然后基于spark的模型构件调度和计算模型(gridcsc)分析模型描述文件mfile和参数文件pfile,根据模型计算构件之间的依赖关系、网格依赖关系以及相应的模型参数,进行模型的分布式计算;最后参数输出模块在master节点中聚合每个构件计算的rdd结果,采用netcdf格式输出计算结果,计算结果可以包含模型计算过程的中间结果(即每个构件的计算结果)。

2.网格化水文模型参数描述方法为::

2.1基于netcdf的网格水文模型参数描述中,需要描述的参数包括:

(1)模型参数。模型参数是指模型在执行时所需要的相关系数、常量等,一般不随时间变化。如蒸散发折算系数、马斯京根系数等此类参数。

(2)流域下垫面参数。流域下垫面参数是描述流域下垫特征等信息,一般不随时间变化。包括流域高程、流域水系、流域网格依赖关系、植被覆盖、土质类型等。这些参数采用三维或者更高维网格化方式描述。其中,流域网格依赖关系确定了每个网格之间的计算先后顺序。

(3)流域历史降雨和水文数据。流域历史降雨和水文数据是已经监测的流域降雨、流量水位数据、蒸散发数据以及土壤含水量数据,用于模型的参数率定以及模型预热。包括:降雨量、蒸发量、水位、流量数据以及数据的时间(包含起始时间和结束时间以及时间间隔)。

(4)流域实时、未来降雨参数。流域实时、未来降雨是从其他来源获取的流域当前时刻以及未来降雨的数据,用于模型的预报。包括:降雨量以及数据的时间(包含起始时间和结束时间以及时间间隔)。

2.2采用netcdf进行网格水文模型参数描述中,坐标系统、时间系统以及参属性的描述遵守netcdf-cf-1.6(climateandforecastconvension1.6)版本的约束。对每个参数的描述包括:参数名称、参数标识、参数类型、参数值、参数说明五方面。其中,流域下垫面参数,流域历史降雨、水文数据,流域实时和未来降雨数据的描述采用多维向量的网格化进行描述。

2.3网格化参数描述时,坐标系统采用经纬度坐标,定义坐标变量lon、lat分别标识经度和纬度,单位(untis属性)分别为degree_east和degree_north;取值为float类型。时间系统通过时间坐标变量的untis属性设置起始时间,通过时间坐标变量的取值确定每个数据的时间点。

3.采用xml描述模型构件及其依赖关系。模型构件属性确定如何调用计算构件,构建之间的依赖关系决定了计算构件的调用先后顺序。

3.1描述的构件根据网格水文模型不同而不同,一般包括:蒸散发模块、产流模块、分水源模块和汇流模块。构件属性包括:构件名称、构件标识、构件编号、构件访问接口方面描述构件的基本信息,描述的xml结构如图3所示。

3.2模型构件依赖关系确定了构件计算顺序。构件之间的基本依赖关系包括:(1)1:1关系,如构件a是构件b的唯一前置构件;(2)n:1关系,即若干个构件为c构件的前置条件;(3)1:n多关系,如,a构件同时为b构件和c构件的前置条件。如,一般蒸散发模块、产流模块和分水源模块均为独立计算构件,这些构件计算完毕后才能计算汇流构件。在图3中,通过每个构件的precoms标签和precom标签描述该构件的前置构件。

4.基于spark的网格水文模型调度和计算模型(gridcsc)的步骤包括:从mfile获取模型构件信息以及构件之间的依赖关系,根据计算构件之间的依赖关系确定构件的计算顺序图,然后循环对所有可同时计算的构件进行并行计算。对某个构件进行计算时,如果该构件中的网格计算是独立的,则进行独立网格计算,如果待计算的网格之间具有依赖关系,则采用依赖网格计算。构件计算的结果通过处于master的参数聚合构件聚合成rdd结构,并通过广播传递给下一个依赖的构件。

4.1循环计算所有构件的流程为:每轮计算没有任何前置依赖的构件,直到所有构件计算完毕。若某个构件i依赖于构件j,但是构件j已经被计算,则构件i也认为是没有依赖的。如图2所示的构件依赖关系中,d依赖a和b,f依赖c,d和e,第一轮计算构件a、b、c、e,第二轮计算构件d,最后计算构件f,并产生输出。

4.2计算某个构件时,如果网格之间没有依赖关系,采用独立网格计算。利用hash分区方法进行网格划分,确定分配到每个worker上的待计算网格。通过master节点将计算的网格分配任务给worker节点,master节点从参数文件pfile中解析出计算所需参数,根据分区结果将网格参数传输给对应计算节点,并调用构件计算接口,进行网格计算。hash分区方法进行数据分区的步骤为:

(1)首先获取每个网格单元的坐标(x,y),将网格单元参数信息组织为<key,value>的形式,其中key对应网格单元坐标(x,y),value对应网格参数值。

(2)然后根据公式workerid=key.hashcode%workernum得到分区的坐标。其中workerid表示key对应的数据应该被分配到的worker节点标识,key.hashcode表示key在哈希运算中的哈希值,workernum集群中worker节点的个数。

4.3计算某个构件时,如果网格之间存在依赖关系,则进行依赖网格计算。通过“流域网格依赖关系”参数信息得到网格之间的依赖关系。计算流程如图4。根据网格依赖关系通过动态数据划分方法进行数据分区,完成分区之后master节点将网格参数信息将按照分区结果分发给各个worker节并调用构件接口进行计算,构件完成计算之后调用参数聚合构件将worker节点的计算机过进行聚合操作。如果一次操作完成之后,流域网格均完成计算则该构件计算完毕,否则删除已完成计算网格,更新未计算网格对应的上游网格信息,再次进行数据分区操作。动态数据划分方法进行数据分区的步骤为:

(4.3.1)计算集群可用资源。计算集群中的最大并行数,设有n个同构的计算机作为worker节点,每个节点有m个cpu核数,那么该集群的最大并行数为n*m个,即集群一次最多可以执行n*m个任务。以这个为基础在构件计算中对数据进行分区。

(4.3.2)计算网格所有的上游网格坐标。根据计算网格计算次序对应的网格单元个数,先解析出栅格计算次序和流向信息参数,计算出计算次序i对应的网格单元坐标以及每个网格单元对应的上游网格坐标。

(4.3.3)根据计算次序对应网格个数对数据进行分区。假设首先寻找网格单元个数大于n*m的计算次序,设计算次序为p的节点有k个,其中k≥n*m,p为满足要求的最大计算次序;则上游网格个数集合表示为t={c1,c2,......,ck};其中ci为第i个网格对应的上游网格的数量;然后计算每个分区分配的网格数量为将k个网格对应的上游网格坐标均等分为n*m份,得到每一个数据块的网格数量为num={num1,num2,......,numn*m},若对于任意的均满足gnumequals*(1-q)≤numi≤gnumequals*(1+q),则计算次序p即为此次计算的次序,将计算次序p对应节点的上游网格数据等份的分配给n*m个执行器。

(4.3.4)判断是否存在满足条件的次序,如果存在则对分区内部网格单元根据计算次序进行排序,至此完成动态数据划分操作。如果不存在则更新可分区个数再重新进行分区并返回步骤(4.3.3)。

5.网格水文模型通过netcdf获取外部的参数信息,并通过netcdf格式将模型的计算结果返回,包括需要中间计算构件的计算结果。构件之间的数据交换通过spark的rdd结构通过内存实现。每个构件计算完成之后,用rdd的形式保存计算结果,参数聚合构件聚合每个worker传递的计算结果数据,形成该构件计算的结果rdd,包括网格信息和每个网格内的计算结果,然后广播到每个worker节点。

6.参数输出构件负责所有构件的rdd向netcdf格式的转换,形成模型计算结果。

下面结合如图1所示的流程图,以网格化的栅格新安江模型为例,介绍基于spark的网格水文模型分布式计算,说明本方法的具体实施方法:

1.栅格新安江模型的参数描述的netcdf文件的dimensions(维度)和variables(变量)描述如下:

2.基于xml描述栅格新安江模型的构件及其之间的依赖关系。对于构件(components)的描述包括构件名称(componentname)、构件编号(componentid)、构件存储路径(componentpath)、构件函数入口(componentfunction)、参数路径(parampath)、前置构件标识(precoms)、依赖参数标识(relparamid)和结果输出路径(resultoutpath)八个子元素和构件类型(componenttype)及构件保存类型(savetype)两个属性。componenttype为1,代表独立计算构件,componenttype为2,代表数据依赖构件;savetype为1,代表exe的存储类型,savetype为2代表微服务的形式,savetype为3代表jar的存储类型。若precoms有多个,则使用逗号进行分隔。此外,在计算过程构件之间需要进行参数传递,需要调用数据聚合构件,需要对输入参数类型(inparamtype)和输出参数类型(outparamtype)进行描述。栅格型新安江模型包括蒸散发构件、产流构件、分水源构件和汇流构件。描述如下所示:

3.基于spark的网格水文模型调度和计算模型(gridcsc)。从mfile中获取栅格新安江模型构件计算依赖关系,栅格新安江模型的构件计算顺序为蒸散发构件、产流构件、分水源构件,最后是汇流构件。因此先计算蒸散发构件,再计算产流构件,接着计算分水源构件,最后计算汇流构件。最终通过参数聚合构件生成输出结果。

3.1计算蒸散发构件、产流构件和分水源构件时,网格之间没有依赖关系,采用hash数据分区方法进行任务划分,确定分配到每个worker上的待计算网格。通过master节点将计算的网格分配任务给worker节点,将参数文件pfile或者rdd广播给worker计算节点,并调用构件计算接口,进行网格计算。

3.2计算汇流构件时,网格之间存在依赖关系,完成分区之后master节点将网格参数信息将按照分区结果分发给各个worker节并调用构件接口进行计算,构件完成计算之后调用参数聚合构件将worker节点的计算机过进行聚合操作。如果一次操作完成之后,流域网格均完成计算则该构件计算完毕,否则删除已完成计算网格,更新未计算网格对应的上游网格信息,再次进行数据分区操作。动态数据划分方法进行数据分区的步骤为:

(3.2.1)计算集群的最大并行数。设有n个同构的计算机作为worker节点,每个节点有m个cpu核数,那么该集群一次可分发的任务个数为n*m个,以这个为基础在构件计算中对数据进行分区。

(3.2.2)计算网格所有的上游网格坐标。根据计算网格计算次序对应的网格单元个数,先解析出栅格计算次序和流向信息参数,计算出计算次序i对应的网格单元坐标以及每个网格单元对应的上游网格坐标。

(3.2.3)根据计算次序对应网格个数对数据进行分区。假设首先寻找网格单元个数大于n*m的计算次序,设计算次序为p的节点有k个,其中k≥n*m,p为满足要求的最大计算次序;则上游网格个数集合表示为t={c1,c2,......,ck};其中ci为第i个网格对应的上游网格的数量;然后计算每个分区分配的网格数量为将k个网格对应的上游网格坐标均等分为n*m份,得到每一个数据块的网格数量为num={num1,num2,......,numn*m},若对于任意的均满足gnumequals*(1-q)≤numi≤gnumequals*(1+q),则计算次序p即为此次计算的次序,将计算次序p对应节点的上游网格数据等份的分配给n*m个执行器。

(3.2.4)判断是否存在满足条件的次序,如果存在则对分区内部网格单元根据计算次序进行排序,至此完成动态数据划分操作。如果不存在则更新可分区个数再重新进行分区并返回步骤(3.2.3)。

4.对各个构件的计算结果进行保存。

4.1定义输出结果存储参数。每一个构件计算完成之后,根据从netcdf模型模块描述信息中解析到的模块计算结果输出参数顺序,按照时间顺序和输出参数排列顺序进行排序,以pairrdd的格式进行读写操作,参数之间使用逗号作为分隔符。以分水源构件计算为例,解析netcdf得到分水源构件的输出参数为rsresult,riresult,rgresult,则网格单元(x,y)分水源构件结果的保存格式为:“t1时刻rsresult的值,t1时刻riresult的值,t1时刻rgresult的值,t2时刻rsresult的值,t2时刻riresult的值,t2时刻rgresult的值.......横坐标(x),纵坐标(y)”。

4.2解析存储构件计算结果的rdd并进行保存。对于每一个构件的计算结果,通过rdd的collect函数将rdd格式转换为转化为list<string>集合。假设模型共返回k个结果,使用split(“,”)函数将string类型转化为string[]数组,设数组的长度为len,则时间节点共有len/k个,则string[0]到string[k-1]为t1时间节点的计算结果,string[k]到string[2*k-1]为t2时刻的值,以此类推,一直到list遍历完毕。得到一个map<key,value[][]>类型的计算结果,key为时间节点,value为与流域网格边界相对应的用来存储计算结果的二维数组。最后的计算结果以三维数组的形式使用netcdf格式进行保存。

实验验证

(1)实验思路

为验证本发明方法在实际应用中的性能,分别利用本发明提出的网格水文模型分布式计算方法与传统的网格水文模型并行计算方法,在屯溪流域使用栅格新安江模型进行水文过程模拟,模拟的水文过程包括蒸散发、产流、分水源、坡面汇流和河道汇流。在空间分辨率为1km的情况下,参与计算的网格单元个数为8586个,水文模拟的时间间隔为1h。为了同时对比传统的串行计算方法、spark分布式计算方法和本发明的改进的spark分布式计算方法。

(2)实验环境

计算的集群环境由三台物理机构成,每台物理机的处理器为inteli5-7300hq,cpu的物理核数为4,使用spark的standalone集群模式进行计算。

(3)实验结果分析

三种方法的测试结果如图5所示。从计算时间和内存溢出情况两方面对实验进行分析,首先计算时间方面,由图可以看出在7天、14天、20天预热期中,spark分布式计算方法和改进的spark分布式计算方法都优于传统的串行计算方法,但是由于本文的方法会造成小部分集群资源浪费的情况,所以运算速度略低于未改进的分布式计算方法;但是从内存溢出方面来说,传统的并行计算方法在预热期超过20天就存在内存溢出的现象,而未改进的spark分布式计算方法由于大量的shuffle操作在预热期超过60天出现了数据溢出的现象,而本发明提出的改进的spark分布式计算方法由于使用了动态数据划分策略,大大减少了shuffle操作,因此在预热期超过90天仍然未出现内存溢出的情况。水文模拟效率得到了大大的提升。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1