2017-07-05 10:48:35 pch1982cn 阅读数 533
  • 系统架构师之Java虚拟机、OSGi—JVM性能架构项目实战...

    本课程主要是针对java的中、开发,主要面向于java的中开发人员,在了解java一定知识点的前提下更容易对本课程做到详细的学习,在讲课过程中也会涉及到一些基本的基础知识点从而来更好的学习本课程。由于目前的一些电力企业以及气象方面对于系统性能优化要求相当高,本课程就针对目前企业公司大量的涉及到了java系统性能优化以及深入的讲解,本课程主要特点就是,高效性、针对性、实用性、深入性。

    2646 人正在学习 去看看 张勇

上一篇文章详细介绍了如何从NCEP网站下载GFS数据,有了这个基础就可以开发基于Linux的shell脚本以及对应的API程序以实现查询功能了。

1、Shell脚本开发

Shell脚本主要是为了实现以下功能:
1)查看服务器目前最新的日期是哪个。
2)下载日期对应的文件。
3)创建对应的表。
4)通过wgrib2装载数据到表中。

代码如下:
#!/bin/sh

MTH=`date +%Y%m`

if [ $# -lt 1 ]; then 
  DIRNAME=`curl -l -s ftp://ftp.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/ | grep gfs.${MTH} | tail -n 1`
else
  DIRNAME=$1
fi

echo `date` 'GFS Extract Script Started' 

# Found the directory to be downloaded
cd /u01/wgrib2
echo 'Found directory:' ${DIRNAME}
rm -rf gfs/${DIRNAME}
mkdir gfs/${DIRNAME}

HR=`echo ${DIRNAME} | awk '{print substr($0,13,2)}'`
echo 'Runtime Hour:' ${HR}

echo `date` 'Downloading pgrb2 files...'

# Download files
FILELIST=`curl -l -s ftp://ftp.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/${DIRNAME}/ | grep gfs.t${HR}z.pgrb2.0p25.f | grep -v idx`
echo ${FILELIST} | awk '{split($0,a," ");for(i in a) print a[i]}' | while read FILE
do
  echo `date` 'Downloading' ${FILE}
  curl -s -o gfs/${DIRNAME}/${FILE} 'http://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl?file='${FILE}'&all_lev=on&var_PWAT=on&subregion=&leftlon=73&rightlon=136&toplat=54&bottomlat=18&dir=%2F'${DIRNAME}
done

# Create table
TBNAME=`echo ${DIRNAME} | awk '{print "t_"substr($0,1,3)"_"substr($0,5,10)}'`
/alidata/server/mysql/bin/mysql -hlocalhost -uroot -proot -e "
use wgrib2
drop table if exists ${TBNAME};
create table ${TBNAME} (rt datetime, vt datetime, lat double, lon double, param varchar(80), level varchar(30), value double); 
quit"

# Run wgrib2
rm -f gfs/${DIRNAME}/*.idx 
for FILE in gfs/${DIRNAME}/*
do
  if test -f ${FILE}
  then
    echo `date` 'Loading' ${FILE}
    grib2/wgrib2/wgrib2 ${FILE} -if ":PWAT" -mysql localhost root root wgrib2 ${TBNAME}
  fi
done

# Optimatize table
/alidata/server/mysql/bin/mysql -hlocalhost -uroot -proot -e "
use wgrib2
alter table ${TBNAME} drop column level;
alter table ${TBNAME} drop column rt;
alter table ${TBNAME} drop column param;
create index ${TBNAME}_idx1 on ${TBNAME} (vt,lat,lon); 
quit"

# Clean up tmp files
rm -f wgrib2_mysql*

echo `date` 'GFS Extract Script Finished'

2、自动运行

有了shell脚本后,就可以在服务器上设置cron进行自动运行了。
根据项目需要,这俩设置的是每天运行4次,分别在北京时间1:30, 7:30, 13:30和19:30运行。

30 1 * * * /u01/wgrib2/extract.sh >> /u01/wgrib2/extract.log
30 7 * * * /u01/wgrib2/extract.sh >> /u01/wgrib2/extract.log
30 13 * * * /u01/wgrib2/extract.sh >> /u01/wgrib2/extract.log
30 19 * * * /u01/wgrib2/extract.sh >> /u01/wgrib2/extract.log

据观察,每次大约运行需要10分钟,基本可以保证在北京时间2时、8时、14时、20时数据可用。



                                
2012-01-13 16:51:56 bjbj123123 阅读数 381
  • 系统架构师之Java虚拟机、OSGi—JVM性能架构项目实战...

    本课程主要是针对java的中、开发,主要面向于java的中开发人员,在了解java一定知识点的前提下更容易对本课程做到详细的学习,在讲课过程中也会涉及到一些基本的基础知识点从而来更好的学习本课程。由于目前的一些电力企业以及气象方面对于系统性能优化要求相当高,本课程就针对目前企业公司大量的涉及到了java系统性能优化以及深入的讲解,本课程主要特点就是,高效性、针对性、实用性、深入性。

    2646 人正在学习 去看看 张勇

 

气象无线智能监测
一、气象无线智能监测用户需求
以气象监测行业为例:某省气象局气象信息的采集由各气象观测站利用气象采集设备自动完成采集,通过DDN或者电话线向气象中心传送气象数据,气象局利用气象信息处理程序对各气象观测站采集的气象数据进行加工处理和分析,进而可对短期的降雨和中期降水进行预报,并通过防汛系统向防汛办报送资料,gprs,为洪水预报和防汛提供可靠的决策支持。
目前,某省气象局现已在全省范围内建立了300多个气象观测信息采集点,各气象采集点按照设定的时间间隔采集区域内的各种气象信息资料,包括温度、气压、湿度等,测量结果通过DDN或者PSTN电话线向气象中心传送气象数据。采用DDN可充分保证数据传输畅通,完整,但缺点是月租费太高;采用PSTN电话线传输数据,按时间计费,费用也不便宜。
目前,该省气象局正考虑建立GPRS气象信息采集数据传输系统试点。在试点中选择20多个气象采集点,采用GPRS无线数据通信方式传输气象资料。在试点中,各气象采集点通过GRPS与中心站主机保持实时连接,自动观测设备将获得的气象信息通过GPRS传给气象中心主机,气象中心主机对信息进行处理,形成气象预报信息。
二、气象无线智能监测需求分析
1、现场环境特点:无任何电源供电,www.ehangxing.com
2、前端设备环境适应性:-20℃~+70
3、防爆等级要求:Ex-dⅡBT4;
4、防爆区域:
5、供电系统:采用太阳能+铅酸电池供电,由传输设备供应商提供;
6、设计容量依据:太阳能考虑连续***天无阳光、下雨;
7、数传接口:0-5V、4-20mA、RS-232、RS-485等接口(ModBus协议);
8、数传字节长度:小于***字节(含协议头,估算值);
9、数采周期:常态1次/h,1天24次;
10、数传周期:常态1次/h,1天24次;
11、无线传输方式:GPRS(实时性好,耗电量稍大);
希望GPRS数据中心服务器与现有系统数据服务有效融合。
三、气象无线智能监测系统介绍

 


 

 

1、气象信息采集点:采用北京航星网讯技术股份有限公司的GPRS透明无线数据传输终端,通过RS232/RS485/TTL与气象设备采集点连接,接入移动公司为气象局提供的专用的GPRS网络,网络对气象信息采集点的接入地点、时间、数量没有限制可以随时增减。可以满足山区、偏远地区和跨地区接入的需求。
2、气象中心站:本系统中网络代理服务器可采用ADSL、LAN等INTELNET公网连接,采用公网固定IP, GPRS数据传输终端上电后,它会根据预先设定在其内部的IP地址来主动访问网络代理服务器,通过代理服务器和监控中心建立TCP/IP链路。监控中心主站本身维护接入的每个终端的IP地址和ID号,当主站要向某个监控终端提出数据请求时,它会根据IP地址和ID号来找到对应的终端,将命令下发到该终端,终端响应后通过GRPS数据传输终端把数据发到网络代理服务器端口,通过端口影射转发到监控中心主站,即完成了一个应答式的通讯流程,当气象信息采集点数量增加,中心不用扩容即可满足需求。
凡省级气象局授权的气象信息采集点均可以使用本系统:
1气象信息采集点必须使用移动统一的STK卡,用户使用本卡只能用于与气象站数据通信功能。
2使用的终端设备用北京航星网讯技术股份有限公司提供的GPRS移动终端设备。
3用户登记:符合省级气象局的规定。
由系统框图可以看到短信唤醒地下水系统由三部分组成:远端点部分,传输通道,数据中心。GPRS智能图像监控数据采集传输设备进行数据的采集和数据的传输;系统数据传输通道有GPRS通道和短信通道,其中短信通道作为数据备份通道,设备在周期状态下,一旦发现服务器找不到,自动以短信方式将数据上传到服务器。数据中心通过GPRS数据中心服务器将数据和图片进行转发和存储,并可以对远端点的设备进行远程参数设置,异地数据查看等功能。
四、气象无线智能监测系统特点:
GPRS无线数据采集监控系统,中心控制室除采用了我公司研发的GPRS无线网络数据服务器外,还增加了GPRS图像监控功能,还增加了一个网口服务于APN网络,数据采集设备采用随即采集方式对监测点数据进行采集。
产品特点:
1、现场无线终端智能数采周期
现场无线终端对于传感器的采集频率,可以现场设置,亦可在异地设置,如:中心控制室。
2、现场无线终端智能数传周期
现场无线终端,可以独立于数采周期,设置数传周期,可在现场或中心控制室设置,gprs原因正在调查中
3、现场无线终端供电智能管理
现场无线终端可实现太阳能供电6V12V
无论在何种供电方式,均可实现智能管理,非工作状态下的节电方式,设备最低功耗仅为1mA
4、现场无线终端,可设置报警阀值
当现场无线终端,从传感器采集的数据数值,超过报警阀值则立即自动地将报警传输至中心控制室的数据中心服务器,并引起中控室的报警终端动作。
5、数据中心服务器抗“病毒”能力强
由于数据中心服务器采用Linux操作系统,无须安装防病毒软件,接入互联网具备“天然”抗病毒的特性。
6、数据中心服务器数据保密性好
数据中心服务器设置有访问权限、密码、独立IP或专用域名解析,不具备进入门槛技术条件,无法获取数据。
7、数据中心服务器中的数据,可以异地方式访问
数据中心服务器设置浏览器方式访问方式,用户在任何可以上网的地方均可访问数据中心服务器,获取数据。
8、数据中心服务器内置原始数据存贮
原始数据按序存贮在服务器内的数据库中,用户可通过客户端获取实时数据,也可以通过后台操作,获取数据库历史信息。
9、数据中心服务器数据冗余保障性好
当用户互联网接入发生故障时,与远端现场无线终端设备失去联系,很可能造成数据丢失。数据中心服务器具备自侦数据功能,当发现数据库中数据未按规定返回时,则当互联网接入恢复正常时,自动向无线终端“补要”未返回的现场数据。
10、数据中心服务器输出数据“透明”/“标准”
数据中心服务器可向客户终端在线输出标准化协议(如ModBus)的数据,用户可在轻松获得原始数据后实现还原加工统计,列出的功能。
五、气象无线智能监测解决方案
1、适配不同的数据采集传感器,适用于气象不同的数据监测。
2、温度数据采集无需单配温度传感器,GPRS智能采集传输终端内置温度采集模块。
3、采用先进的GPRS网络传输技术,辅以SMS传输配合使用,在GSM网络信号差的区域,或者用户不能提供互联网接入服务的情况下,能保障现场数据的可靠传输。
4、以其独特的太阳能供电的特点,深受野外数据采集传输用户的青睐。
5、短信唤醒模式,是野外作业时,既省电又能保证数据及时完整传输的最大亮点。
6、数据中心服务器带有域名解析功能,能满足没有固定IP地址的用户,也能正常接收来自远端采集回传的数据。
7、数据通信安全是整个系统稳定的根本原因。服务器采用开放式Linux操作系统,www.ehangxing.com调控不放松;传输过程中数据均已加密。
系统描述:
系统整体分为三部分:远端点、无线传输链路、中心控制室。
远端点又分三个部分:数据采集器、数据传输器以及供电电源。数据采集器我们采用传感器(Solinst LTC Conductivity Levelogger的Model 3001 LTC)。传感器的内部有电池支持(可以供电8年)对地下水的水位进行监测。此种传感器可以存储4000组数据,并可以设计采集的时间间隔。数据传输器可以将所采集的数据按照用户设定的上传时间间隔上传。数据传输器电源工作于野外无人值守的环境中,对于电池的供电是一个问题。供电电源需要电源电量能够被监测,电源电池充电方便。
无线传输链路采用GPRS传输网络链路。由远端点数据传输器发送数据到GPRS网络,再经过服务转换进入到Internet网络传输到应用服务器,并有应用服务器转发数据到客户端。实现中控室客户端软件和远端点GPRS数据传输器之间的无线数据通讯。
新一代升级版系统的无线传输链路还可以采用SMS短信传输模式。所有远端点的数据通过短信通道发送至中心控制室短信接收服务器内,供客户端访问。
中控室采用一个计算机作为客户端,利用客户端软件对现场进行采集、监测、设计等功能。客户端软件同时要实现数据存储,gprs原因正在调查中,电子地图,直方图等功能。中心控制室采用应用服务器为无线链路提供数据连接。应用服务器采用嵌入式实施任务操作系统,采用独立通讯协议进行数据通讯。因此避免了网络上的各种病毒软件的攻击,安全性高。避免了病毒攻击所带来的大量的系统维护工作。应用服务器需要固定IP,以此解决多客户端和远端设备采用活动IP进行彼此通讯的技术问题。
新一代升级版系统,可以满足没有固定IP或者不能上公网的用户使用。它可以使用SMS短信模式收发收据,使得整个系统更加灵活方便。
六、气象无线智能监测应用领域:
基于GPRS技术的GPRS透明传输系统从软件到硬件同一套完善的通用无线监控采集系统,能很快应用到各种带有采集任务的远程数据采集和远程监控等领域中,如此系统可用于:远程水质监控、地下水压力监测、远程地下水质监测、远程地质环境监控、远程抄表、远程室内外温度检测、远程地下水位数据采集、远程环保监控系统、地震监控系统、油井远程流量监控、石油远程数据采集、煤矿远程监控等领域。

 

 

     

6

     

投影钟彩色背光

     

7

     

年历

     

8

     

闹铃

     

9

     

日期查询

     

10

     

数采周期设置范围

     

1min~24h

     

 

     

11

     

数传周期设置范围

     

10min~24h

     

 

     

12

     

报警触发方式

     

上下限报警

     

在线响应延迟:<2S
离线响应:1min~60min

     

13

     

绝对值报警

     

14

     

斜率报警

     

15

     

数据存贮

     

可存贮1000~3000条数据

     

按用户实际需要可扩展

     

16

     

接口

     

数采接口

     

RS-232 or RS-485 波特率:1200----115200bps

     

与传感器连接

     

17

     

模拟量采集接口

     

0~5V or 4~20mA

     

与传感器连接

     

18

     

数据量采集接口

     

电压型输入0~3V

     

与传感器连接

     

19

     

数据量控制接口

     

可提供1路可控12V/1A电源输出

     

控制图像单元启动/可选

     

20

     

天线接口

     

50Ω/SMA( 阴头)

     

 

     

21

     

SIM

     

3V/5V,自动检测

     

 

     

22

     

电源供给

     

AC 220V市电供电

     

 

     

23

     

电源功耗

     

休眠状态

     

功耗0.1mA(12V)

     

24

     

唤醒状态

     

功耗30mA(12V)

     

25

     

数据传输状态

     

功耗300mA(12V)

     

26

     

物理

     

环境适应性

     

工作温度

     

-20°C~65°C

     

27

     

储存温度

     

-40°C~85°C

     

28

     

湿度范围

     

0-95%,无冷凝

     

29

     

外型尺寸

     

140mm×65mm×80mm

     

 

     

30

     

重量

     

0.5

     

 

 

 
GPRS数据中心服务器技术指标

序号

 
指标名称
指标描述
备注
1
服务器操作系统
嵌入式Linux操作系统
 
2
服务器寻址方式
固定IP or 域名
 
3
GPRS通信服务内核
①支持远端GPRS中断以C/S方式,将远方数据自动传输至服务器中数据库中
②支持客户端经服务器转发,对远方GPRS终端的控制命令
③支持256台远端GPRS终端,同时“并发”传输数据
④遥信变化量送至服务器≤2秒
⑤遥测量送至服务器≤2秒
⑥遥控命令≤1.5秒
 
4
监控管理服务内核
①管理远端GPRS终端DTU
a、配置DTU上、下线时间,设定工作模式
b、设定数采周期(频率)
c、设定数传周期
d、设置IP地址
e、设置短信号码
②监视远端GPRS终端DTU
a、监视远端GPRS DTU电池电量
b、监视远端GPRS DTU无线信息强度
c、当地链路测试
d、GPRS DTU上、下线稳定性
③支持以设置密码/权限的方式,管理GPRS DTU
 
5
数据库服务内核
①数据库结构:SQL关系数据库
②存贮GPRS DTU上传数据
③定义/存贮数据的属性
④存贮GPRS DTU的设备信息
⑤存贮GPRS DTU组织结构
⑥存贮用户设置报警阀值
⑦存贮用户操作日志
⑧支持存贮数据倒出,为用户数据分析提供原始数据。
 
6
WEB浏览服务内核
①支持用户通过Internet/Intranet网络,访问服务器的数据库内核数据。
②中心控制室客户端,可以以浏览器方式查看数据库中数据。
③中心控制室客户端可以设置浏览数据库访问者的密码及权限。
 
7
服务器中央处理器
Intel低功耗,无风扇,工业级Intel Celeron 400MHz CPU
 
8
看门狗定时器
定时时间1~255秒(分),可编程选择超时中断
 
9
内置硬盘
80GB/抗震型硬盘
 
10
固态盘接口
Compact FLASH电子盘
可选
11
网络接口
10/100M以太网控制器,RJ45型式
 
12
液晶屏幕
128×32点阵式黄绿背光液晶屏,显示系统运行信息
 
13
指示灯
电源指示灯(红色),硬盘指示灯(绿灯),复位灯(绿色)
 
14
固定方式
机架式/台式
 
15
工作电压
交流电压220V
 
16
功率
60W
 
17
工作环境
0~60℃ 5%~95%RH
 
18
外型尺寸
440mm×305mm×65mm
 
19
重量
1.5
 

 

2017-07-04 10:15:59 pch1982cn 阅读数 3516
  • 系统架构师之Java虚拟机、OSGi—JVM性能架构项目实战...

    本课程主要是针对java的中、开发,主要面向于java的中开发人员,在了解java一定知识点的前提下更容易对本课程做到详细的学习,在讲课过程中也会涉及到一些基本的基础知识点从而来更好的学习本课程。由于目前的一些电力企业以及气象方面对于系统性能优化要求相当高,本课程就针对目前企业公司大量的涉及到了java系统性能优化以及深入的讲解,本课程主要特点就是,高效性、针对性、实用性、深入性。

    2646 人正在学习 去看看 张勇

最近有个项目需要开发个气象信息API,可以通过经纬度查找未来几天的气象信息。

经过几天的研究,现在简单总结一下。

1、数据来源

数据来源采自美国国家环境预报中心的GFS(全球预报系统),该系统每天发布4次全球范围的气象数据,分辨率最高可达到0.25° x 0.25°,精度还是比较可观的。

2、数据下载

GFS数据提供FTP下载方式:http://www.ftp.ncep.noaa.gov/data/nccf/com/gfs/prod/

每次发布的数据保存在命名为gfs.YYYYMMDDHH的文件夹中。本次需要的数据精度为0.25°(0p25),所以数据的文件名为:gfs.t{HH}z.pgrb2.0p25.f{XXX}

其中HH表示发布的时间,XXX表示未来几小时的预报数据。例如gfs.t00z.pgrb2.0p25.f001 表示0时发布的未来1小时气象数据信息。

那么问题来了,这个文件太大了,因为分辨率比较高,每个文件高达200多MB,不仅下载速度慢,处理慢,对存储空间也是一个考验。

于是找到了一个可以在线过滤要下载数据的地址:

http://nomads.ncep.noaa.gov/cgi-bin/filter_gfs_0p25.pl

这个网站允许用户仅下载过滤后的文件,并提供下载网址,这样文件就会小很多。

例如,在本项目中,仅需要下载降雨数据(PWAT),并且经纬度范围为特定区域,每次发布的数据全部下载下来也才8M多点。

3、wgrib2

GFS的数据格式为GRIB,那么什么是GRIB呢? 官方的解释如下:

GRIB is a WMO format for gridded data. GRIB is used by the operational meteorological centers for storage and the exchange of gridded fields. GRIB's major advantages are files are typically 1/2 to 1/3 of the size of normal binary files (floats), the fields are self describing, and GRIB is an open, international standard.

那么要想获得GRIB文件中的数据,则需要用到一个软件wgrib2,,该软件在ncep网站上提供源码下载,可以很方便的在Linux下使用gcc进行编译。

以CentOS为例,需要首先安装gcc和gfortran编译器。

# yum install gcc
# yum install gcc-gfortran

然后就可以下载并安装wgrib2了。

1) Download ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/wgrib2.tgz
2) untar wgrib2.tgz:  tar -xzvf wgrib2.tgz   (use gnu tar)
3) cd to main directory:  cd grib2
4) define the C and fortran compilers and make
   Bash:
     export CC=gcc
     export FC=gfortran
     make
     make lib                        only if you want the ftn_api
   Csh
     setenv CC gcc
     setenv FC gfortran
     make
     make lib                        only if you want the ftn_api
5) See if wgrib2 was compiled
     wgrib2/wgrib2 -config

需要注意的是,wgrib2以插件的形式提供了mysql入库功能,但是需要在make之前编辑"makefile" 文件以标记使用MYSQL(USE_MYSQL=1)。

另外,在编译的过程中会用到/usr/local/include的头文件,如果安装MySQL插件还需要安装下yum install mysql-devel。

安装后就可以体验下wgrib2的解压并入库功能了。

4、使用wgrib2解压文件并load进mysql数据库

使用wgrib2装载数据库,首先要创建对应的数据库表
create table wgrib2 (rt datetime, vt datetime, lat double, lon double, param varchar(80), level varchar(30), value double); 

这里各列的含义如下:
rt: run time
vt: valid time
lat: latitude
lon: longitude
param: parameter
level: level/layer
value: value

命令也很简单:
# ./wgrib2 gfs.2017061900/gfs.t00z.pgrb2.1p00.f000 -if ":PWAT" -mysql <server_ip> <username> <password> <dbname> <tablename>

该命令会将文件中的全部PWAT数据放到对应的表中。

有了以上基础,就可以写个脚本每天自动化下载并保存GFS数据到我们的数据库了。


2019-05-16 15:07:27 zhaowei121 阅读数 170
  • 系统架构师之Java虚拟机、OSGi—JVM性能架构项目实战...

    本课程主要是针对java的中、开发,主要面向于java的中开发人员,在了解java一定知识点的前提下更容易对本课程做到详细的学习,在讲课过程中也会涉及到一些基本的基础知识点从而来更好的学习本课程。由于目前的一些电力企业以及气象方面对于系统性能优化要求相当高,本课程就针对目前企业公司大量的涉及到了java系统性能优化以及深入的讲解,本课程主要特点就是,高效性、针对性、实用性、深入性。

    2646 人正在学习 去看看 张勇

前言

气象数据是一类典型的大数据,具有数据量大、时效性高、数据种类丰富等特点。气象数据中大量的数据是时空数据,记录了时间和空间范围内各个点的各个物理量的观测量或者模拟量,每天产生的数据量常在几十TB到上百TB的规模,且在爆发性增长。如何存储和高效的查询这些气象数据越来越成为一个难题。

传统的方案常常采用关系型数据库加文件系统的方式实现这类气象数据的存储和实时查询,这种方案在可扩展性、可维护性和性能上都有一些缺陷,随着数据规模的增大,缺点越来越明显。最近几年,业界开始越来越多的基于分布式NoSQL来解决这一问题,比如基于TableStore来实现气象格点数据的存储和查询。TableStore是一款阿里自研的分布式NoSQL服务,可以提供超大规模的存储容量,支撑超大规模的并发访问和低延迟的性能,可以很好的解决气象数据的规模和查询性能问题。

我们之前也写过相关的解决方案文章《基于云上分布式NoSQL的海量气象数据存储和查询方案》,也有一些客户基于这个方案进行了开发。出于减少客户开发难度,提供通用的实现的想法,我们最近开发了一个TableStore-Grid的Library,基于这个Library用户可以非常方便的实现气象格点数据的存储、查询和管理。本文作为一个实战文章,主要讲解这一解决方案的设计以及使用方式。

背景

格点数据的特点

格点数据具有明显的多维特点,以模式系统每次产生的数据为例,一般包含以下五个维度:

  1. 物理量,或者称为要素:温度、湿度、风向、风速等等。
  2. 预报时效:未来3小时、6小时、9小时、72小时等等。
  3. 高度。
  4. 经度。
  5. 纬度。

当我们固定某一要素某一预报时效,那么高度、经度、纬度就构成一个三维网格数据,如下图所示(图片来自互联网)。每个格点代表了一个三维空间上的点,上面的数值为该点在某一预报时效(比如未来三小时)下,某一物理量(比如温度)的预报值。

1240

假设一个三维格点空间包含10个不同高度的平面,每个平面为一个2880 x 570的格点,每个格点保存一个4字节数据,那么这三维的数据量为2880 x 570 x 4 x 10, 大约64MB。这仅仅是某个模式系统对某个物理量某一时效下的一次预报,可见模式数据的总量是非常大的。

格点数据的查询方式

预报员会通过页面的形式浏览各种模式数据(格点数据),并进行数值模式预报。这个页面需要提供多种模式数据的查询方式,比如:

  1. 查询一个经纬度平面的格点数据:比如未来三小时全球地面温度的格点数据,或者未来三小时浙江省地面温度数据。
  2. 查询某个格点的时间序列数据:比如阿里云公司所在地未来3小时、未来6小时、一直到未来72小时的温度。
  3. 查询不同物理量的数据:比如查询某一预报时效、某一高度、某一点的全部物理量的预报数据。
  4. 查询不同模式系统产生的数据:比如同时查询欧洲中心的某一模式数据和中国气象机构产生的对应数据等。

上面提到,一个格点数据集一般是一个五维结构,各种查询方式实际上就是对这个五维数据进行切分,比如查询某个平面,每个剖面,某个点序列,某个三维、四维子空间等等。而我们的方案设计要保证在各种查询条件的查询性能,这是数据查询方面的主要技术难点。

基于TableStore的方案设计

标准化格点数据模型

首先,我们定义一个规整的五维网格数据为一个GridDataSet,表示一个格点数据集,按照维度顺序,其五维分别为:

  1. variable:变量,比如各种物理量。
  2. time:时间维度。
  3. z: z轴,一般表示空间高度
  4. x: x轴,一般表示经度或纬度。
  5. y:y轴,一般表示经度或纬度。

GridDataSet = F(variable, time, z, x, y)。

一个GridDataSet除了包含五维数据,以及各个维度的长度等外,还包含一些其他信息:

GridDataSetId:唯一标记这个GridDataSet的Id。
Attributes:自定义属性信息,比如该数据的产生时间、数据来源、预报类型等等。用户可以自由定义自定义属性,也可以给某些属性建立索引,建立索引后就可以通过各种组合条件来查询符合条件的数据集。

举个例子来说,假设某种气象预报,每次预报未来72小时的每个整点的各个高度、各个经纬度的各种物理量,则这次预报就是一个标准的五维数据,是一个单独的数据集(GridDataSet),下一次相同的预报则是另一个数据集,这两个数据集需要有不同的GridDataSetId。这两个数据集比较类似,只是起报时间不同,但是因为起报时间不在五维模型中(五维内的时间为一次预报中的未来不同时刻),所以属于不同的数据集,起报时间可以作为数据集的自定义属性。本方案中,也支持对自定义属性设置条件进行检索。

数据存储方案

我们设计了两张表分别存储数据集(GridDataSet)的meta和data,meta表示这个数据集的各种元数据,比如GridDataSetId、各维度长度、自定义属性等等,data表示这个数据集里实际的网格数据。data相比meta在数据大小上要大很多。

为什么要分为meta和data两张表分开存储,主要是出于这样的考虑:

  1. 用户会有根据多种条件查询数据集的要求,比如查询最近有哪些数据集已经完成入库,或者查询表中有哪些某种类型的数据集等。传统方案中主要是通过MySQL等关系型数据库来存储,在本方案中我们通过单独的meta表来存储,并通过TableStore的多元索引功能来实现多条件的组合查询和多种排序方式,相比传统方案更加易用。
  2. 在查询格点数据之前,一般要知道格点数据中各维度的长度等信息,这些信息就是存储在meta表中的,即需要先查询meta表,再查询data表。因为meta数据一般都很小,因此查询效率相比查询data要高,多一次查询并不会明显增加延迟。

meta表设计

meta表的设计比较简单,主键只有一列,记录GridDataSetId,因为GridDataSetId就可以唯一标记一个GridDataSet。各种系统属性和自定义属性保存在meta表的属性列中。

1240

查询meta表有两种方式,一种是通过GridDataSetId直接查询,另外一种是通过多元索引,可以根据多种属性条件组合进行查询,比如筛选某种类型的数据,按照入库时间从新到老返回等。

data表设计

data表的设计要解决五维数据在不同的切分模式下的查询效率问题,不能简单直接的对数据进行存储。

首先,为了查询效率最高,我们要尽量减少一次查询需要扫描的数据量。一个数据集的数据量可能在几GB的级别,但是一次查询往往只需要其中的几MB的数据,如果无法高效的定位要查询的数据,那么就要扫描全部的几GB的数据,从中筛选出符合某个范围的数据,显然效率是很低的。那么怎么才能做到高效的定位到需要的数据之中呢?

我们首先设计一种表结构设计方式,我们使用四列主键列,分别为:

GridDataSetId:数据集Id,唯一标记这个数据集。
Variable:变量名,即五维模型中的第一维。
Time:时间,即五维模型中的第二维。
Z:高度,即五维模型中的第三维。

1240

这四列主键列标记一行TableStore中的数据,这行数据需要保存后两维的数据,即一个格点平面。

这种设计下,对于五维中的前三维,我们都可以通过主键列的值来定位,即对于前三维的每一种情况,都对应TableStore中的一行。因为前三维分别代表变量、时间和高度,一般而言不会特别的多,每个维度在几个到几十个的级别,我们可以通过一些并行查询的方法来加速查询速度。

剩下的问题就在于后两维数据如何存储和查询。首先后两维代表了一个水平的平面,一般是一个经纬度网格,这两维的大小是比前三维要大很多的,每维在几百到几千的级别,随着数值预报越来越精细化,这个网格的大小还会成倍增加。这样的一个稠密的网格数据,我们不能把每个格点都用一列来保存,这样列的数量会非常多,存储效率也会非常的低。另一方面,如果我们把一个平面的格点数据存储到一列中,在整读整取时效率比较高,但是如果只读取某个点,就会读取很多的无效数据,效率又会变得比较低。因此我们采取一种折中的方案,对平面的二维数据再次进行切分,切分成更小的平面数据块,这样就可以做到只读取部分数据块,而不总是读取整个平面,因此极大的提高了查询性能。

1240

方案实现

基于上面的存储方案,我们实现了一个TableStore-Grid的library,提供以下接口:

public interface GridStore {
    /**
     * 创建相关的meta、data表,数据录入前调用。
     * @throws Exception
     */
    void createStore() throws Exception;

    /**
     * 写入gridDataSet的meta信息。
     * @param meta
     * @throws Exception
     */
    void putDataSetMeta(GridDataSetMeta meta) throws Exception;

    /**
     * 更新meta信息。
     * @param meta
     * @throws Exception
     */
    void updateDataSetMeta(GridDataSetMeta meta) throws Exception;

    /**
     * 通过gridDataSetId获取meta。
     * @param dataSetId
     * @return
     * @throws Exception
     */
    GridDataSetMeta getDataSetMeta(String dataSetId) throws Exception;

    /**
     * // 创建meta表的多元索引。
     * @param indexName
     * @param indexSchema
     * @throws Exception
     */
    void createMetaIndex(String indexName, IndexSchema indexSchema) throws Exception;

    /**
     * 通过多种查询条件来查询符合条件的数据集。
     * @param indexName 多元索引名。
     * @param query 查询条件,可以通过QueryBuilder构建。
     * @param queryParams 查询相关参数,包括offset、limit、sort等。
     * @return
     * @throws Exception
     */
    QueryGridDataSetResult queryDataSets(String indexName, Query query, QueryParams queryParams) throws Exception;

    /**
     * 获取GridDataWriter用于写入数据。
     * @param meta
     * @return
     */
    GridDataWriter getDataWriter(GridDataSetMeta meta);

    /**
     * 获取GridDataFetcher用于读取数据。
     * @param meta
     * @return
     */
    GridDataFetcher getDataFetcher(GridDataSetMeta meta);

    /**
     * 释放资源。
     */
    void close();
}

public interface GridDataWriter {
    /**
     * 写入一个二维平面。
     * @param variable 变量名。
     * @param t 时间维的值。
     * @param z 高度维的值。
     * @param grid2D 平面数据。
     * @throws Exception
     */
    void writeGrid2D(String variable, int t, int z, Grid2D grid2D) throws Exception;
}

public interface GridDataFetcher {
    /**
     * 设置要查询的变量。
     * @param variables
     * @return
     */
    GridDataFetcher setVariablesToGet(Collection<String> variables);

    /**
     * 设置要读取的各维度起始点和大小。
     * @param origin 各维度起始点。
     * @param shape 各维度大小。
     * @return
     */
    GridDataFetcher setOriginShape(int[] origin, int[] shape);

    /**
     * 获取数据。
     * @return
     * @throws Exception
     */
    GridDataSet fetch() throws Exception;
}

下面我们分别给出数据录入、数据查询、数据集检索方面的示例。

数据录入

数据录入流程可以分为三部分:

  1. 写入putDataSetMeta接口写入数据集的meta信息。
  2. 通过GridDataWriter录入整个数据集的数据。
  3. 通过updateDataSetMeta接口更新数据集的meta信息,标记数据已经录入完成。

下面的例子中,我们读取一个NetCDF(气象格点数据常用的格式)文件,然后将其中的数据通过GridDataWriter录入到TableStore中。通过GridDataWriter每次写入时,只能写入一个二维平面,所以我们需要在外层进行3层循环,分别枚举变量维、时间维、高度维的值,然后读取对应的二维平面的数据进行录入。

