大型(> 22万亿项)地理空间数据集,具有快速(<1s)的读取查询性能


20

我正在为大型地理空间数据集设计一个新系统,这将需要快速的读取查询性能。因此,我想看看是否有人认为在以下情况下有合适的DBMS,数据结构或其他方法来实现所需的性能,或者是否有经验/建议:

将从处理后的卫星雷达数据中连续产生数据,这些数据将覆盖全球。根据卫星的分辨率和地球的土地覆盖范围,我估算了完整的数据集,可在全球750亿个离散位置产生价值。在单个卫星的生命周期中,输出将在这些位置的每个位置产生多达300个值(因此,总数据集大于22万亿个值)。这是针对一颗卫星的,已经在轨道上有第二颗,在新的几年中计划再发射两颗。因此会有很多数据!单个数据项非常简单,仅包含(经度,纬度,值),但是由于项数众多,我估计单个卫星可以产生高达100TB的数据。

写入的数据永远不需要更新,因为它只会随着新的卫星采集处理而增长。写入性能并不重要,但读取性能至关重要。该项目的目标是能够通过简单的界面(如google map上的图层)可视化数据,其中每个点均基于其平均值,梯度或随时间变化的某些函数具有彩色值。(帖子末尾的演示)。

根据这些要求,数据库需要具有可伸缩性,我们可能会寻求云解决方案。该系统必须能够处理地理空间查询,例如“(纬度,经度)附近的点”和“(框)中的点”,并具有小于1的读取性能(用于定位单个点)以及包含多达50,000点(尽管最好是200,000点)。

到目前为止,我在1.11亿个位置拥有约7.5亿个数据项的测试数据集。我已经试用了一个postgres / postGIS实例,该实例可以正常运行,但是没有分片的可能性,我不能这样做,因为随着数据的增长,它也可以应对。远,并且通过分片就可以随数据量进行扩展。我最近对弹性搜索学到了一些知识,因此对此的任何评论对我来说都是新的,将是有帮助的。

这是我们希望使用完整数据集实现的快速动画: Tileserver为7.5亿个数据项提供可视化服务。

这个gif(来自我的postgres试用版)正在提供(6x3)预先计算的栅格图块,每个图块包含约200,000点,并花费约17s来生成每个。通过单击一个点,可以通过在小于1秒的时间内将所有历史值拉到最近的位置来绘制图表。

对于冗长的帖子,我们深表歉意,欢迎提出任何意见/建议。

Answers:


4

您可以按位置分片。将地球仪分成一个网格,并将该网格中的每个正方形放在一台服务器上。既然您提到了云,那将非常适合云。当然,您将需要手动合并来自多个服务器的结果。

这样,您可以使用任何喜欢的数据库解决方案。它不需要自行扩展。

各个正方形将具有不同数量的数据。您可以为它们使用大小不同的计算机(因为这是云),也可以在同一台计算机上放置多个小碎片。

这种分片方案非常适合您执行的查询,因为每个查询只需要触摸很少的分片。按时间进行分片会更糟,因为必须为每个查询触摸所有时间分片。随机分片有同样的问题。

总而言之,这是一个简单的分片情况,因为查询模式非常适合分片方案。

实际上,我想知道您是否为此需要一个数据库。也许您可以将Globe划分为1000x1000个或更小的图块,并为每个图块在Blob存储中保存一个平面文件。Blob存储根本不考虑1M Blob。

从概念上讲,使用此存储方案很容易执行查询。您也可以以多种网格分辨率冗余地存储数据。


按区域进行分片是我一直在使用MongoDB的方法,随着及时发布MongoDB Atlas,我目前正朝着这个方向发展(使用预先计算的汇总值)。目前,我不确定我需要多少个副本/分片服务器,因此成本核算可能成为问题。您关于使用BLOB存储的建议也很有趣,并且您是第二个人。但是,使用BLOB对我而言是全新的,因此,我需要进一步了解它,您是否知道有用的资源?感谢您的回复。
Azwok '16

Blob使用起来很简单。复杂性将因您需要实现数据库功能(例如序列化,查询,事务,备份,HA,DA)而引起。这都是可行的,但可能不明智。也许您可以将这些斑点存储在Postgres表中。除了序列化和查询之外,这将使所有这些自动化。Perf可能比Blob存储更好,甚至更便宜。Blob和VM不按成本收费,它们的利润空间不错(证明:我的本地Web托管商在相同计算能力下的收费比云计算便宜3-5倍。这意味着高云利润率)。
usr

请注意,您可以在同一个mongo实例上运行多个分片。您可以“超支”。这样,您可以平衡服务器。
usr

