基于云上分布式NoSQL的海量气象数据存储和查询方案

摘要: 气象数据是一类典型的大数据,具有数据量大、时效性高、数据种类丰富等特点,每天产生的数据量常在几十TB到上百TB的规模,且在爆发性增长。如何存储和高效的查询这些气象数据越来越成为一个难题,本文针对气象领域中海量模式数据的存储和查询问题,分别介绍了传统方案和采用表格存储(TableStore)的方案,并对方案优缺点进行了一些总结。

前言

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

传统的方案常常采用关系型数据库加文件系统的方式实现这类气象数据的存储和实时查询,这种方案在可扩展性、可维护性和性能上都有一些缺陷,随着数据规模的增大缺点越来越明显。最近几年,学界和业界开始不约而同的转向利用分布式NoSQL存储来解决海量气象数据的存储和实时查询问题,相比之前的方案,可以支撑更大规模的数据量并提供更好的查询性能,并且在稳定性、可管理性等方面,也得到了显著的提升。

另一方面,利用云计算的资源来解决气象大数据的解析、存储、查询与分析也成为一种趋势和方向。云上有着丰富的产品服务和弹性的计算资源,可以在云上完成一整套的气象数据处理工作流:利用云上的分布式存储进行气象数据的存储和实时查询,利用大数据计算服务进行气象数据的分析和加工,利用各种应用服务搭建气象平台与应用。

因此,今天越来越多的气象领域科研人员,以及海洋、地震等等领域的科研人员,开始了解云计算,了解分布式存储,并思考如何基于这些服务,进行海量气象数据的存储和查询方案设计。本文会基于表格存储(TableStore, 原OTS)在气象领域的解决方案的探索,介绍如何使用表格存储解决海量气象数据的存储和实时查询难题。

气象数据的特点和查询方式

这一章会介绍一下气象数据(主要是模式数据)的特点,以及几种查询方式,并由此引出为了实现海量气象数据的存储和实时查询,我们需要解决哪些问题。

模式数据

气象数据中非常重要的一部分数据是模式数据,用于数值模式预报。模式数据是由高性能计算机根据地面、高空、卫星等传感器上的实时观测数据通过物理方程计算得出的,产生模式数据的系统是一套庞大的计算系统,一般各个发达国家的气象机构都会有自己的一套模式系统。

模式系统每天会计算几次,每次生成几百个物理量在未来一段时间(比如240小时)的不同海拔高度下的一系列经纬度网格预报数据,网格上的每个点代表这个高度这个经纬度上未来某时刻某个物理量的预报数值。

模式数据具有多维特点

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

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

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

image.png | center | 704x42

模式数据的查询方式

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

查询一个经纬度平面的格点数据:比如未来三小时全球地面温度的格点数据,或者未来三小时浙江省地面温度数据。
查询某个格点的时间序列数据:比如阿里云公司所在地未来3小时、未来6小时、一直到未来72小时的温度。
查询不同物理量的数据:比如查询某一预报时效、某一高度、某一点的全部物理量的预报数据。
查询不同模式系统产生的数据:比如同时查询欧洲中心的某一模式数据和中国气象机构产生的对应数据等。
查询方式不限于以上几种,本文重点分析前两种较为典型的查询方式,即“查询一个经纬度平面的格点数据”和“查询某个格点的时间序列数据”。

方案要解决哪些问题

首先是存储方面的问题。海量的气象数据必须采用多台服务器进行存储,问题在于如何选择或者构建一个分布式存储系统来保障数据可靠性、可管理性和系统可维护性。

然后是查询的问题。预报员在进行气象预报时,需要快速的浏览大量的气象数据,才能高效准确的进行气象预报。因此,各种查询操作的延迟要很低,必须在毫秒级。上面提到,数据是分布在多台机器之中的,为了实现毫秒级的延迟,必须满足以下两点:

能够根据查询条件,高效的定位到要查询的数据。
定位到数据之后,需要高效的筛选出本次查询所需的数据。比如查询某个点的时间序列数据,需要只筛选出该点的数据。
下面我们来看传统方式和分布式NoSQL方式分别如何解决该问题。

传统的气象数据存储查询方案

由于多维气象数据具有数据量大的特点,所以传统的存储方式是文件系统,而非数据库。在文件系统中,每个维度作为一个目录,形成一个树形的目录结构,数据文件作为树的叶子节点,如下图所示。

image.png | center | 698x611图片描述
上图只是一个示意图,实际存储时数据的层次关系和目录结构设计会因地而异,不同的研究机构会采用不同的目录结构设计。一个需要考虑的问题是,一个数据文件需要控制在多大,即一个数据文件要保存多少维度信息的数据。如果每个文件都很小,文件系统中就会有大量的小文件,导致定位文件的延迟增加,维护这些小文件的负担也较大。如果每个文件都较大,那么就要避免在查询时读取整个文件,导致延迟很高。
图片描述
下面我们来看这种方案分别如何解决存储和查询问题。对于存储,这种方案会人为的将不同类型的数据划分到不同的服务器上,实现数据的分布式保存,每台机器的目录结构都如上图所示。为了维护某种类型的数据对应哪台机器,常采用关系型数据库进行记录,或者使用配置文件的方式。

对于数据的查询,这种方案常会先从关系型数据库中获取要查询的数据文件所在的机器和文件系统路径,然后访问对应机器上的agent进行查询。这个agent会访问本地文件系统,读取数据文件,并筛选和处理出用户所需的数据。这个agent是必不可少的,其作用是在本地先对数据进行一遍筛选和处理,以减少传输的网络流量。

这里我们可以举一个例子,假设我们要获取某个点在某一高度的未来72小时的时间序列数据,预报时效间隔3小时,那么其实只是获取24个数值。问题在于这24个数值涉及的数据文件可能很大,可能达到几百MB的级别,因为其中的冗余数据太多了,其他的经纬度格点,其他高度的数据我们都是不关心的。本地agent在读取数据时,如果数据采用特定的文件格式,比如NetCDF,可以只读取一个大文件中的一部分,起到优化效果。

image.png | center | 743x558
这种模式的缺点也很明显:

人为的将不同类型的数据存储在不同机器上,需要解决数据可靠性和可用性的问题,带来很大的维护负担。
数据种类和存储节点的对应关系是确定好的,在新增或者删减数据时需要人为进行调整,可扩展性较差。
为了优化查询性能,必须开发一个agent程序图片描述,启动在存储节点上。这个程序负责从数据文件中筛选出符合条件的一小部分数据,假设数据文件采用NetCDF格式存储,本地agent可以只读取文件中的一部分内容,减少读盘的延迟。这种定制化的方案带来了一些开发维护成本,同时这个agent也难以集成到现有的成熟的分布式存储系统中,即这是一种基于本地文件系统和NetCDF文件格式的特定优化。
使用表格存储进行气象数据存储和查询的方案

表格存储(TableStore)是一款云上的分布式NoSQL数据存储服务,支持高并发的数据读写和PB级别的数据存储能力,提供毫秒级的读取性能。通过上面对传统方案的分析,我们对海量气象数据的存储和查询已经有了一定认识,那么表格存储如何解决其中的问题呢?

首先,表格存储是一种分布式NoSQL存储服务,数据本身会分散到不同的机器上,单集群可以支撑10PB的数据规模,这就解决了存储的问题。

其次,表格存储支持快速的单行查询和范围查询,从数据模型上可以认为是一个巨大的SortedMap。即使表中拥有几百亿、几万亿行数据,单行数据的定位速度并不会下降,这就解决了文件系统在大量小文件时定位慢的问题。