public void importFromNcFile(GridDataSetMeta meta, String ncFileName) throws Exception {
    GridDataWriter writer = tableStoreGrid.getDataWriter(meta);
    NetcdfFile ncFile = NetcdfFile.open(ncFileName);
    List<Variable> variables = ncFile.getVariables();
    for (Variable variable : variables) {
        if (meta.getVariables().contains(variable.getShortName())) {
            for (int t = 0; t < meta.gettSize(); t++) {
                for (int z = 0; z < meta.getzSize(); z++) {
                    Array array = variable.read(new int[]{t, z, 0, 0}, new int[]{1, 1, meta.getxSize(), meta.getySize()});
                    Grid2D grid2D = new Grid2D(array.getDataAsByteBuffer(), variable.getDataType(),
                            new int[] {0, 0}, new int[] {meta.getxSize(), meta.getySize()});
                    writer.writeGrid2D(variable.getShortName(), t, z, grid2D);
                }
            }
        }
    }
}

数据查询

GridDataFetcher支持对五维数据进行任意维度的查询。第一维是变量维,通过setVariablesToGet接口设置要读取哪些变量,其余四维通过设置起始点(origin)和读取的大小(shape)就可以实现任意维度读取。

public Array queryByTableStore(String dataSetId, String variable, int[] origin, int[] shape) throws Exception {
      GridDataFetcher fetcher = this.tableStoreGrid.getDataFetcher(this.tableStoreGrid.getDataSetMeta(dataSetId));
      fetcher.setVariablesToGet(Arrays.asList(variable));
      fetcher.setOriginShape(origin, shape);
      Grid4D grid4D = fetcher.fetch().getVariable(variable);
      return grid4D.toArray();
}