1
我不确定您根本不需要任何空间特征。您可以在应用程序中计算所有这些。您只需要查询所有数据以获取矩形。这可以通过手动将地球仪拆分为一个网格(或多分辨率网格)来完成。我认为您的数据库不需要支持空间。
usr

8

您的读取查询需要更新多少?

如果地图只需要显示最新的度量值,则可以按时间对数据库进行分区。这样可以减少地图的查询负载。

对于给定点的历史记录,您可以通过显示历史记录的x和y持有第二家商店。这可以通过每晚刷新/更新来完成,因为历史数据不会更改。

然后,您可以以更粗略的分辨率预先计算平均值,以便与不同缩放级别的地图集成。这将减少大地图区域要检索的点数(缩小)。更精细的分辨率将用于放大较小的地图,这些地图正在查询较小的区域。如果确实需要加快速度,则可以将图块计算为斑点,并在应用程序中对其进行解释。

由于这些操作将涉及对汇总信息的某些重新计算,因此查询结果中将存在一些延迟。根据可接受的延迟时间,可以使用这种方法来优化读取。

好的,因此您的点数需要随时间计算平均值。通过这种计算,我猜想您的实际查询量从22万亿项下降了很多,因为可以预先计算出栅格值以进行查询。


读取查询可能会有一点延迟(一两天),因此批处理是一个有效的选项。在任何给定位置,只会以最快的速度(下一次卫星通过)每6天添加一个新值。地图上的输出不仅仅是最新的值,它是基于该位置的值的整个历史记录(例如,平均值,梯度或自定义函数)计算得出的。对于更多的缩小级别,我已经在研究集群/金字塔结构,以便我将拥有一个具有平均值的表/集合,以便没有图块(查询)具有> 200,000(或50,000)个位置项目。
Azwok '16

我认为,预先计算聚合是关键-您的时间计算仍然可以批量处理。这就是OLAP系统获得快速查询性能的方式,您可能需要采用这种方法。如果您可以使用查询的一天数据,则特别有用。
ConcernedOfTunbridgeWells

如果要查询计算的平均值,则要在多少个离散位置进行采样-即,在最高缩放级别下实际位图的分辨率是多少?
ConcernedOfTunbridgeWells

我同意预先计算的总量看起来很有可能。最高缩放比例下计算出的平均值不会在一个区域内取平均值,而是在1个位置随时间变化的平均值。仅当缩小时,我才会有单独的表/集合,这些表/集合将对区域进行平均,以确保其中没有任何查询/平铺具有过多的位置点(最大50,000-200,000)。任何图块的最大分辨率为256x256像素。
Azwok '16

3

听起来好像有两类查询-一类是了解当前视图窗口内的位置,另一类是为这些点提供所需的统计信息。我的建议是为每个工具使用单独的专用工具。

我假设所有度量值都与同一组75Bn点有关。因此,这些经度/纬度一旦建立便是静态的。可以一次性将它们分组,汇总和索引。因此,我建议按区域和缩放级别进行分片。每个分片的大小将取决于每个GIS实例可实现的性能。

GIS将返回一组点,这些点将传递到时间序列数据库。这将保存测量值并执行汇总。我知道KDB。它针对证券交易,与您的方案相比,它将拥有更少的密钥,但每个密钥具有更多的数据点。

将键值从GIS服务器传输到时间序列数据库会产生成本。我的假设是,通过在特定于任务的时间序列数据库中进行更快的处理,可以收回这笔费用。从问题的措辞看来,单个实例将无法保存所有数据,因此某些跨服务器流量似乎不可避免。考虑到组件的相对速度,将密钥集发送到已缓存数据的远程服务器似乎比从本地磁盘读取数据要快。

如果测点部分和价值计算部分可以彼此局部,那么我当然希望响应速度更快。我(有限的)理解是,找到N个最接近给定点的邻居是一项艰巨的任务。这就是为什么我建议使用特定的软件来执行它的原因。如果寻找点可以减少到

where latitude between x1 and x2
and logitude between y1 and y2

然后可以使用价值存储软件处理该部分,并从架构中删除GIS。

我还没有实现这样的系统。我真的只是在这里大声思考。在PB级上,没有现成的解决方案。但是,有许多卫星数据提供商,因此您的问题很容易解决。祝好运。


同意,有两个类别。1)从多个位置绘制单个值的图片,2)在一个位置获取所有历史值。所有测量都与数十亿个位置相关,唯一的变化将是每个点的历史值数量。出于您所陈述的原因,按地区分片是我正在采用的方法。我没有考虑过将返回的值传递到单独的时间序列数据库中。我本以为选择和转移到时间序列数据库中会增加太多时间来使该方法可行,除非我误解了您的建议。
Azwok '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.