CN103425795A - 一种基于云计算的雷达数据分析方法 - Google Patents
一种基于云计算的雷达数据分析方法 Download PDFInfo
- Publication number
- CN103425795A CN103425795A CN2013103899170A CN201310389917A CN103425795A CN 103425795 A CN103425795 A CN 103425795A CN 2013103899170 A CN2013103899170 A CN 2013103899170A CN 201310389917 A CN201310389917 A CN 201310389917A CN 103425795 A CN103425795 A CN 103425795A
- Authority
- CN
- China
- Prior art keywords
- data
- radar
- function
- flight path
- value
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Landscapes
- Radar Systems Or Details Thereof (AREA)
Abstract
一种基于云计算的雷达数据分析方法,涉及计算机应用技术领域。利用Sector/Sphere云平台存储雷达数据,通过并行处理来自空管记录设备记录的海量雷达数据,建立以时间为Key,其它所有内容为Value的Key/Value键值对,再经过分割,排序,归并,得出航迹信息后,进行告警计算,实现了雷达数据的高速处理与告警。本发明处理雷达数据,可以大幅减少处理时间;并且随着数据量的增加,时间优势越大。设计的MapReduce架构程序能够在大量的普通配置的计算机上实现并行化处理。测试的数据表明,所述方法处理来自空管记录设备ATC记录的海量雷达数据的处理时间为10~11秒,比传统处理时间缩短了3.4~3.6倍。为空管部门提供危险空域管制或对空域的规划设置提供重要依据,有着十分重要现实意义。
Description
技术领域
本发明涉及计算机应用技术领域,尤其涉及基于云计算中的雷达数据分析方法,可用于处理和分析海量雷达数据。
背景技术
在对海量雷达数据进行处理时,用云计算的方法进行处理,其处理时间随云计算平台节点的增加而下降。本发明运用云计算的方式,并行处理雷达数据,可以大幅减少处理时间。并且随着数据量的增加,时间优势越大。
本发明中提及的云计算平台是指Sector/Shpere。Sector/Shpere平台,是用C++语言搭建的高效云存储和云计算平台,它由分布式文件存储系统(Sector)和搭建在Sector之上的分布式计算系统(Sphere)组成。Sector/Sphere作者公布的论文实验数据显示,Sector/Sphere平台的计算速度是Hadoop平台的2~4倍,并且随平台节点的增加而优势更大。
Sphere是建立在Sector之上的分布式运算系统,它为用户提供了一套简单的接口,以便用户编写分布式应用程序。Sphere数据处理的工作方式是通过Shpere提供的接口加载用户自定义功能函数UDF(UDF:User-Defined Function)。用户在UDF中自定义功能函数。
自定义功能函数UDF运行在Sector/Shpere平台的master节点上。
Sphere系统接收一个数据集做为输入,将数据集划分为多个数据段,并将数据段分配给Shpere数据处理进程SPE(SPE:Sphere Processing Engine),生成最终结果。数据集可以是一个文件也可以是多个文件,一个SPE可以处理一个数据记录、一组数据记录、或者整个段。SPE的工作方式是加载用户自定义功能函数UDF(UDF:User DefinedFunction),根据UDF的具体功能函数处理相应数据。对于多核计算机,Shpere可以建立多个SPE,每一个SPE分配到一个核上实现集群并行和单机多核并行。与标准的MapReduce处理过程不同的是,Sphere不存在两个阶段的划分,数据处理过程统一为用户自定义功能阶段,前一个功能阶段的输出结果可以作为后一个功能阶段的输入,对数据集进行多次处理。将上述优势都应用在实践中是件很复杂挑战性很强的工作。
发明内容
本发明的目的提供一种基于云计算的雷达数据分析方法。即通过并行处理来自空管记录设备记录的海量雷达数据,建立以时间为Key,其它所有内容为Value的Key/Value键值对,再经过分割(partition),排序(compare),归并(reduce),得出航迹信息后,进行告警计算,以实现雷达数据的高速处理与告警。
实现本发明目的之技术解决方案如下:首先要建立一个动态库即用户自定义的功能函数UDF,在动态库中实现MapReduce的相关函数,并通过加载动态库的方式调用其中的MapReduce相关函数。通过并行解析空管(ATC)记录设备记录的海量雷达数据,解析出雷达数据后,建立以时间为Key,其它所有内容为Value的Key/Value键值对,再经过分割(partition),排序(compare),归并(reduce),实现雷达数据的高速处理。
在本发明中建立一个MapReduce的模型来进行雷达数据处理,使MapReduce架构的程序能够在大量的普通配置的计算机上实现并行化处理。
一种基于云计算的雷达数据分析方法,包括使用分布式文件存储系统/分布式计算系统(Sector/Sphere)云平台存储雷达数据,通过建立MapReduce模型以云计算的方式对雷达数据进行高速处理;尤其在主程序Master中通过传入参数指定被处理雷达数据的雷达类型以及Key/Value键值对的切分(Partition)和排序(Compare)方式、雷达对应的扫描周期,通过在主程序Master中加载动态库的方式,将雷达类型等参数传递至动态库的Map函数和Reduce函数中;在Map阶段,根据雷达类型确定雷达处理函数,将读取出来的雷达数据进行解析并保存在名为航迹信息链表m_target_track_list中,根据航迹信息链表m_target_track_list算出历史告警信息,再根据切分(Partition)和排序(Compare)的方式,进行Key/Value键值对的建立,后切分成不同数据块,排序之后,进行归并(Reduce);最终生成的结果,包括一个雷达解析数据,与其相对应的索引文件,索引文件中标识出每一条记录的起始位置和结束位置,以及所有告警计算文件及对应的索引文件。
所述主程序Master的运行步骤如下:(211)主函数,(212)登录Login();(213)检查是否登录成功,如果是Yes,进入下一步,如果是No,登录Logout()至退出Exit;(214)初始化输入数据集;(215)检查数据集是否存在于Sector中;如果是Yes,进入下一步,如果是No,登录Logout()至退出Exit;(216)指定输出目录;(217)加载用户自定义功能函数UDF;(218)检查加载是否成功,如果是Yes,进入下一步,如果是No,登录Logout()至退出Exit;执行用户自定义函数run_mr;(219)检查是否找到指定函数,如果是Yes,进入下一步,如果是No,登录Logout()至退出Exit;(230)检查Map阶段是否完成,如果未完成,返回上一步骤,如果执行成功,进入下一步;(231)检查Reduce阶段是否完成,如果未完成,返回上一步骤,如果Reduce执行成功,进入下一步;(232)登录Logout()至退出Exit()。
进一步地,所述根据雷达类型确定雷达处理函数的步骤如下:(311)输入原始雷达数据;(312)逐个字节读取雷达数据;(313)检查是否是雷达数据的起始标识符;如果是Yes,进入下一步,如果是No,返回到第一步骤;(314)读取一帧数据;(315)读取8个字节的时间;(316)读取第9和第10个字节所表示的数据长度;(317)将数据和数据长度传入解析函数;(318)检查是否CRC校验,如果是Yes,进入下一步,如果是No,进入结束步骤;(319)根据不同雷达类型做具体解析并返回至第一步骤。
进一步地,所述告警计算的步骤如下:(410)输入航迹信息链表m_target_track_list,数据长度、雷达扫描周期;(411)按照固定长度读取一条航迹信息;(412)检查是否到整个航迹信息链的结尾,如果是Yes,进入下一步,如果是No,返回到告警结果链表alertResult中至结束;(413)继续检查是否在同一个扫描周期内,如果是Yes,将这一条航迹数据压入到临时链表tmp_target_track_list内;如果是No,进入下一步;(414)从临时链表tmp_target_track_list取出同一周期的航迹数据进行告警计算;(415)将这一周期的告警结果插入到整个告警结果的尾部;(416)清空记录同一周期航迹数据的临时链表tmp_target_track_list,将这一条航迹数据压入到临时链表tmp_target_track_list内。
更进一步地,所述建立MapReduce模型的方式是首先在UDF中创建一个Map函数处理一个基于Key/Value pair的数据集合,输出中间的基于Key/Value pair的数据集合;然后再创建一个Reduce函数用来合并所有的具有相同key值的中间value值。
更进一步地,创建一个Map函数处理数据集合的步骤如下:(610)开始;(612)读取配置文件;(613)声明雷达类的对象并设置雷达类型;(614)检查是否打开Map函数的输入文件,如果是Yes,进入下一步,如果是No直至结束;(615)继续读取文件;(616)检查是否读到了文件尾,如果是Yes,进入下一步,如果是No,将原始数据传入雷达解析类进行解析并返回到上一步;(617)从雷达解析类中读取航迹信息;(618)检查是否读取到了航迹信息的结尾,如果是Yes,进入下一步骤,如果是No,返回上一步骤;(619)将航迹信息与时间组成Key/Value的形式,写入到输出结果中;(620)为每一个输出结果确定索引值并返回到(616)步骤。
更进一步地,创建一个Reduce函数用来合并所有的具有相同key值的中间value值的步骤如下:(710)开始;(711)设置雷达扫描周期;(712)声明告警Alert类的对象;(713)将Map解析出的Key/Value数据和雷达周期,传入到Alert类中的ProcKeyValueMsg()函数进行告警计算,并将告警结果存放在名为告警结果链表alertResult中;(714)将Readuce的输出结果的索引和行数初始化为0;(715)逐条读取告警结果;(716)检查是否是告警结果的结尾;如果是Yes,进入结束,如果是No,将告警结果写入到输出结果中;(717)为每一个输出结果确定索引值并返回到(715)步骤。
与已有技术比较,本发明具有显著的特点与积极效果,具体表现在:
1、测试的数据表明,本发明所述方法处理来自空管记录设备ATC记录的海量雷达数据的处理时间为10~11秒,比传统处理时间缩短了3.4~3.6倍。
2、通过本发明方法处理雷达记录数据,可检查一部雷达的数据中,有多少飞机在记录的时间里面有危险的接近即告警处理,在屏幕地图上显示出来,接近程度高的描绘为鲜艳的颜色,为空管部门提供相关危险空域管制或对空域的规划设置改进提供重要依据,有着十分重要现实意义。
3、采用MapReduce架构设计相关函数,使那些没有并行计算和分布式处理系统开发经验的程序员能有效利用分布式系统的丰富资源。
附图说明
图1为本发明所述Master结点的主程序流程框图示意图。
图2为本发明所述雷达数据处理基本流程框图示意图。
图3为本发明所述UDF中创建Map函数处理数据集合的流程框图示意图。
图4为本发明所述UDF中创建Reduce函数处理数据集合的流程框图示意图。
图5为本发明的实施例,告警计算的主流程框图示意图。
本发明中的数字与字母的含义:
Key/Value pai:Key/Value键值对;
m_target_track_list:航迹信息链表;
ProcKeyValueMsg:alert类中定义的主要函数之一;
alertResult:存放告警结果的容器即告警结果链表。
tmp_target_track_list:临时链表。
具体实施方式
Sphere运算平台是建立在Sector分布式文件系统之上的。进行云计算时,所读取的输入数据均取自分布式文件系统中,所以在进行计算之前,先要把雷达的原始数据存储在Sector上。可以放置在不同文件夹之下,输入时,指定目录即可形成一个数据集。
进行云计算时,要运用Shpere提供的接口:首先要建立一个程序,主要功能有:和Master建立连接,加载用户自定义函数,执行用户自定义函数,监视用户自定义函数的执行情况。
用户自定义函数中,在map函数里将读取出来的雷达数据解析出来形成key/valuepair,然后依次进行切分(partition),排序(compare),归并(reduce)。其中在进行排序时只需要实现compare函数,就可根据指定的比较规则来排序。
参见图1可知,所述主程序Master的运行步骤如下:(211)主函数,(212)登录Login();(213)检查是否登录成功,如果是Yes,进入下一步,如果是No,登录Logout()至退出Exit;(214)初始化输入数据集;(215)检查数据集是否存在于Sector中;如果是Yes,进入下一步,如果是No,登录Logout()至退出Exit;(216)指定输出目录;(217)加载用户自定义功能函数UDF;(218)检查加载是否成功,如果是Yes,进入下一步,如果是No,登录Logout()至退出Exit;执行用户自定义函数run_mr;(219)检查是否找到指定函数,如果是Yes,进入下一步,如果是No,登录Logout()至退出Exit;(230)检查Map阶段是否完成,如果未完成,返回上一步骤,如果执行成功,进入下一步;(231)检查Reduce阶段是否完成,如果未完成,返回上一步骤,如果Reduce执行成功,进入下一步;(232)登录Logout()至退出Exit()。更具体地讲,在任一可与Master结点通信的机器上建立一个主程序,通过Sphere提供的接口,进行云计算编程。使用Sphere的API接口之前要包含头文件"sector.h"。
a.与Master建立连接:
要指定Master结点的IP和端口。按以下方法进行连接并登录:
Sector client;
client.init(IP,PORT);
client.login("username","password");
b.初始化输入和输出:
每一个Sphere的程序都要指定输入参数和输出参数。
在输入中,需要指定一个输入数据集,这个数据集可以是由一个或多个目录组成,也可以是文件。如下所示:
c.加载用户自定义功能函数:
每一个Sphere的应用程序都必须有一个用户自定义函数(user defined function,UDF)。UDF是用户自定义的一个功能函数,把诸如map,reduce等函数都定义在这里面,并把它编译成动态库。
应用程序通过SphereProcess.loadOperator()来加载这个动态库。
d.启动Sphere t程序
当输入和输出参数都准备好,且已经成功加载了UDF,则Shpere应用程序可以通过SphereProcess.run()进行调用。
在上面的函数中,参数input和参数output分别是前面指定的输入和输出参数。参数op是要加载的UDF名称。row指定每次传递给UDF的记录的数量。当UDF有必要传入参数时,通过param和size传递。
e.读取运行结果和检查进度:
通过SphereProcess.read()来读取结果,通过SphereProcess.checkProgress()来检查进度。如果没有结果被返回时,可以通过调用SphereProcess.waitForCompletion();来等待进程的完成。
f.断开并退出系统:
当程序不需要再访问Sector时,应当注销该用户,并从系统断开。
client.logout();
client.close().
参见图2可知,所述根据雷达类型确定雷达处理函数的步骤如下:(311)输入原始雷达数据;(312)逐个字节读取雷达数据;(313)检查是否是雷达数据的起始标识符;如果是Yes,进入下一步,如果是No,返回到第一步骤;(314)读取一帧数据;(315)读取8个字节的时间;(316)读取第9和第10个字节所表示的数据长度;(317)将数据和数据长度传入解析函数;(318)检查是否CRC校验,如果是Yes,进入下一步,如果是No,进入结束步骤;(319)根据不同雷达类型做具体解析并返回至第一步骤。需要说明的是雷达数据处理函数中输入的是二进制数据,不同雷达具有不同的格式,导致每一个雷达类型都要有特定的解析类。为了使本模块能够被外部简单调用,我们建立了一个类以及基类CDataTrans,用于统一管理不同的雷达类型。
外部使用时通过设置雷达类型,再传入原始雷达数据,就可以解析成统一格式的雷达数据。通过这种简单的接口,我们在MapReduce中能够通过简单的调用即可实现不同雷达数据格式的解析。
关于基类CDataTran:不同的雷达类型对应不同的处理类。所有的雷达处理类都继承自基类CDataTrans。
在CDataTrans中定义了内部成员变量,用于存储从原始数据转换而来的数据:
public:
与以上成员变量相对应的是获取这些数据所需要的成员函数:
public:
除了定义了成员变量和获取成员变量的函数,还定义了三个纯虚接口:
public:
其中ProcRadarSrcMsg的功能是从外界传入原始雷达数据(包含一条或多条记录),再把原始数据按自身格式进行切分,使之成为以帧为单位的单条记录。再由ProcOneRadarMsg进行逐条地解析。
关于雷达数据解析类:
不同雷达类型其雷达源数据的格式也不一样,需要不同的类来进行处理。这里根据雷达的种类,定义了20种不同的类,下面以雷神雷达处理类(CDataTRans_Ray)为例进行说明。
CDataTRans_Ray公有继承自CDataTrans。主要处理流程就是基类CDataTrans所描述的过程:外界通过调用ProcRadarSrcMsg将原始雷达数据传入,这里的原始雷达数据可以是一个包含一帧或多帧、甚至包含不完整帧的unsigned char的字符串。在ProcRadarSrcMsg中,将原始数据按雷神雷达的数据格式,分成以帧为单位的数据。再传入到ProcOneRadarMsg中处理一帧的数据。
处理完成之后,将数据存储在航迹链、点迹链等链表中。
在ProcRadarSrcMsg中,根据每帧数据的起始标志来判断是否读到一帧数据,之后将数据依次读入到一个名为unsigned char tmpUnitRecord[iUnitLen]的中间字符串,直到再次读到一帧数据的起始标志,中间字符串中的元素即为一帧数据。此时从这一帧数据中读取出时间,存放在m_lastRadarTime中。将从这一帧数据中读取出帧数据的长度。去掉时间后,传入ProcOneRadarMsg(tmp+10,len)。比如在雷神雷达中,起始的标志为0xab,紧接着的7个字节存放的为时间存放在m_curRadarTime中,之后的两个字节表示长度。将这一帧第十个字节起至最后一个字节的数据传入到ProcOneRadarMsg进行解析。
关于ProcOneRadarMsg流程:
(一)首先进行奇偶校验,在每一帧数据的最后两个字节即为CRC校验码。
unsigned char CheckCRC(const unsigned char*message,int nBytes)Message为待验证的数据地址,nBytes含CRC码的数据长度。校验正确则返回true,校验错误则返回false。
(二)根据第三个字节来确定不同的报文种类。可分为单雷达目标报、雷达勤务报、综合雷达数据三种不同处理。
在雷达目标报中,根据雷达目标描述符来确定是航迹信息还是点迹信息:
1、航迹信息解析在ReadOneTrack(const unsigned char*buf,const unsignedchar FXNum,const unsigned char*endbuf,int&OnePlotLen)中,并将m_lastRadarTime中的时间写入到航迹信息中。得出完整的航迹信息后,存放在m_target_track_list中。
2、点迹信息解析在ReadOnePlot(const unsigned char*buf,const unsigned charFXNum,const unsigned char*endbuf,int&OnePlotLen)中,并将m_lastRadarTime中的时间写入到航迹信息中。得出完整的航迹信息后,存放在m_target_plot_list中。
在雷达勤务报中,通过ReadStatus(const unsigned char*buf,const unsignedchar FXNum,const unsigned char*endbuf,int&OneStatusLen)中解析。
在综合雷达数据中,通过ReadOneSysTrack(const unsigned char*buf,constunsigned char FXNum,const unsigned char*endbuf,int&OneTrackLen)中解析。并存储在m_target_track_list。
关于统一管理类设计:
定义一个统一管理所有雷达类型的类(Radar),这个类通过设置雷达类型,再传入数据,即可实现对不同数据类型的解析。
定义私有成员:
定义公有成员函数:
①void setRadarType(const int i);
定义了Radar对象后,首先设置雷达类型。
②void ProcRadarSrcMsg(const unsigned char*Msg,const int iTotalLen);完成雷达类型的设置后,即可传入原始雷达数据。Msg为原始雷达数据,iTotalLen为长度。在本函数中,通过雷达类型(m_iRadarType)来确定具体调用哪个雷达解析类。
③以下是直接获取解析出来的
参见图5可知,提供了本发明的一个实施例,告警计算的主流程框图示意图。所述告警计算的步骤如下:
(410)输入航迹信息链表m_target_track_list,数据长度、雷达扫描周期;(411)按照固定长度读取一条航迹信息;(412)检查是否到整个航迹信息链的结尾,如果是Yes,进入下一步,如果是No,返回到整个告警结果链表alertResult中至结束;(413)继续检查是否在同一个扫描周期内,如果是Yes,将这一条航迹数据压入到临时链表tmp-_tarket_track_list内;如果是No,进入下一步;(414)取出同一周期的航迹数据进行告警计算;(415)将这一周期的告警结果插入到整个告警结果的尾部;(416)清空记录同一周期航迹数据的临时链表tmp_tarket_tract_list,将这一条航迹数据压入到临时链表tmp_tarket_track_list内。
需要说明的告警计算函数:
从原始雷达数据处理得出航迹信息后,即可进行告警计算,最终得到告警结果。为了便于使用,同时也为了便于扩展和完善告警的计算方法,这里定义了一个名为Alert的类,提供一个ProcKeyValueMsg()的函数用于计算告警信息。使用时,只需要传入航迹信息链表m_target_track_list即可得到计算后的告警信息,并将告警信息组织成一个链表的形式输出。
类中的主要函数为:
void ProcKeyValueMsg(const char*kvMsg,int len,long long iCycle,vector<AlertResult>&vecAlert)
kvMsg为Map的输出结果。是由Key/Value组成的所有航迹信息。其中Key为自定义格式时间,Value为具体航迹信息;
len为整个航迹信息的长度;
iCycle为雷达的扫描周期;
vecAlert用于存储整个告警结果,作为给外部的返回值。
本函数的功能就是将Key/Value形式的航迹信息按雷达的扫描周期划分成以周期为单位的航迹链。再将这些航迹链按顺序传入到告警计算的类中。这里告警计算的方法就是通用的非分布式的告警计算方法。
参见图3、图4可知,在Sector/Sphere中进行云计算,要建立一个动态库即前面所说的UDF,在动态库中实现MapReduce的相关函数,并通过加载动态库的方式调用其中的MapReduce相关函数。
在UDF中建立MapReduce计算模型,就要编写Map函数和Reduce函数。建立MapReduce模型的方式是首先在UDF中创建一个Map函数处理一个基于Key/Value pair的数据集合,输出中间的基于Key/Value pair的数据集合;然后再创建一个Reduce函数用来合并所有的具有相同key值的中间value值。
创建一个Map函数处理数据集合的步骤如下:(610)开始;(612)读取配置文件;(613)声明雷达类的对象并设置雷达类型;(614)检查是否打开Map函数的输入文件,如果是Yes,进入下一步,如果是No直至结束;(615)继续读取文件;(616)检查是否读到了文件尾,如果是Yes,进入下一步,如果是No,将原始数据传入雷达解析类进行解析并返回到上一步;(617)从雷达解析类中读取航迹信息;(618)检查是否读取到了航迹信息的结尾,如果是Yes,进入下一步骤,如果是No,返回上一步骤;(619)将航迹信息与时间组成Key/Value的形式,写入到输出结果中;(620)为每一个输出结果确定索引值并返回到(616)步骤。
创建一个Reduce函数用来合并所有的具有相同key值的中间value值的步骤如下:(710)开始;(711)设置雷达扫描周期;(712)声明告警Alert类的对象;(713)将Map解析出的Key/Value数据和雷达周期,传入到Alert类中的ProcKeyValueMsg()函数进行告警计算,并将告警结果存放在名为告警结果alertResult的链表中;(714)将Readuce的输出结果的索引和行数初始化为0;(715)逐条读取告警结果;(716)检查是否是告警结果的结尾;如果是Yes,进入结束,如果是No,将告警结果写入到输出结果中;(717)为每一个输出结果确定索引值并返回到(715)步骤。
另外还需要对MapReduce中的partition和sort过程中的函数进行自定义,而这两个函数在Hadoop中是默认已经存在的。下面是MapReduce中partition和sort的过程:
在整个处理流程中,将整个数据集划分成数个数据块,在Sectro/Spher中数据块的划分是由用户指定,即存储在sector上是多少个文件,就认为是多少个数据块。每一个数据块分配一个Map函数。在Map函数中,主要将源数据读入内存后将之组织成Key/Value的形式,再读入配置文件,按其中的切分和排序方式将时间做为Key值或者将飞机呼号做为Key值,将具体数据做为Value。若将时间做为Key值,则之后也按时间排序,经过reduce之后,就会形成以时间为序的结果文件。若以飞机呼号为Key值,则排序也按呼号进行排序,经过reduce之后,则相同飞机呼号的数据就会存放在同一个结果文件中。
file存放的是sector文件系统的一些基本信息。这里将会用到的是std::stringm_strHomeDir这个变量,它的意思是Sector文件系统中数据所在的本地路径。SInput中m_pcUnit存放的是相对于Sector文件系统所在的路径。加上SFile中的m_strHomeDir即可得到文件所在本地文件系统的完整路径。
关于map函数流程的说明:
第一步、读取配置文件:
由于不同雷达类型具有不同的数据格式,解析时要根据雷达类型来确定解析格式,所以在解析之前先要指定雷达类型。且解析后的数据根据需要可以有不同的切人分和排序方式,形成不同的结果。代码如下:
其中file->m_strHomeDir即为Sector文件系统中数据所在的本地路径,加上iniPath这个相对于Sector文件系统的路径,即可得到一个完整的本地路径。用于读取文件中的数据。
CIniFile是一个读取文件和类。通过设置文件路径,指定区域和关键字,即可读取到相应内容。此处配置文件(radarIni.ini)形式如下:
其中RadarType即为区域,type即为关键字,cycleTime为对应雷达的扫描周期。通过指定这两个参数,便能将type的值读取到程序中。
这里设定雷达类型为Ray(14),切分的排序类型为按时间。
第二步、声明Radar类对象,并设置雷达类型:
Radar radar;//用于记录和处理解析的雷达数据
radar.setRadarType(g_radarType);
第三步、打开指定数据集中的其中一块数据,读入后,进行解析,主要步骤如下:
string inputfile=file->m_strHomeDir+input->m_pcUnit;
ifstream ifs(inputfile.c_str(),ios::in|ios::binary);
file->m_strHomeDir即为Sector文件系统中数据所在的本地路径,input->m_pcUnit为当前Map函数正在处理的数据块的路径(相对于Sector文件系统中的路径)。通过二进制只读的方式打开。
以下是读取数据,并将数据传入雷达解析类中进行解析:
其中BUFFLEN为一个宏,定义了最大读取长度。
radar.ProcRadarSrcMsg(buffer,BUFFLEN)将雷达原始数据传入雷达解析的统一管理类(Radar),在统一管理类(Radar)中根据前面指定的雷达类型,在相应的雷达解析类中进行解析。
第四步、根据不同的切分、排序方式,构建Key/Value,这里以按时间构建Key值为例进行说明:
根据g_sortType来确定切分、排序方式。
当按时间来进行切分排序时,过程如下:
首先判断各链表是否为空,比如判断航迹链是否为空:
if(radar.GetTrackListSize()>0)
然后处理当前Map中解析出来的航迹链的信息。通过循环遍历每一条航迹信息,然后逐条处理。对每一条航迹信息的处理方法如下:
A.将航迹信息转换成一个结构体,用于存储,也便于使用我们的处理结果。这个结构体定义在commontype.h中,数据项增加一个标志信息位,用于标志数据类型,其它数据项和航迹类(CTarget_Track)一一对应。
TargetTrackData tmpStruct;
ClassToStruct(*itr,1,tmpStruct);//类型为1,航迹链
通过一一对应的赋值操作,完成从类转换成结构体。
B.构建Key/Value:建立临时数组item,用于存储Key/Value。
在item中,前8个字节分别用于存储年月日时分秒毫秒(单位是10ms)。其中年由两个字节表示,第一个字节存储的是年份的高8位,第二个字节存储的是低8位。如sprintf(item,"%c%c%c%c%c%c%c%c",tmpStruct.radarTime.iYear/256,tmpStruct.radarTime.iYear%256,......);
另外,此处的毫秒存储的是毫秒的单位是10ms,所以一个字节足以存放。
完成时间的赋值后,后接一个空格,用于区分Key和Value的值。再将Value的值接到item之后。
memcpy(item+9,(void*)&tmpStruct,iUnitLen);
即形成了以时间为Key值,以空格隔开,航迹数据为Value值的一条记录。
C.将记录存入在output中:
其中iUnitLen是整条记录的有效数据的长度。将结果存放在output->m_pcResult中,存放的位置为output->m_pcResult+output->m_pllIndex[output->m_iRows]。其中output->m_iRows为结果中已经存在的记录的个数,output->m_pllIndex[output->m_iRows]为已存在的记录的总长度。当前记录接在其后。
将当前记录存放在输出结果中之后,将记录数加1,并给记录长度的索引赋予新的值。至此航迹信息在Map中的处理已完成。
依上所述的方式,即可完成对点迹信息,气象信息等的处理。
当按飞机呼号来切分排序的时:
具体步骤和按时间的方式一样,唯一有区别的就是Key值的构建。
按飞机呼号时,Key值存储的是飞机呼号,用9个字节完成存储。Value值的构建同按时间切分、排序的方式一样,同样存储的是全部的信息(如航迹信息、点迹信息等)。
完成以上步骤之后,即已完成了Map函数的设计。
关于partition函数的说明:
int mr_radar_partition(const char*record,int size,void*param,int psize)
record为一条记录的指针,size为这条记录的长度。param,psize分别是参数及参数长度,不常用。
函数实现:
在本函数中,根据切分、排序方式来确定执行函数。
按时间切分时:
调用compareByTime(r1,s1,r2,s2),并直接返回其返回值。
这里按时间区间来划分,比如可以将同一天的数据划分在一起,或者数据的时间跨度较小时,可以将同一小时的数据划分在一起。
我们以小时切分、排序为例。代码如下:
这里的返回值就是我们想把当前记录放入到的桶ID(数据块ID),按这个方法算出来的ID会形如12030408,其中12取的是年的后两位,03表示月,04表示日,08表示时(24小时制)。
给记录指定了桶ID之后,Shpere就会把相同Id的记录放在一起,供接下来进行排序操作。
关于compare函数的说明:
int mr_radar_compare(const char*r1,int s1,const char*r2,int s2)
r1,r2表示记录1和记录2,s1,s2分别表示r1、r2的长度。返回值大于0,等于0,或小于0。
我们按时间进行切分、排序:
关于reduce函数的说明:
int mr_radar_reduce(const SInput*input,SOutput*output,SFile*file)这里的三个参数和map中的三个参数完全一样,经过map、partition、sort之后形成的数据做为reduce的输入数据,输出数据则直接会写入到结果文件中,即直接写入到Sector文件系统中,形成最终的结果。
此处用于存放告警结果的结构体定义如下:
函数流程说明:
第一步,声明一个告警的的对象,和一个Vector窗口用于存放告警结果。
Alert alert;
vector<AlertResult>alertResult;//告警结果
第二步,直接将输入数据传入到告警类中进行处理。
alert.ProcKeyValueMsg(input->m_pcUnit,input->m_pllIndex[input->m_iRows],g_cycleTime,alertResult);
这里的input->m_pcUnit,是从Map经过排序之后形成的Key/Value形式的航迹数据。是所有航迹数据的集合。
input->m_pllIndex[input->m_iRows]是Map输出的索引文件,表示整个航迹信息的长度。
g_cycleTime是从配置文件中读取出来的雷达扫描周期。
alertResult是用于存放告警结果的容器即链表,以引用的方式传递于ProcKeyValueMsg()函数中。
第三步,循环读取告警结果。
通过容器的迭代器循环读取告警结果,循环体中的内容如下:
这里第一句中的iRecordLen是存放告警结果的结构体的长度。将每一条告警结果直接存放在输出文件中。
后面这两句是分别是将输出文件的行号累加,以及为每一行建立索引。
最终输出的就是一个存放了所有告警结果的二进制文件及对应的索引文件,以struct AlertResult结构体的格式就能解析出来。
本发明的试验测试在实际运行环境为4台安装REDHAT linux企业版5.4的主机作为计算节点运行。每台主机为4核;Intel Xeon(R)CPU为E5620,2.4GHz;以其中测试的数据表明,两部不同的雷达各两小时的数据以每个小时一个文件为例,分别大小为5.76M和6.54M,在sector的环境下,4小时的数据,处理时间为10-11秒,而在传统的单机模式下,处理时间为34-40秒。
Claims (7)
1.一种基于云计算的雷达数据分析方法,包括使用分布式文件存储系统/分布式计算系统(Sector/Sphere)云平台存储雷达数据,通过建立MapReduce模型以云计算的方式对雷达数据进行高速处理;其特征是,在主程序Master中通过传入参数指定被处理雷达数据的雷达类型以及Key/Value的切分(Partition)和排序(Compare)方式、雷达对应的扫描周期,通过在主程序Master中加载动态库的方式,将雷达类型及参数传递至动态库的Map函数和Reduce函数中;在Map阶段,根据雷达类型确定雷达处理函数,将读取出来的雷达数据进行解析并保存在名为航迹信息链表m_target_track_list中,根据航迹信息链表m_target_track_list计算出历史告警信息,再根据切分(Partition)和排序(Compare)的方式,进行Key/Value键值对的建立,后切分成不同数据块,排序之后,进行归并(Reduce);最终生成的结果,包括一个雷达解析数据,与其相对应的索引文件,索引文件中标识出每一条记录的起始位置和结束位置,以及所有告警计算文件及对应的索引文件。
2.根据权利要求1所述的一种基于云计算的雷达数据分析方法,其特征是,所述主程序Master的运行步骤如下:
(211)主函数;(212)登录Login();(213)检查是否登录成功,如果是Yes,进入下一步,如果是No,登录Logout()至退出Exit;(214)初始化输入数据集;(215)检查数据集是否存在于Sector中;如果是Yes,进入下一步,如果是No,登录Logout()至退出Exit;(216)指定输出目录;(217)加载用户自定义功能函数UDF;(218)检查加载是否成功,如果是Yes,进入下一步,如果是No,登录Logout()至退出Exit;执行用户自定义函数run_mr;(219)检查是否找到指定函数,如果是Yes,进入下一步,如果是No,登录Logout()至退出Exit;(230)检查Map阶段是否完成,如果未完成,返回上一步骤,如果执行成功,进入下一步;(231)检查Reduce阶段是否完成,如果未完成,返回上一步骤,如果Reduce执行成功,进入下一步;(232)登录Logout()至退出Exit()。
3.根据权利要求1所述的一种基于云计算的雷达数据分析方法,其特征是,所述根据雷达类型确定雷达处理函数的步骤如下:
(311)输入原始雷达数据;(312)逐个字节读取雷达数据;(313)检查是否是雷达数据的起始标识符;如果是Yes,进入下一步,如果是No,返回到第一步骤;(314)读取一帧数据;(315)读取8个字节的时间;(316)读取第9和第10个字节所表示的数据长度;(317)将数据和数据长度传入解析函数;(318)检查是否CRC校验,如果是Yes,进入下一步,如果是No,进入结束步骤;(319)根据不同雷达类型做具体解析并返回至第一步骤。
4.根据权利要求1所述的一种基于云计算的雷达数据分析方法,其特征是,所述告警计算的步骤如下:
(410)输入航迹信息链表m_target_track_list,数据长度、雷达扫描周期;(411)按照固定长度读取一条航迹信息;(412)检查是否到整个航迹信息链的结尾,如果是Yes,进入下一步,如果是No,返回到告警结果链表alertResult中至结束;(413)继续检查是否在同一个扫描周期内,如果是Yes,将这一条航迹数据压入到临时链表tmp_track_list内;如果是No,进入下一步;(414)从临时链表tmp_track_lis取出同一周期的航迹数据进行告警计算;(415)将这一周期的告警结果插入到整个告警结果的尾部;(416)清空记录同一周期航迹数据的临时链表tmp_track_list,将这一条航迹数据压入到临时链表tmp_track_list内。
5.根据权利要求1所述的一种基于云计算的雷达数据分析方法,其特征是,所述建立MapReduce模型的方式是首先创建一个Map函数处理一个基于Key/Value pair的数据集合,输出中间的基于Key/Value pair的数据集合;然后再创建一个Reduce函数用来合并所有的具有相同key值的中间value值。
6.根据权利要求5所述的一种基于云计算的雷达数据分析方法,其特征是,创建一个Map函数处理数据集合的步骤如下:
(610)开始;(612)读取配置文件;(613)声明雷达类的对象并设置雷达类型;(614)检查是否打开Map函数的输入文件,如果是Yes,进入下一步,如果是No直至结束;(615)继续读取文件;(616)检查是否读到了文件尾,如果是Yes,进入下一步,如果是No,将原始数据传入雷达解析类进行解析并返回到上一步;(617)从雷达解析类中读取航迹信息;(618)检查是否读取到了航迹信息的结尾,如果是Yes,进入下一步骤,如果是No,返回上一步骤;(619)将航迹信息与时间组成Key/Value的形式,写入到输出结果中;(620)为每一个输出结果确定索引值并返回到(616)步骤。
7.根据权利要求5所述的一种基于云计算的雷达数据分析方法,其特征是,创建一个Reduce函数用来合并所有的具有相同key值的中间value值的步骤如下:
(710)开始;(711)设置雷达扫描周期;(712)声明告警Alert类的对象;(713) 将Map解析出的Key/Value数据和雷达周期,传入到Alert类中的ProcKeyValueMsg()函数进行告警计算,并将告警结果存放在名为告警结果链表alertResult中;(714)将Readuce的输出结果的索引和行数初始化为0;(715)逐条读取告警结果;(716)检查是否是告警结果的结尾;如果是Yes,进入结束,如果是No,将告警结果写入到输出结果中;(717)为每一个输出结果确定索引值并返回到(715)步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310389917.0A CN103425795B (zh) | 2013-08-31 | 2013-08-31 | 一种基于云计算的雷达数据分析方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310389917.0A CN103425795B (zh) | 2013-08-31 | 2013-08-31 | 一种基于云计算的雷达数据分析方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103425795A true CN103425795A (zh) | 2013-12-04 |
CN103425795B CN103425795B (zh) | 2016-09-21 |
Family
ID=49650532
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310389917.0A Active CN103425795B (zh) | 2013-08-31 | 2013-08-31 | 一种基于云计算的雷达数据分析方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103425795B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104853061A (zh) * | 2015-05-05 | 2015-08-19 | 中国人民解放军国防科学技术大学 | 一种基于Hadoop的视频处理方法及系统 |
CN106250323A (zh) * | 2016-07-27 | 2016-12-21 | 陕西黄河集团有限公司 | 利用动态链表实现内存实时分配方法 |
WO2019085780A1 (zh) * | 2017-10-31 | 2019-05-09 | 阿里巴巴集团控股有限公司 | 一种云存储系统及用于云存储系统中实现自定义数据处理的方法 |
CN110990655A (zh) * | 2019-12-23 | 2020-04-10 | 国网黑龙江省电力有限公司 | 一种电力系统电网告警数据的过滤方法 |
CN115617495A (zh) * | 2022-12-06 | 2023-01-17 | 深圳安德空间技术有限公司 | 一种基于分布式架构的探地雷达数据推理方法及其系统 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120182891A1 (en) * | 2011-01-19 | 2012-07-19 | Youngseok Lee | Packet analysis system and method using hadoop based parallel computation |
CN103150163A (zh) * | 2013-03-01 | 2013-06-12 | 南京理工大学常熟研究院有限公司 | 一种基于MapReduce模型的并行关联方法 |
-
2013
- 2013-08-31 CN CN201310389917.0A patent/CN103425795B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120182891A1 (en) * | 2011-01-19 | 2012-07-19 | Youngseok Lee | Packet analysis system and method using hadoop based parallel computation |
CN103150163A (zh) * | 2013-03-01 | 2013-06-12 | 南京理工大学常熟研究院有限公司 | 一种基于MapReduce模型的并行关联方法 |
Non-Patent Citations (2)
Title |
---|
YUNHONG GU 等: "Toward Efficient and Simplified Distributed Data Intensive Computing", 《IEEE TRANSACTIONS ON PARALLEL AND DISTRIBUTED SYSTEMS》 * |
刘敏 等: "空管系统中内存数据库的设计与实现", 《计算机工程》 * |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104853061A (zh) * | 2015-05-05 | 2015-08-19 | 中国人民解放军国防科学技术大学 | 一种基于Hadoop的视频处理方法及系统 |
CN104853061B (zh) * | 2015-05-05 | 2016-06-01 | 中国人民解放军国防科学技术大学 | 一种基于Hadoop的视频处理方法及系统 |
CN106250323A (zh) * | 2016-07-27 | 2016-12-21 | 陕西黄河集团有限公司 | 利用动态链表实现内存实时分配方法 |
CN106250323B (zh) * | 2016-07-27 | 2019-04-19 | 陕西黄河集团有限公司 | 利用动态链表实现内存实时分配方法 |
WO2019085780A1 (zh) * | 2017-10-31 | 2019-05-09 | 阿里巴巴集团控股有限公司 | 一种云存储系统及用于云存储系统中实现自定义数据处理的方法 |
CN110990655A (zh) * | 2019-12-23 | 2020-04-10 | 国网黑龙江省电力有限公司 | 一种电力系统电网告警数据的过滤方法 |
CN115617495A (zh) * | 2022-12-06 | 2023-01-17 | 深圳安德空间技术有限公司 | 一种基于分布式架构的探地雷达数据推理方法及其系统 |
Also Published As
Publication number | Publication date |
---|---|
CN103425795B (zh) | 2016-09-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Camargo et al. | Automated discovery of business process simulation models from event logs | |
EP3367234B1 (en) | Systems and methods for arbitrary software logic modeling | |
CN107273286B (zh) | 针对任务应用的场景自动化测试平台及方法 | |
CN109344056B (zh) | 一种测试方法以及测试装置 | |
CN107704234B (zh) | 前端工程构建方法、装置、电子设备及可读存储介质 | |
Benelallam et al. | Distributed model-to-model transformation with ATL on MapReduce | |
CN104699613B (zh) | 一种航天器测试需求自动生成系统及其方法 | |
CN103425795B (zh) | 一种基于云计算的雷达数据分析方法 | |
CN107451068A (zh) | 用例运行方法、装置、计算设备及存储介质 | |
CN103412853A (zh) | 一种针对文档转换器的测试用例自动生成方法 | |
CN112394942A (zh) | 基于云计算的分布式软件开发编译方法及软件开发平台 | |
US8775392B1 (en) | Revision control and configuration management | |
CN111708760B (zh) | 模型迁移部署方法、装置、电子设备及存储介质 | |
CN103235757B (zh) | 基于自动化造数对输入域测试对象进行测试的装置和方法 | |
US10146530B1 (en) | Simulating and evaluating code branch merge | |
CN105824647A (zh) | 一种表单页面生成方法和装置 | |
CN109992495A (zh) | 接口测试的方法和装置 | |
CN117370203B (zh) | 自动化测试方法、系统、电子设备及存储介质 | |
CN114721932A (zh) | 一种数据处理方法、装置、设备及存储介质 | |
CN113032256A (zh) | 自动化测试方法、装置、计算机系统和可读存储介质 | |
CN108829903A (zh) | 判定fpga冗余设计的代码与综合后电路一致性的方法和系统 | |
CN115033691A (zh) | 文本段识别模型的训练、文本段识别方法、设备及介质 | |
CN115169578A (zh) | 一种基于元宇宙数据标记的ai模型生产方法及系统 | |
Huang et al. | Research on intelligent cloud test platform | |
EP3113038B1 (en) | A data handling method |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |