张 磊
(1. 福建省基础地理信息中心,福建 福州 350003)
随着地理信息产业的快速发展,矢量数据、卫星遥感影像数据、三维数据等地理信息数据的数据量呈级数增长[1],数据处理工作对软硬件设备和网络运行环境提出了更高要求。由于硬件设备和网络运行环境升级改造的成本较高,很多地理信息数据处理软件将单机作业模式转向集群化作业模式,以获得更高的生产效率;然而,数据处理软件的升级成本同样较高。
目前,从事地理信息数据处理工作的部门已配备了大量计算机资源和稳定可靠的网络运行环境。通过借鉴集群化数据处理的思路,本文提出了一种基于Winsock的分布式数据处理技术,利用Winsock设计并开发分布式处理程序,将多台计算机组建成工作群,分布式协同处理需要消耗大量计算机资源的任务,从而快速提升数据处理效率。
TCP/IP可实现异构网络无缝链接,但其底层协议复杂,开发难度较大;而Winsock为开发者提供了一种便捷访问TCP/IP 网络的方法[2]。开发者利用Winsock控件函数,可轻松基于TCP或UDP协议与远程计算机建立链接,大幅降低计算机通信的开发难度[3]。
基于Winsock的分布式数据处理技术路线为(图1):①利用Winsock控件在局域网中搭建灵活性强的C/S应用程序,将远程计算机组建成工作群;②根据地理信息数据处理业务需求开发数据处理模块,并部署在客户端;③通过服务器端发布数据处理任务指令,客户端接收任务指令并执行,从而实现多机分布式协同工作。
图1 技术路线图
结合地理信息数据处理业务需求,本文充分利用现有软硬件和网络运行环境,从程序架构、通信模块、处理模块、可扩展性等方面设计灵活的C/S程序,将局域网中多台计算机组建成工作群,以服务器端发布任务指令、多个客户端接收并执行任务指令的方式进行分布式数据处理,从而快速提升数据处理效率。
软硬件和网络运行环境原则上应充分利用现有设备和资源。由于大数据量地理信息数据处理的效率很大程度上取决于计算机硬件、存储设备、网络等设备的性能,因此在经费允许的情况下,可优先提升计算机硬件性能,其次提升存储设备性能和网络带宽,以提升工作群的整体处理效率。
TCP 提供的是面向链接的、可靠的数据流传输[3],为了安全、稳定地协调多台远程计算机资源进行分布式数据处理,程序设计采用TCP 协议进行通信,需分别建立客户端和服务器程序[4]。程序功能主要包括计算机资源管理、处理任务信息传递、地理信息数据处理等。为便于数据处理功能的扩展,程序设计可采用传递参数的方式调用外部定制开发的数据处理模块或成熟商业软件的数据处理模块[5]。程序架构设计如图2所示。
图2 程序架构图
服务器端程序的主要功能是统一调度计算机资源、对客户端下达数据处理任务指令以及监控客户端数据处理任务的执行进度等,以保障计算机工作群组的高效协同处理。服务器端程序无需处理数据,对计算机资源占用较少,可选择配置较低的计算机。客户端程序的主要功能是上传计算机资源信息、执行数据处理任务指令以及上传数据处理任务进度信息等。客户端程序的核心功能是执行数据处理任务,对计算机资源占用较多,应尽量选用性能较高的计算机。
计算机标识是计算机通信唯一的身份标识信息,主要为客户端与服务器端之间创建的唯一链接标识码信息。通信模块设计包括通信内容设计、信息编码规则设计和通信频次设计3个方面。
1)通信内容。为实现服务器端统一管理和调度客户端协同工作,服务器端与客户端程序之间的信息传递具有至关重要的作用。通信内容主要包括资源信息、任务信息和执行信息等,资源信息是客户端对服务器端上传的计算机资源信息,包括IP 地址、机器名、用户名和程序并行运行线程数量等;任务信息是服务器端对客户端分配下达数据处理任务,包括任务分配编号、调用的处理功能、数据输入的文件清单、输出的文件路径和其他运行参数的设置;执行信息是客户端对服务器端上传程序运行处理状态信息,包括任务分配编号、任务执行状态和数据输出情况等信息。
2)信息编码规则。服务器端与客户端通信是一对多的关系,且传递的信息包括多方面的内容,需要以一定的规则对传递的信息进行编码,以便服务器端与客户端之间的通信顺畅。传递的信息可划分为信息标识和信息内容两个部分,因此可按照“信息标识+信息内容”的规则进行编码和解码。信息标识是计算机间通信信息内容的类别标识信息,主要包括资源信息、任务信息和执行信息3 大类;信息内容是计算机间通信的具体内容,主要包括资源信息、任务信息和执行信息的详细内容,信息内容还可根据内部组成部分进一步细分,用特定的标识符进行链接。
(1) 菌悬液的制备。将供试菌金黄色葡萄球菌、枯草芽孢杆菌、大肠杆菌分别接种到斜面牛肉膏蛋白胨培养基上,再培养18~24 h,取出后使用5 mL无菌生理盐水洗出,稀释成质量浓度为1×107~1×108CFU/mL的菌悬液置于无菌操作室内备用。
3)通信频次。客户端与服务器端进行通信时,可根据通信内容设置不同的通信频次,以节省网络通信资源。资源信息通信可设置在客户端与服务器端建立链接或断开链接时触发,任务信息通信可设置在服务器端给客户端分配任务时触发,执行信息通信可设置在客户端每间隔一段时间给服务器端上传任务执行情况时触发。
首先在分析数据处理任务中各环节所需的计算机资源和处理时间的基础上,对可利用分布式处理方式提升生产效率的步骤进行汇总;然后有针对性地开发数据处理模块,并部署在客户端计算机上。处理模块需采用统一的调用接口,以便服务器端协调多个客户端同时执行数据处理任务。
为丰富程序分布式数据处理和管理能力,可从处理功能和信息内容两个方面提升程序的可扩展性。处理功能可根据生产任务的需要,开发采用统一调用接口可独立运行的程序或依赖于其他运行环境的程序。这些处理模块需提前部署在客户端计算机上,并确保能正确调用和运行。信息内容方面除核心传递信息外,可按照一定规则进行扩展,以提升服务器端的管理能力,如可扩展计算机内存使用、CPU使用、磁盘空间使用、机器运行耗时和数据处理量等信息。
程序可通过添加计划执行时间对数据处理任务进行规划,合理利用计算机资源。程序在处理大批量数据时,需考虑网络资源的负载情况,若数据处理过程中需占用大量网络资源,可在后台提前将数据拷贝到本机后处理,再将结果拷贝至指定的输出路径,避免长时间占用网络资源。服务器端下达处理任务的输入、输出路径参数需为联网计算机的统一访问路径,并注意这些文件或文件夹是否都有读写权限。在计算机资源允许的情况下,可在一台计算机启动多个客户端或在一个客户端启动多个线程进一步提升效率。
归一化植被指数(NDVI)能反映植被叶绿素、叶片水分含量等信息,被广泛应用于干旱监测中[6];归一化差分水体指数(NDWI)可有效抑制植被信息并突出水体信息,一般用于提取水体信息[7]。NDVI 和NDWI 的计算方法简单,是遥感影像信息解译最常用的技术手段。实验以NDVI 和NDWI 计算任务为例,首先根据上述程序设计思路分别开发服务器端和客户端,再分别开发NDVI 和NDWI 数据处理模块,最后对单机数据处理与分布式数据处理的执行效率进行对比分析,从而验证该技术方法的可行性和高效性。技术方法流程如图3所示。
图3 技术流程图
3.1.1 服务器端和客户端
1)服务器端程序的主要功能包括与客户端建立一对多的链接关系、显示客户端的链接情况、启动数据处理工作任务并将子项任务分发给多个客户端以及接收和显示每个客户端传送回来的子项任务执行情况。为了同时与多个客户端进行通信,需在服务器端创建一个Winsock 控件用于监听客户端链接请求,创建一个Winsock 控件数组用于与客户端建立一对多的链接关系。客户端与服务器端发起链接时,服务器端需先查找空闲的Winsock 控件,再接受请求建立链接,与多个客户端之间通过唯一链接标识码实现一对多通信。服务器端依照信息编码规则和通信频次设计方案,利用Winsock.SendData 编码发送信息,利用Winsock.GetData接收解码信息。客户端与服务器端链接断开时,采用Winsock.Close关闭链接。
服务器端程序界面如图4 所示,主要采用Win⁃sock、ListBox、ComboBox、TextBox、Timer 和Com⁃mandButton 等控件,其中Winsock 用于与客户端建立链接,接收计算机资源信息、任务执行信息和发送任务分配信息;ListBox用于存放输入文件路径清单、计算机工作群组资源和任务处理情况等信息;ComboBox用于选择任务需要执行的数据处理模块;TextBox 用于设置输出文件路径和任务名等;Timer 用于控制任务计划执行的时间;CommandButton 用于启动任务执行指令、清空文件列表和退出程序等。
图4 服务器端程序界面
2)客户端程序的主要功能包括与服务端建立一对一的链接关系、显示服务器端的链接情况、接收服务器端分发的子项数据处理任务、调用数据处理模块执行子项任务以及显示和发送子项任务的执行情况。一台计算机可同时启动多个客户端,通过与服务器端唯一的链接标识码进行区分,从而实现单机多线程数据处理。客户端同样需要依照信息编码规则和通信频次设计方案,利用Winsock.SendData 编码发送信息,利用Winsock.GetData接收解码信息,以保障客户端与服务器端的通信顺畅。客户端与服务器端链接断开时,采用Winsock.Close关闭链接。
客户端程序界面如图5 所示,主要采用Winsock、TextBox 和CommandButton 等控件,其中Winsock 用于与服务器端建立链接、发送本机资源信息、接收任务分配信息和上传任务执行情况;TextBox 用于设置服务器端IP地址,显示程序执行任务编号、任务内容和运行状态等信息;CommandButton 用于执行链接服务器端和退出程序等。
图5 客户端程序界面
3.1.2 处理模块
GDAL 是一个优秀的开源库,支持栅格数据和矢量数据的操作[8]。结合Python 数值计算扩展库NumPy,可实现栅格数据的高效运算[9]。NDVI和NDWI数据处理模块的开发和运行环境为GDAL-202-1500-core、GDAL-2.2.3.win32-py2.7、Python2.7.18和NumPy-1.6.6-cp27-cp27m-win32。
首先通过sys.argv[]函数获取外部输入和输出影像的路径参数;再利用gdal.Open()函数打开输入影像,利用GetRasterBand()函数分别获取绿、红和近红外波段数据,利用ReadAsArray().astype(numpy.float32)函数读取影像值;然后按照NDVI=(近红外波段-红光波段)/(近红外波段+红光波段)、NDWI=(绿光波段-近红外波段)/(绿光波段+近红外波段)分别计算NDVI 和NDWI 值[10];最后利用gdal.GetDriverByName("HFA").Creat()函数创建img 格式的输出影像文件,并利用GetRasterBand().WriteArray()函数将计算得到的数值写入输出影像文件中,如图6所示。
图6 处理模块开发流程图
该方法将栅格数据作为数学矩阵放入内存中进行矩阵计算,受计算机空闲内存大小的影响较大,栅格数据的分块粒度若太大将导致内存不足而运行失败,若太小则严重影响运行效率,因此实际应用中需根据计算机可使用内存大小选择合适的矩阵大小,以确保程序稳定高效运行。实验采用单线程、逐行影像矩阵的方式计算NDVI 和NDWI 值,以便更好地测试分布式数据处理的运行效率。
实验准备了一台工作站安装服务器端程序,4 台虚拟机安装部署客户端和运行环境,一台高性能存储服务器用于数据输入和计算结果输出。4 台虚拟机的硬件配置相同,均为英特尔至强E7-4830V2 处理器、32 GB 内存、Windows 操作系统、千兆网卡和千兆网络运行环境,与工作站和存储服务器之间互联互通。以20 幅10 269 像素×10 204 像素的多光谱影像为例,分别测试单机和多机分布式协同执行NDVI 和NDWI计算任务的耗时情况。
实验中单机作业模式设定为只利用4 台虚拟机中的一台,启动一个客户端与服务器端相连,模拟单机单任务单线程逐项执行数据处理任务;多机分布式协同作业模式设定为同时利用其中两台或4 台虚拟机,分别启动一个客户端与服务器端相连,模拟两台或4 台计算机单任务单线程逐项分工协同执行数据处理任务。
实验数据显示,4 台虚拟机虽然硬件配置一样,但因各自安装部署了与测试无关的软件,在一定程度上影响了程序执行效率。4 台虚拟机单机作业模式下的任务耗时为46~60 min,两台效率较高的虚拟机组合多机分布式协同作业模式下的任务耗时为26 min,两台效率较低的虚拟机组合多机分布式协同作业模式下的任务耗时为32 min,4 台虚拟机同时启动客户端模拟多机分布式协同作业模式下的任务耗时约为14 min,具体情况如表1 所示。结果表明,采用多机分布式协同处理技术后,NDVI和NDWI数据处理效率得到明显提升。
表1 程序执行耗时统计表/min
本文针对地理信息数据量快速增长带来的处理效率问题,从Winsock 通信技术入手,设计了一套基于Winsock 的分布式数据处理技术方法,然后按照程序设计思路开发了分布式数据处理程序,并以常用的遥感影像NDVI 和NDWI 计算为例,对开发的数据处理模块进行实验,验证了该套技术方法的可行性和高效性。
实验中未对数据处理算法进行优化,4 台虚拟机均只启动了一个客户端程序,未能充分利用计算机资源。若在处理模块内部加入分块多线程并行计算技术,或每台计算机同时启动多个客户端程序,亦或调用成熟商业软件数据处理模块,运行效率都将得到进一步提升。同时,服务器端程序还可增加文件定时扫描触发任务下达的功能,从而实现分布式数据处理的流程化和自动化。该项技术的开发难度较低,且具有较好的可扩展性。通过推广应用该项技术,可充分利用计算机硬件和网络运行环境资源,大幅提高数据处理效率,为今后大数据量数据处理提供了新思路。