从查询的角度来看,越高效准确的定位到数据,读取以及返回的冗余数据越少,查询效率越高。那么我们可以把表格存储中一行或者一列的数据大小控制在一个恰当的粒度,以此来满足各种查询方式的需求。实践中已经验证,这种方式可以带来非常优秀的性能。下面具体来看存储方案的设计。

存储方案设计

表格存储的数据模型如下图所示,每行数据分为主键和属性列,通过主键来标示一行数据。
image.png | center | 701x362
下文中的方案重点来讲主键列和属性列如何设计,并且如何实现两种典型的查询方式, 即“查询一个经纬度平面的格点数据”和“查询某个格点的时间序列数据”。

方案一

对于气象中的某种模式数据Data,我们暂且用下面的方式表示:

Data = F(物理量、起报时间、高度、预报时效、经度、纬度)

我们可以把前四个维度作为主键(PrimaryKey,简称PK),后两个维度的数据作为属性列保存,表示为:

Row(物理量、起报时间、高度、预报时效) = F(经度、维度)

PK = (物理量、起报时间、高度、预报时效)
Data = F(经度、维度) = 二维的经纬度格点数据(我们采用binary格式存储在属性列中)
Meta = 一些其他的辅助信息,比如数据是否压缩等等。

那么 Row(PK) = (Data, Meta, 其他属性列), Table = SortedMap(Rows), 如下图所示。
image.png | center | 701x371
这种方式下,对于查询“一个经纬度平面的格点数据”, 那么只需要把物理量、起报时间、高度、预报时效这些信息拼成主键,然后通过表格存储的GetRow接口读取一行数据即可,如果一次要获取多个经纬度平面的数据,可以通过BatchGetRow接口一次读取多行数据。读取完成后,客户端需要解析出属性列中存储的二进制数据,因为气象数据的压缩率较高,这种方式下推荐对数据进行压缩。

设计这种方案时很重要的考虑因素是,一行存储多大粒度的数据。这里一行只存储一个经纬度平面的数据,以2880 x 570的float数据为例为例,数据量为2880 x 570 x 4=6.3MB数据,压缩后数据量更小。这个粒度对于存储和查询都较为合适,而且气象中大部分查询请求也是读取一个平面。

但是这种方案有一个缺点,对于“查询某个格点的时间序列数据”,必须先读取出一个完整的经纬度格点数据,然后筛选出所需的一个格点。因为获取的冗余数据太多,所以对这个查询场景不能提供很好的性能。由此我们引出方案二。

方案二

为了满足“查询某个格点的时间序列数据”的需求,我们想到通过对数据再切分,来减小数据的粒度,缩小冗余数据的查询和返回。为了缩小数据的粒度,我们把一行中的一个经纬度平面再切分为100个方格,存储在100个属性列中。下图是一个切分的例子,我们把一个481 x 641的平面,切分成很多49 x 65的方格,每个方格的数据保存为一列,列名为Data_x_y, (x, y)是这个方格的左上角坐标。

此时, Row(PK) = (Data_x1_y1, Data_x2_y2, Data_x3_y3, … , Meta)

image.pn图片描述g | center | 704x373

切分示意图如下:

image.png | center | 669x536
这种方式下,对于“查询某个格点的时间序列数据”,我们先根据切分方式算出这个格点落在哪个属性列中,然后设置只读取该属性列,然后使用BatchGetRow接口批量读取不同预报时效的数据,即可获取并筛选出“这个格点的时间序列数据”。相比方案一,这里读取的数据量缩小了100倍,性能得到了巨大的提升。
如果读取的不是某个格点,而是读取一部分区域的数据。那么可以先算出这个区域涉及哪些小方格,只读取这些小方格的数据,也可以大量的减少冗余数据的读取。

如果需要读取整个平面,方案一和方案二都可以满足。方案一的好处在于数据放在一起可以获得较好的压缩率,因此业务上可以考虑综合使用方案一和方案二,还是只使用方案二。

方案优缺点

采用表格存储的方案之后,新的查询方式如下图所示:

