负荷削减并行计算方法及装置
技术领域
本发明涉及电网技术领域,特别涉及一种负荷削减并行计算方法。
背景技术
随着电力需求的持续增长及电网互联规模不断扩大,电力系统运行与控制需要处理大量的数据,而且对实时性有较高要求。电力系统负荷削减计算的传统串行方式在可处理规模与求解速度上无法满足大型电力网络的在线分析及实时控制等仿真要求,因此提出可行的支持复杂问题快速求解的并行计算方案。
目前电力分析的并行计算一般为基于MPI(Message-Passing-Interface,消息传递接口)实现并行化计算。但是,负荷削减计算用到的算法非常多,将这些算法进行并行化开发难度大、复杂度高,而且如果新加入一个算法,需要再次进行并行化,不具有普适性。
发明内容
基于此,有必要针对负荷削减算法并行化开发难度大、复杂高、不具有普适性的问题,提供一种负荷削减并行计算方法。
一种负荷削减并行计算方法,包括步骤:
读取支路节点开断数据,将支路节点开断数据均分到数据并行计算平台的多个分区中,其中,数据并行计算平台包括分布式文件系统、Matlab Runtime以及计算引擎;
获取Matlab与Java混合编程的负荷削减算法包;
在各分区内分别调用负荷削减算法包,计算当前分区内的支路节点开断数据,获取支路节点负荷削减量。
上述负荷削减并行计算方法,通过将读取的支路节点开关数据均分到数据并行平台的多个分区中,在各分区内分别调用Matlab与Java混合编程的负荷削减算法包,并行计算当前分区内的支路节点开断数据,获取支路节点负荷削减量,大大降低了负荷削减算法并行化开发的难度以及复杂度,当新加入一个负荷削减的算法,只需要对新算法进行Matlab与Java混合编程得到负荷削减算法包,就可以对该算法并行化,具有较好的普适性。
一种负荷削减并行计算装置,其特征在于,包括:
数据读取模块,用于读取支路节点开断数据,将支路节点开断数据均分到数据并行计算平台的多个分区中,其中,数据并行计算平台包括分布式文件系统、Matlab Runtime以及计算引擎;
算法包获取模块,用于获取Matlab与Java混合编程的负荷削减算法包;
负荷削减量计算模块,用于在各分区内分别调用负荷削减算法包,计算当前分区内的支路节点开断数据,获取支路节点负荷削减量。
上述负荷削减并行计算装置,数据读取模块读取的支路节点开关数据均分到数据并行平台的多个分区中,负荷削减量计算模块在各分区内调用通过算法包获取模块获取的Matlab与Java混合编程的负荷削减算法包,并行计算当前分区内的支路节点开断数据,获取支路节点负荷削减量,大大降低了负荷削减算法并行化开发的难度以及复杂度,当新加入一个负荷削减的算法,只需要对新算法进行Matlab与Java混合编程得到负荷削减算法包,就可以对该算法并行化,具有较好的普适性。
一种计算机设备,包括存储器和处理器,存储器中存储有计算机可读指令,计算机可读指令被处理器执行时,使得处理器执行上述负荷削减并行计算方法的步骤。
一种存储有计算机可读指令的存储介质,计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行负荷削减并行计算方法的步骤。
上述负荷削减并行计算的计算机设备以及存储介质,大大降低了负荷削减算法并行化开发的难度以及复杂度,当新加入一个负荷削减的算法,只需要对新算法进行Matlab与Java混合编程得到负荷削减算法包,就可以对该算法并行化,具有较好的普适性。
附图说明
图1为一个实施例的荷削减并行计算方法流程图;
图2为一个实施例的负荷削减并行计算装置的结构示意图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明的保护范围。
参见图1所示,图1为本发明一个实施例的负荷削减并行计算方法的流程图,该实施例中负荷削减并行计算方法,包括以下步骤:
步骤S101:读取支路节点开断数据,将支路节点开断数据均分到数据并行计算平台的多个分区中,其中,数据并行计算平台包括分布式文件系统、Matlab Runtime以及计算引擎。
负荷削减计算针对的是电网中风险场景,即支路的开断情况。本步骤中,融合集成分布式文件系统(Hadoop Distribute File System,HDFS)、Matlab Runtime和计算引擎构建数据并行计算平台,读取支路节点开断数据,将支路节点开断数据均分到数据并行计算平台的多个分区中。
其中,分布式文件系统提供对大数据集的高吞吐量访问,实现对电气计算的输入输出的多元异构数据的存储。Matlab Runtim是提前部署的Matlab的运行环境,使得数据并行计算平台内不需要安装Matlab软件,使Java程序能够正确调用Matlab程序。计算引擎提供并行计算环境。
步骤S102:获取Matlab与Java混合编程的负荷削减算法包。
Matlab具有较好的数值计算功能,通常负荷削减的计算程序都是由Matlab编写的。Java是一种跨平台,适合于分布式计算环境的面向对象的编程语言,但在数值分析和处理方面的能力并不突出。Matlab和Java混合编程可以实现两种语言的优势互补。
步骤S103:在各分区内分别调用负荷削减算法包计算当前分区内的支路节点开断数据,获取支路节点负荷削减量。
上述负荷削减并行计算方法,通过将读取的支路节点开关数据均分到数据并行平台的多个分区中,在各分区内分别调用Matlab与Java混合编程的负荷削减算法包,并行计算当前分区内的支路节点开断数据,获取支路节点负荷削减量,大大降低了负荷削减算法并行化开发的难度以及复杂度,当新加入一个负荷削减的算法,只需要对新算法进行Matlab与Java混合编程得到负荷削减算法包,就可以对该算法并行化,具有较好的普适性。
可选的,读取支路节点开断数据的步骤可以是从分布式文件系统读取支路节点开断数据,或着是从本地读取支路节点开断情况。
在一个优选实施例中,计算引擎可以使用Spark计算引擎。Spark平台使用了弹性分布数据集(Resilient Distributed Dataset,RDD),为基于内存计算和DAG(DirectedAcyclic Graph,有向无环图)的优化,在Spark平台上可以实施大规模实时并行的电气计算。
融合集成HDFS、Matlab Runtime和Spark,构建数据并行计算平台。HDFS存储负荷削减并行计算数据的输入以及输出。Matlab Runtime提供Matlab计算环境,Spark提供分布式并行计算环境。其中,Matlab Runtime和Spark的整合需要通过管理界面的配置文件在yarn-site.xml的NodeManager高级配置代码段(安全阀)配置Matlab的读写目录。
具体的,从HDFS或本地读取支路节点开断数据后,在Spark上继承org.apache.spark.Partitioner这个类来实现自定义分区功能,将读取到的数据均分到每个spark中的worker上,确保每个worker的计算能力相同,完成负荷削减并行计算。
在本实施例中,采用一定的运算机制把计算任务分担到多台机器上,让每台机器都承担一部分的计算和数据存储在内存中的,实现内存分布式计算框架。使用内存来计算,使用弹性分布数据集存储数据,减少了磁盘I/O的消耗,实现轻量级快速处理,而且适用于多次迭代的计算模型,能够高效的完成电网运行风险评估及其辅助决策系统中的负荷削减计算任务,而且不必对分布式计算过程中各种问题和计算异常进行控制。
在其中一个实施例中,获取Matlab与Java混合编程的负荷削减算法包,可以包括以下步骤:
将Matlab负荷削减串行算法封装为Java类,发布为jar包;
对jar包进行测试,若测试成功,将jar包作为负荷削减算法包;若测试失败,则转至将Matlab负荷削减串行算法封装为Java类,发布为jar包的步骤。
具体的,负荷削减的计算程序通常是由Matlab程序编写的,利用Matlab软件将Matlab负荷削减串行算法封装为Java类,发布为一个完整的jar包,对这个jar包进行本地测试,如果测试成功,该jar包可以作为负荷削减算法包,如果测试失败,则对Matlab负荷削减串行算法重新封装、发布jar包以及测试。
在本实施例中,通过对Matlab负荷削减串行算法进行Matlab与Java混合编程,把不同阶段的算法和数据处理交给具有优势的编程语言,大大降低了负荷削减算法并行化开发的难度以及复杂度。在后续使用过程中,当新加入一个负荷削减的算法,只需要对新算法进行Matlab与Java混合编程得到负荷削减算法包,就可以对该算法并行化,具有较好的普适性。
在其中一个实施例中,对jar包进行测试的步骤可以包括以下步骤:
记录Matlab负荷削减串行算法的输入数据的值和类以及输出数据的值和类型;
根据输入数据的值和类在Java中构建与Matlab相对应的数据结构;
导入jar包,根据jar包获取Java程序;
将数据结构传入Java程序,获取数据结构的执行结果,对比数据结构的执行结果与Matlab负荷削减串行算法的输出数据,若执行结果的值和类型与输出数据的值和类型相同,测试成功。
在本实施例中,通过对jar包进行本地测试的方法,确保分区调用的负荷削减算法包能够正确使用。减少错误出现概率,提高负荷削减并行计算的效率。
具体的,记录Matlab负荷削减串行算法的输入数据的值和类以及输出数据的值和类型,导入Matlab软件提供的“javabuilder.jar”文件,针对Matlab负荷削减串行算法的输入数据类型,在Java中编写和Matlab相对应的数据结构。编写Java程序,对jar包中的Matlab负荷削减串行算法的Java类创建一个对象,传入编写的数据结构,运行Java程序,得到执行结果。将执行结果与Matlab负荷削减串行算法的输出数据进行对比,如果执行结果的值和类型和输出数据的值和类型一样,则本地测试成功,如果执行结果的值和类型和输出数据的值和类型不一样,则本地测试失败。
在其中一个实施例中,在各分区内分别调用负荷削减算法包计算当前分区内的支路节点开断数据,获取支路节点负荷削减量,可以包括以下步骤:
导入负荷削减算法包至计算引擎;
在计算引擎中根据负荷削减算法包获取目标算子;
通过目标算子对支路节点开断数据进行并行计算。
在本实施例中,可以将负荷削减算法包导入至计算引擎,进而生成目标算子,目标算子可以对支路节点开断数据直接进行计算,实现负荷削减算法的应用,达到并行计算的目的。
具体的,将读取到数据均分到各个分区内以后,每个分区的计算引擎导入负荷削减算法包,编写程序获取目标算子,对均分到该分区上的支路节点开断数据进行计算,所获得的计算结果为支路节点负荷削减量。
以计算引擎为Spark为例进行说明,将读取到的数据均分到每个spark中的worker上以后,启动worker的每一个分区上mapPartitions算子,通过Java代码或者Scala代码导入负荷削减算法包,使用Scala语言编写程序获得目标算子,对均分到该分区上的支路节点开断数据进行计算。其中Scala开发代码精简、执行效率高,同时Scala语言是无缝衔接Java的。
在其中一个实施例中,通过目标算子对支路节点开断数据进行并行计算步骤之后,还包括以下步骤:
若分区内的并行计算结果是下一阶段计算的参数,则缓存本阶段并行计算结果,转至导入负荷削减算法包至计算引擎的步骤,进行下一阶段计算。
在本实施例中,对于一个大型的电力辅助系统的负荷削减计算常常具有几十万个任务、每个任务有几十次迭代,这几十万个任务频繁的消耗I/O,可以将计算过程分为多个阶段的,在每一阶段分区计算完成后,将该阶段的计算结果进行缓存,并且对该计算结果进行下一阶段的计算。
以计算引擎为Spark为例进行说明,在每一阶段worker上的分区计算完成后,将该阶段计算结果缓存为RDD,在内存中存储数据,需要持久化时才到磁盘,减少了磁盘I/O的消耗,实现轻量级快速处理,提高了负荷削减计算的速度。
在其中一个实施例中,通过目标算子对支路节点开断数据进行并行计算之后,还包括以下步骤:
自定义序列化目标算子,压缩各分区内的支路节点负荷削减量;收集各分区内的支路节点负荷削减量的压缩数据。
Matlab给Java提供的类型本身是不支持序列化的,所以需要自定义序列化,具体的,可以使用Kyro算法,Kryo是一个快速高效的Java序列化框架,可以快速序列化以及反序列化。对jar包创建的目标算子自定义序列化,在需要再次使用同样的目标算子时,可以反自定义序列化得到目标算子,无需再次调用负荷削减算法包,加快负荷削减并行计算的速度,提高负荷削减并行计算效率。各分区内的通过并行计算得到的支路节点负荷削减量中有大量的矩阵,通过压缩可以节省空间和增加汇聚结果的效率,其中,压缩算法可以采用Snappy压缩算法,Snappy压缩算法提供高速压缩速度和合理的压缩率。
根据上述负荷削减并行计算方法,本发明还提供一种负荷削减并行计算装置,以下就本发明的负荷削减并行计算装置的实施例进行详细说明。
参见图2所示,为本发明一个实施例的负荷削减并行计算装置的结构示意图。该实施例中的负荷削减并行计算装置包括:
数据读取模块201,用于读取支路节点开断数据,将支路节点开断数据均分到数据并行计算平台的多个分区中,其中,数据并行计算平台包括分布式文件系统、MatlabRuntime以及计算引擎。
算法包获取模块202,用于获取Matlab与Java混合编程的负荷削减算法包。
负荷削减量计算模块203,用于在各分区内分别调用负荷削减算法包计算当前分区内的支路节点开断数据,获取支路节点负荷削减量。
可选的,读取支路节点开断数据的步骤可以是从分布式文件系统读取支路节点开断数据,或着是从本地读取支路节点开断情况。
在一个优选实施例中,计算引擎可以使用Spark计算引擎。Spark平台使用了弹性分布数据集(Resilient Distributed Dataset,RDD),为基于内存计算和DAG(DirectedAcyclic Graph,有向无环图)的优化,在Spark平台上可以实施大规模实时并行的电气计算。
融合集成HDFS、Matlab Runtime和Spark,构建数据并行计算平台。HDFS存储负荷削减并行计算数据的输入以及输出。Matlab Runtime提供Matlab计算环境,Spark提供分布式并行计算环境。其中,Matlab Runtime和Spark的整合需要通过管理界面的配置文件在yarn-site.xml的NodeManager高级配置代码段(安全阀)配置Matlab的读写目录。
具体的,从HDFS或本地读取支路节点开断数据后,在Spark上继承org.apache.spark.Partitioner这个类来实现自定义分区功能,将读取到的数据均分到每个spark中的worker上,确保每个worker的计算能力相同,完成负荷削减并行计算。
在其中一个实施例中,算法包获取模块202将Matlab负荷削减串行算法封装为Java类,发布为jar包;对jar包进行测试,若测试成功,将jar包作为负荷削减算法包;若测试失败,重新将Matlab负荷削减串行算法封装为Java类,发布为jar包。
具体的,负荷削减的计算程序通常是由Matlab程序编写的,利用Matlab软件将Matlab负荷削减串行算法封装为Java类,发布为一个完整的jar包,对这个jar包进行本地测试,如果测试成功,该jar包可以作为负荷削减算法包,如果测试失败,则对Matlab负荷削减串行算法重新封装、发布jar包以及测试。
在本实施例中,算法包获取模块202通过对Matlab负荷削减串行算法进行Matlab与Java混合编程,把不同阶段的算法和数据处理交给具有优势的编程语言,大大降低了负荷削减算法并行化开发的难度以及复杂度。在后续使用过程中,当新加入一个负荷削减的算法,只需要对新算法进行Matlab与Java混合编程得到负荷削减算法包,就可以对该算法并行化,具有较好的普适性。
在其中一个实施例中,算法包获取模块202记录Matlab负荷削减串行算法的输入数据的值和类以及输出数据的值和类型;根据输入数据的值和类在Java中构建与Matlab相对应的数据结构;导入jar包,根据jar包获取Java程序;将数据结构传入Java程序,获取数据结构的执行结果,对比数据结构的执行结果与Matlab负荷削减串行算法的输出数据,若执行结果的值和类型与输出数据的值和类型相同,测试成功。
具体的,算法包获取模块202记录Matlab负荷削减串行算法的输入数据的值和类以及输出数据的值和类型,导入Matlab软件提供的“javabuilder.jar”文件,针对Matlab负荷削减串行算法的输入数据类型,在Java中编写和Matlab相对应的数据结构。编写Java程序,对jar包中的Matlab负荷削减串行算法的Java类创建一个对象,传入编写的数据结构,运行Java程序,得到执行结果。将执行结果与Matlab负荷削减串行算法的输出数据进行对比,如果执行结果的值和类型和输出数据的值和类型一样,则本地测试成功,如果执行结果的值和类型和输出数据的值和类型不一样,则本地测试失败。
在本实施例中,算法包获取模块202通过对jar包进行本地测试的方法,确保分区调用的负荷削减算法包能够正确使用。减少错误出现概率,提高负荷削减并行计算的效率。
在其中一个实施例中,负荷削减量计算模块203导入负荷削减算法包至计算引擎;在计算引擎中根据负荷削减算法包获取目标算子;通过目标算子对支路节点开断数据进行并行计算。
在本实施例中,负荷削减量计算模块203可以将负荷削减算法包导入至计算引擎,进而生成目标算子,目标算子可以对支路节点开断数据直接进行计算,实现负荷削减算法的应用,达到并行计算的目的。
具体的,负荷削减量计算模块203将数据读取模块201读取到数据均分到各个分区内以后,每个分区的计算引擎导入负荷削减算法包,编写程序获取目标算子,对均分到该分区上的支路节点开断数据进行计算,所获得的计算结果为支路节点负荷削减量。
以计算引擎为Spark为例进行说明,负荷削减量计算模块203将数据读取模块201读取到的数据均分到每个spark中的worker上以后,启动worker的每一个分区上mapPartitions算子,通过Java代码或者Scala代码导入负荷削减算法包,使用Scala语言编写程序获得目标算子,对均分到该分区上的支路节点开断数据进行计算。其中Scala开发代码精简、执行效率高,同时Scala语言是无缝衔接Java的。
在其中一个实施例中,负荷削减量计算模块203在分区内的并行计算结果是下一阶段计算的参数时,缓存本阶段并行计算结果,导入负荷削减算法包至计算引擎进行下一阶段计算。
对于一个大型的电力辅助系统的负荷削减计算常常具有几十万个任务、每个任务有几十次迭代,这几十万个任务频繁的消耗I/O。在本实施例中,负荷削减量计算模块203可以将计算过程分为多个阶段的,在每一阶段分区计算完成后,将该阶段的计算结果进行缓存,并且对该计算结果进行下一阶段的计算。
以计算引擎为Spark为例进行说明,在每一阶段worker上的分区计算完成后,将该阶段计算结果缓存为RDD,在内存中存储数据,需要持久化时才到磁盘,减少了磁盘I/O的消耗,实现轻量级快速处理,提高了负荷削减计算的速度。
在其中一个实施例中,负荷削减量计算模块203自定义序列化目标算子,压缩各分区内的支路节点负荷削减量;收集各分区内的支路节点负荷削减量的压缩数据。
Matlab给Java提供的类型本身是不支持序列化的,所以需要自定义序列化,具体的,负荷削减量计算模块203可以使用Kyro算法,Kryo是一个快速高效的Java序列化框架,可以快速序列化以及反序列化。对jar包创建的目标算子自定义序列化,在需要再次使用同样的目标算子时,可以反自定义序列化得到目标算子,无需再次调用负荷削减算法包,加快负荷削减并行计算的速度,提高负荷削减并行计算效率。各分区内的通过并行计算得到的支路节点负荷削减量中有大量的矩阵,通过压缩可以节省空间和增加汇聚结果的效率,其中,压缩算法可以采用Snappy压缩算法,Snappy压缩算法提供高速压缩速度和合理的压缩率。
上述负荷削减并行计算装置,数据读取模块读取的支路节点开关数据均分到数据并行平台的多个分区中,负荷削减量计算模块在各分区内调用通过算法包获取模块获取的Matlab与Java混合编程的负荷削减算法包,并行计算当前分区内的支路节点开断数据,获取支路节点负荷削减量,大大降低了负荷削减算法并行化开发的难度以及复杂度,当新加入一个负荷削减的算法,只需要对新算法进行Matlab与Java混合编程得到负荷削减算法包,就可以对该算法并行化,具有较好的普适性。
本发明的负荷削减并行计算装置与本发明的负荷削减并行计算方法一一对应,在上述负荷削减并行计算方法的实施例阐述的技术特征及其有益效果均适用于负荷削减并行计算装置的实施例中。
本发明还提供一种计算机设备,包括存储器和处理器,存储器中存储有计算机可读指令,计算机可读指令被处理器执行时,使得处理器执行上述任一实施例的负荷削减并行计算方法的步骤。
该计算机设备中的处理器所执行的方法与上述实施例中负荷削减并行计算方法相同,此处不再赘述。
本发明一种存储有计算机可读指令的存储介质,计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行上述任一实施例的负荷削减并行计算方法的步骤。
该计算机可读存储介质所执行的方法与上述实施例中的负荷削减并行计算方法相同,此处不再赘述。
应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。