多条件检索数据集

本方案中,对Meta表建立多元索引后,可以支持通过各种组合条件来进行数据集检索,查询出符合条件的数据集,这个功能对于气象管理系统来说非常重要。

下面举一个例子,假设我们要查询已经完成入库的,创建时间为最近一天的,来源为ECMWF(欧洲中期天气预报中心)或者NMC(全国气象中心),精度为1KM的气象预报,并按照创建时间从新到老排序,可以用以下代码实现:

查询条件: (status == DONE) and (create_time > System.currentTimeMillis - 86400000) and (source == "ECMWF" or source == "NMC") and (accuracy == "1km")

QueryGridDataSetResult result = tableStoreGrid.queryDataSets(
        ExampleConfig.GRID_META_INDEX_NAME,
        QueryBuilder.and()
                .equal("status", "DONE")
                .greaterThan("create_time", System.currentTimeMillis() - 86400000)
                .equal("accuracy", "1km")
                .query(QueryBuilder.or()
                        .equal("source", "ECMWF")
                        .equal("source", "NMC")
                        .build())
                .build(),
        new QueryParams(0, 10, new Sort(Arrays.<Sort.Sorter>asList(new FieldSort("create_time", SortOrder.DESC)))));
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

是不是非常简单?这一部分功能利用了TableStore的多元索引,多元索引可以实现多字段组合查询、模糊查询、全文检索、排序、范围查询、嵌套查询、空间查询等功能,给元数据管理场景提供了强大的底层能力。