image.png | cen图片描述ter | 700x421
这种方案的优点可以总结一下:

高可靠和高可用保障,可维护性和可扩展性强。采用成熟的分布式NoSQL系统,相比人为的管理多台服务器的文件系统,可靠性和可用性有巨大提升。可扩展性强,针对不同类型的模式数据,都可以方便的纳入这一系统中来。
弹性的存储和计算资源。使用公共云上的表格存储服务,只需要按量付费,大大的节约了成本,并且可以应对短期的容量或访问高峰。
性能优异,架构简单。实际测试中,上述方案的性能远优于传统方案。同时,传统方案需要在服务端启动一个agent来优化读取性能,在表格存储的方案中已经不再需要开发类似的agent,架构更加简单,分层清晰。
这种方案的缺点在于,气象系统的开发工程师需要对分布式NoSQL较为了解,特别是在进行方案二的实现时,需要对数据进行切分,有一些开发上的复杂度。

作者:亦征

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现代IM系统中消息推送和存储架构的实现

摘要: 前言 IM全称是『Instant Messaging』,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。当然目前微信已经成长为一个生态型产品&…

漫画:为什么程序员没有女友?

戳蓝字“CSDN云计算”关注我们哦!作者 | 程序员小灰————— 五分钟后 —————ERNIE是百度开源深度学习平台飞桨(PaddlePaddle)推出的知识增强语义表示模型,通过海量数据建模词、实体及实体关系。相较于 BERT 学习原始语言信…

基于TableStore的数据采集分析系统介绍

摘要: 摘要 在互联网高度发达的今天,ipad、手机等智能终端设备随处可见,运行在其中的APP、网站也非常多,如何采集终端数据进行分析,提升软件的品质非常重要,例如PV/UV统计、用户行为数据统计与分析等。虽然…

idea 暂存文件或idea切换分支代码不见了

idea切换分支时,修改过的代码文件全部不见了 找了一下问题,切换分支时,idea自动会创建暂存文件, 点开,右边View --> 即可显示暂存文件。 点击Apply Stash 即可将暂存文件应用到当前分支。 如果发现此方法还是不行…

微服务架构之「 访问安全 」

戳蓝字“CSDN云计算”关注我们哦!作者 | 奎哥来源 | 不止思考应用程序的访问安全又是我们每一个研发团队都必须关注的重点问题。尤其是在我们采用了微服务架构之后,项目的复杂度提升了N个级别,相应的,微服务的安全工作也就更难更复…

百亿级全网舆情分析系统存储设计

摘要: 前言 在时下互联网信息的浪潮下,信息的传播速度远超我们的想象。微博里一条大V的帖子,朋友圈的一个状态更新,热门论坛的一条新闻,购物平台的购物评价,可能会产生数以万计的转发,关注&…

面试官:你简历中写用过docker,能说说容器和镜像的区别吗?

戳蓝字“CSDN云计算”关注我们哦!作者 | bethal来源 | http://sina.lt/gfmf这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image)之间的区别,并深入探讨容器和运行中…

IPv6终于要取代IPv4了!阿里云将全面提供IPv6服务

摘要: 近日,中办国办印发《推进互联网协议第六版(IPv6)规模部署行动计划》,加快推进基于IPv6的下一代互联网规模部署,计划指出到2018年末国内IPv6活跃用户数要达到2亿,2020年末达到5亿&#xff…

SDN精华问答 | 为什么会出现SDN?

SDN火热了好一阵子,无论运营商、政府企业、投资机构,一段时间,不知道SDN、不能甩几个SDN相关的名词术语,似乎都落后于时代了。今天,就来看看关于SDN的精华问答吧。1Q:SDN的本质属性? A&#xff…

一张图看懂2017双11中的网络产品和技术

摘要: 大家都知道,2017年双11又创造了新纪录,全天交易额1682亿,交易峰值32.5万笔/秒,支付峰值25.6W笔/秒,狂欢的背后是极其复杂庞大的技术系统,其中就有大量阿里云云计算相关的产品和技术&#…

开源Elasticsearch云托管服务,专享企业级服务

摘要: 日前,阿里云联合开源官方Elastic联合发布了Elasticsearch新产品。该产品基于开源Elasticsearch及商业版X-Pack插件的云托管服务,保证高性能、高可用,可弹性扩容,并提供企业级权限管控、安全监控告警等高级功能,适…

Ivanti罗琦:IT服务管理中“拧紧螺丝”要有门道儿!

戳蓝字“CSDN云计算”关注我们哦!作者 | 刘晶晶Ivanti与科大讯飞的携手合作!初听这一消息,阿晶惊讶不已。毕竟科大讯飞擅长语音众所周知,Ivanti更专攻IT服务管理,看似“不相关”的两家企业,却有了某种隐含的…

CDN价格下调25% 阿里云再次冲击国内最低价

摘要: 在刚刚圆满落幕的云栖大会广东分会上,阿里云发布了很多重磅信息,其中不乏很多核心产品折扣幅度调整的信息。令人惊喜的是,阿里云CDN价格再次下调,降幅高达25%。降价完成后,带宽单价最低只需0.54元/Mb…

SpringBoot整合Spring Cloud Alibaba

spring-cloud官方中文文档https://www.springcloud.cc/spring-cloud-dalston.htmlspring-cloud官方文档https://cloud.spring.io/spring-cloud-static/Greenwich.SR1/single/spring-cloud.html#_quick_start_6Spring Cloud Alibaba官方文档https://github.com/alibaba/spring-c…

产品经理教你玩转阿里云负载均衡SLB系列(一):快速入门--什么是负载均衡

摘要: 负载均衡是一种技术,从字面意义上理解,就是让负载(变得)均衡,负载是什么呢?可以理解为工作量、工作强度。用日常生活中的例子来打比方,一群建筑工人,盖一幢楼房,有搬砖的&…

android touch事件坐标原点,Android onTouch事件与手势操作

触摸,手势操作已经很好的融入了我们的生活。那么Android开发中触摸事件要如何捕捉?如何处理?如何识别手势?事件的传递机制又是怎么样的?下面我们将通过一个小例子来进行这方面的学习。先看效果图如上图所示&#xff0c…

2019年技术盘点容器篇(二):听腾讯云讲讲踏入成熟期的容器技术 | 程序员硬核评测...

戳蓝字“CSDN云计算”关注我们哦!作者:刘晶晶据相关调研机构出具的报告数据显示,目前应用容器市场规模将从2016年的 7.62亿美元增长到2020年的27亿美元。显而易见,引入容器所展现的巨大灵活性有效推动了其采用速率,使企…

阿里云容器服务新增支持Kubernetes编排系统,性能重大提升

摘要: 作为容器编排系统的两大流派, Kubernetes和Swarm的重要性不言而喻。融合了两大高性能集成的阿里云容器服务,不仅可以降低50%的基础架构成本,提高交付速度将产品迭代加快13倍,还可以实现秒级的海量容器启动、秒级…

实战_01_Spring SpringMVC 整合Mybaits

文章目录一、技术选型1.1. maven坐标说明1.2. 环境准备二、工程所属关系2.1. 项目结构总览2.2. 工程所属关系总览三、创建聚合工程3.1. 聚合工程_ly-parent3.2. 聚合工程_ly-manager四、创建子项目4.1 创建子工程服务ly-common4.2 创建子工程服务ly-entity4.3 创建子工程服务ly…

Android热修复升级探索——代码修复冷启动方案

摘要: 前面一篇文档, 我们提到热部署修复方案有诸多特点(有关热部署修复方案实现, Android热修复升级探索——追寻极致的代码热替换)。其根本原理是基于native层方法的替换, 所以当类结构变化时&#xff0c…