发明内容
本发明主要是解决现有技术所存在的无法自动进行任务分配,对任务运行状态缺乏监控以及硬件的可扩展性较差等技术问题,提供了一种基于并行计算模式的瓦片地图数据及服务更新方法,该方法可以自动分配任务,并能在云平台上部署,可以动态的监控计算机器的性能指标,根据生产任务的量来扩展和收缩计算资源,能够通过配置参数重做失败任务,从而节约生产时间和管理成本。
本发明的上述技术问题主要是通过下述技术方案得以解决的:
一种基于并行计算模式的瓦片地图数据及服务更新方法,包括:
以键值对形式定义一个可扩展的用于描述待处理的地图文件信息的地图定义文件,所述地图文件信息包括金字塔层级范围、源文件地址、切图结果汇总介质;
定义一个运行于JStorm框架上的切图构件,所述切图构件用于根据地图定义文件中的地图文件信息生成若干个并行执行的瓦片生产子任务,并将各个子任务的执行结果汇总成最终的瓦片地图数据;其中金字塔的每一层级对应一个子任务。
优化的,上述的一种基于并行计算模式的瓦片地图数据及服务更新方法,根据预先设置的阈值判断各计算节点的资源利用率是否超过上限及下限,并且当节点的资源利用率起过上限时开启一个新的计算节点,当节点的资源利用率超过下限时,则关闭该计算节点。
优化的,上述的一种基于并行计算模式的瓦片地图数据及服务更新方法,所述切图构件包括:
数据源组件:继承Jstorm中的spout接口,用于从数据库读取任务,拆分成子任务并发送给执行单元;
任务执行组件,继承Jstorm中的IRichBolt接口,接收数据源组件的子任务,根据子任务执行结果修改子任务的数据流;
拓扑程序组件,继承并封装Jstrom中的Cofig组件和TopologyBuilder组件,从而能够将数据源组件和任务执行组件进行组合,其定义了数据源组件和任务执行组件的结合关系,并发数量、配置关系;
数据封装组件,用于以键值对方式封装各个组件间传递的可序列化的元组数据。
优化的,上述的一种基于并行计算模式的瓦片地图数据及服务更新方法,数据源组件按规则读取并遍历任务表中的任务数据,将任务数据组织成元组数据类型后发送至任务执行组件,任务执行组件处理所接收到的元组数据后并根据执行结果更新任务执行日志。
一种基于并行计算模式的瓦片地图数据及服务更新系统,包括:
地图定义模块,用于以键值对形式定义一个可扩展的用于描述待处理的地图文件信息的地图定义文件,所述地图文件信息包括金字塔层级范围、源文件地址、切图结果汇总介质;
构件定义模块,用于定义一个运行于JStorm框架上的切图构件,所述切图构件用于根据地图定义文件中的地图文件信息生成若干个并行执行的瓦片生产子任务,并将各个子任务的执行结果汇总成最终的瓦片地图数据;其中金字塔的每一层级对应一个子任务。
优化的,上述的一种基于并行计算模式的瓦片地图数据及服务更新系统,还包括监控模块,用于根据预先设置的阈值判断各计算节点的资源利用率是否超过上限及下限,并且当节点的资源利用率起过上限时开启一个新的计算节点,当节点的资源利用率超过下限时,则关闭该计算节点。
优化的,上述的一种基于并行计算模式的瓦片地图数据及服务更新系统,所述切图构件包括:
数据源组件:继承Jstorm中的spout接口,用于从数据库读取任务,拆分成子任务并发送给执行单元;
任务执行组件,继承Jstorm中的IRichBolt接口,接收数据源组件的子任务,根据子任务执行结果修改子任务的数据流;
拓扑程序组件,继承并封装Jstrom中的Cofig组件和TopologyBuilder组件,从而能够将数据源组件和任务执行组件进行组合,其定义了数据源组件和任务执行组件的结合关系,并发数量、配置关系;
数据封装组件,用于以键值对方式封装各个组件间传递的可序列化的元组数据。
优化的,上述的一种基于并行计算模式的瓦片地图数据及服务更新系统,数据源组件按规则读取并遍历任务表中的任务数据,将任务数据组织成元组数据类型后发送至任务执行组件,任务执行组件处理所接收到的元组数据后并根据执行结果更新任务执行日志。
因此,本发明具有如下优点:(1)使用并行自动化的方式对矢量瓦片数据生产过程进行生产,全方位了解任务的进度、状态;(2)使用自动的,以通知的形式向GIS服务管理系统推送消息,以便实现GIS服务完成使用数据的更新。
实施例:
本发明实是一个基于平行计算下的瓦片数据生产,并且在云平台下布署。目前云平台的底层操作系统都为Linux或者Unix内核,所以其并行计算框架采用阿里巴巴开源项目JStorm进行并行计算的集群环境搭建,通过其提供的API开发库开发并行环境上运行的切图构件。
如图1所示,JStorm并行计算集群环境需要N台机器,可以是虚拟的,可以是物理的;最低至少是两台,其中有一个是任务控制节点,其它的机器为计算节点。集群环境上需要开发切矢量瓦片程序的构件(Topology),进行发布。发布之后的构件根据定义的规则在各计算节点上分配切图的程序进程。
构件(Topology)是并行计算环境下计算程序的拓扑结构,类似于住宅小区的电网和水管网。例如10个计算节点的并行切图构件工作模式。
图2中,任务从源抽取进行分发,由各计算节点进行并行化的切不同省份的瓦片数据,最后将数据存储至相同的目标存储中。从而解决单节点串型化的效率问题。
对于服务更新来说,传统的程序处理手段只能靠人为的更新后,去被动的在服务发布的管理后台重新发布GIS服务,而当前并行计算生产完数据后可以通知服务管理系统去重发服务。
图3中任务领取进程会收到切图程序的通知后,当累计数量完成后,通知服务发布系统更新服务。
JStorm并行计算开源项目是使用Java语言编写的,所以其提供的API(应用程序接口)都是由Java程序编写的,本项发明必须在JStorm并行计算容器环境上运行也是使用Java语言来实现的。
本发明中,以键值对形式定义一个可扩展的用于描述待处理的地图文件信息的地图定义文件,所述地图文件信息包括金字塔层级范围、源文件地址、切图结果汇总介质。
如图4所示,一个地图定义文件中可以同时包含多个数据连接定义,使用名称作为其唯一标识。
数据连接定义包含连接的名称(Name)、标题(Title)和描述(Description),连接使用的用户名、密码、密码加密类型,建立连接使用的协议、连接地址和附加参数,如图5-6所示。
目前可支持的协议包括文件(File)、Oracle数据库(Oracle)、HTTP协议(Http)、HTTPS协议(Https)、Access数据库(Access)、SQLServer数据库(SQLServer)和SQLite文件(SQLite)。使用不同的协议,其访问地址(Address)也会有所不同,描述如下:
(1)File协议:
数据文件所在文件夹的路径,支持绝对路径和相对路径。使用绝对路径时,必须使用file协议的URL定义文件夹路径;相对路径代表相对于当前地图文件的路径,当前文件夹的相对路径使用长度为0的字符串表示。
如地图定义文件的地址为D:/demo data/map/map1.GMAPX,使用存放在本地文件夹D:/demo data/test1文件夹内的数据文件,使用绝对路径时其访问地址为:
file:///D:/demo data/test1
使用相对路径时其访问地址为:
../test1
(2)Oracle协议:
通过数据库实例名或数据库服务名来描述。使用数据库实例名时,用“:”分隔,格式为:数据库地址:端口:数据库实例名;
使用数据库服务名时,用“:”+“/”分隔,格式为:数据库地址:端口/数据库服务名。
如使用服务器10.4.6.57上监听端口为1521,实例名orcl的数据库,其访问地址为:
10.4.6.57:1521:orcl
(3)Http或Https在线服务:
服务请求地址需要以Http或Https(不区分大小写)开头,如:http://127.0.0.1:7001/demowms/wms。地址中的协议名称需要和数据连接中定义的协议类型保持一致。
(4)Access协议
连接地址格式与File协议相同,但指向的是Access数据文件。
(5)SQLServer协议
SQLServer地址,使用“:”分隔,格式为:数据库地址:端口:数据库名。
如使用服务器10.4.6.57上监听端口为1433,名为mydb的数据库,其访问地址为:
10.4.6.57:1521:mydb
(6)SQLite协议
连接地址格式与File协议相同,指向的是SQLite文件所在的文件夹。
如地图定义文件的地址为D:/demo data/map/map1.GMAPX,使用存放在本地文件夹D:/demo data/sqlitefiles文件夹内的数据文件,使用绝对路径时其访问地址为:
file:///D:/demo data/sqlitefiles
使用相对路径时其访问地址为:
../sqlitefiles
连接信息中存放连接使用的用户名和密码,为保证安全性,密码字段的内容可以通过加密方式进行存储,并指明加密方式。加密方式为“PLAIN”时,表明存储的是原文,采用加密方式存储密码时,统一使用“geostar”作为加密的密钥,并将加密结果进行BASE64编码。
(7)MySQL协议
MySQL地址,使用“:”分隔,格式为:数据库地址:端口:数据库名。
如使用服务器10.4.6.57上监听端口为3306,名为mydb的数据库,其访问地址为:
10.4.6.57:3306:mydb
如图6所示,数据源定义包含数据源的名称(Name)、标题(Title)和描述(Description),数据连接名称(Connection)、数据名称(DataName)、数据源格式(GeoSourceType)和数据类型(GeoDataType)。
数据源通过数据连接名称(Connection)与数据连接相关联,数据名称(DataName)定义所使用的文件、数据库表或视图的名称。
图7是本发明的地图文件中的样式组格式。样式资源部分定义了地图数据所需的样式组。一个地图定义文件中可以包含一到多个样式组,每个样式组中包含多个样式。
样式组具有名称(Name)、标题(Title)和描述(Description)等信息,并以名称作为其标识,地图定义中包含使用的样式组名称,通过这个名称关联到指定的样式组。地图中的图层使用同一个样式组中的样式,并通过样式名称关联到样式组中的样式。
样式组和样式作为模板可以单独保存在样式定义文件中(参见2.6节)。在进行地图定义文件的配置时可以从样式定义文件中为地图选择合适的样式,选中的样式将被复制并保存在地图定义文件中。地图中使用的样式组及样式均包含在当前的地图定义文件中。
本发明中的构件中的组成部分如下:
数据源组件:对应JStorm中的spout组件,此处负责从数据库读取任务,拆分成子任务并发送给执行单元;
任务执行组件:消费后可能会排出新的元组数据到该数据流上,也可能会排到到其他数据流,也或者根本不排。可并发。
拓扑程序组件:是将数据源组件、任务环节执行单元组件整合起来的拓扑结构。并定义了数据源组件和任务环节执行单元组件的结合关系、并发数量、配置等等。
数据封装组件:抽象接口,本来应该是一个Key-Value的Map,由于各个组件间传递的元组数据的字段名称已经事先定义好了,所以元组数据只需要按序填入各个Value,所以就是一个Value List。Value可以是任何类型的数据,但是必须要可序列化。
下面详细介绍以上组件。
1、数据源设计
数据源:在构建框架中为spout组件。JDK为1.6或更高版本
GeoFieldsGroupingSpout抽象类通过实现IComponent和ISpout接口,完成GeoFieldsGroupingSoput抽象类的实现。其目的是为了解决用户开发的构件能被我们的并行计算框架所识别管理,在此对storm中的spout组件API进行了封装,使用户通过扩展我们提供的API无缝集成到我们的并行计算框架平台中被管理。
GeoFieldsGroupingSpout抽象类负责实现fieldsGrouping流分组方式,该类负实现stormAPI中的nextTuple方法,在该方法中从数据库领取步骤mpp_step(状态为就绪的),按步骤的优先级排序,每次最多领取10个,然后遍历步骤,回调抽象方法splitStep2unit,该方法由具体子类实现,要求完成将step转换成一个或多个stepModel对象(逻辑上的执行单元unit),转换fail和ack回调方法的操作,实现了执行单元的数据的发送,开发者需要继承GeoFieldsGroupingSpout抽象类。
需要实现以下抽象方法:
spout命名建议:[业务名称]Spout;例:绘制的spout组件DrawSpout,其处理流程如图8所示。
2、元组数据
一个需要发送的执行单元数据,需要实现IGeoUnitBean接口,IGeoUnitBean是一个继承过序列化接口的子接口。通过设计该接口,可以在unit全部流程执行成功或者失败的回调函数中,调用该接口定义的方法,拿到unit数据的唯一标识以及Step的唯一标识等信息。该接口为包装storm发送数据流的Object对象做具体化操作。用户需要实现的接口API如下:
Unit数据模型命名建议:[业务名称]UnitBean;例:绘制的数据处理unit数据对象为:DrawUnitBean,IGeoUnitBean与IGeoStepBean数据对象间关系为多对一的关系。
3、执行单元
执行单元bolt组件,消费Tuple的节点。消费后可能会排出新的Tuple到该Stream上,也可能会排到到其他Stream,也或者根本不排。可并发。
实现方式是通过实现IRichBolt接口来完成,GeoFieldsGroupingBolt抽象类完成了Bolt组件filedsGrouping分组方式的抽象实现,开发者只需要继承该抽象类,实现getDeclareOutputField和executeCallback方法来完成bolt组件的具体业务。
开发者通过承继该类实现fieldsGrouping方式的bolt组件,用户只需要实现两个抽象方法即可,getDeclareOutputField()和executeCallback(Tuple)。并行计算的业务逻辑实现在executeCallback(IGeoUnitBean)方法中。
其设计目的是为了简化子类的实现方法,无缝的集成到我们的storm计算平台中,将storm的API包装在父类中,提供最简单的API给子类实现具体操作的业务逻辑
GeoFiledsGroupingBolt实现了bolt组件的抽象方法,提供以下抽象方法给子类去完成独立的计算单元逻辑。以下是子类必须实现的抽像方法由我们定义的,具体API方法接口如下:
执行单元组件命名建议:[业务名称]Bolt;例:绘制的数据处理bolt组件对象为:DrawBolt。
4、构件说明
构件又称又称(topology)拓扑程序,将Spout、Bolt组件整合起来的拓扑图。定义了Spout和Bolt的结合关系、并发数量、配置等等。
GeoTopologyBuilder:拓扑构造器,将封装TopologyBuilder,Config对象。
GeoTopologyBuilder类设计目的是为了封装storm的Config和TopologyBuilder两个构建topology的组件,简化复杂的配置和提交功能,提供了默认的配置。并在注册spout和bolt组件时要求使用我们自己封装的接口组件例。
GeoTopologyBuilder是一个topology构件的工具类,提供spout和bolt组件注册,并发度配置和其它参数的配置,并提供提交topology到storm集群和本地调试的API。
通过图9中的示例代码可以构建一个topology1的拓扑结构,由spout1发数据给bolt1。以下对GeoTopologyBuilder工具类的方法使用说明:
使用场景:通过以上使用示例,可以将参数动态的存放在数据库,由程序去生成topology的方法。图10是本发明的单件构件处理流程。图11是并行切图构件的工作单元。
本文中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。
尽管本文较多地使用了等术语,但并不排除使用其它术语的可能性。使用这些术语仅仅是为了更方便地描述和解释本发明的本质;把它们解释成任何一种附加的限制都是与本发明精神相违背的。