相关代码的获取

可以在github上获取TableStore-Grid的实现代码和示例代码,欢迎大家体验、使用以及给我们提出建议。
代码链接: https://github.com/aliyun/tablestore-examples/tree/master/demos/TableStore-Grid

 


本文作者:亦征

原文链接

本文为云栖社区原创内容,未经允许不得转载。

2018-12-26 09:30:06 canger1 阅读数 1935
  • 系统架构师之Java虚拟机、OSGi—JVM性能架构项目实战...

    本课程主要是针对java的中、开发,主要面向于java的中开发人员,在了解java一定知识点的前提下更容易对本课程做到详细的学习,在讲课过程中也会涉及到一些基本的基础知识点从而来更好的学习本课程。由于目前的一些电力企业以及气象方面对于系统性能优化要求相当高,本课程就针对目前企业公司大量的涉及到了java系统性能优化以及深入的讲解,本课程主要特点就是,高效性、针对性、实用性、深入性。

    2646 人正在学习 去看看 张勇

随着科技的发展,气象作为基础的支持信息,已经和各个行业形成紧密的联系,对气象数据的可视化日益重要。气象数据可视化提供完整的二/三维解决方案,将主流的气象类型做模块化的封装,提供数据和可视化的对接解决方案,使海量的气象数据“轻而易举”的呈现在用户的视野之中。
在这里插入图片描述

FRT PI 光伏气象站

阅读数 1000

没有更多推荐了,返回首页