热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

面向多维度矩阵存储的海量空间数据管理模型源码分析(以TileDB为例)

先丢个石头引来金玉满堂哈,然后,以TileDB为例子介绍其基本组成结构(后期会对每一块进行优化说明),最后以高级别数据分析支持为展望云计算和大数据的新玩法和思路。空间数据管理是驱动

先丢个石头引来金玉满堂哈,然后,以TileDB为例子介绍其基本组成结构(后期会对每一块进行优化说明),最后以高级别数据分析支持为展望云计算和大数据的新玩法和思路。

空间数据管理是驱动未来诸多商业的核心所在,空间数据类型可以分为三个类型,分别是栅格数据,矢量数据以及图数据。栅格数据例如,遥感影像数据就是典型的包含诸多像素单元的正规网格化数据。矢量数据包含点、线面数据广泛用于制图社交数据分析,而以地下管网为代表的图数据存储在城市规划,地铁线路辅助设计等应用中。空间数据管理是包含数据模型,存储和索引,以及为支持空间查询、可视化分析为一体的地理信息科学。作为对科技工作者的致敬,在编辑此文时也链接了一下对中科院地理遥感与数字地球所李教授的最新关于海量矢量数据管理的文章地址(Big spatial vector data management: a review)。具体来讲,在数据模型方面,大规模使用面向对象的矢量数据管理模型。这样,以键值形式存储到NoSQL数据库中,键代表对象的唯一标识,而矢量数据结构遵从OGC的WKT格式进行内容存储。关系型数据存储很早就存在了,例如Oracle, PostgreSQL了,NoSQL数据库比较鲜明的特点是分布式,可扩展,不用预先定义表结构。另外一个较重要的原因是云原生支持。不过,NoSQL也没能改变GIS空间查询处理分析慢的根本问题。于是,大家都开始折腾以Hadoop为代表的空间数据管理模型。例如比较出名的Hadoop-GIS, SptialHadoop是建立在以HDFS和MapReuce为支撑基础上的空间数据管理方式。矢量数据的管理就介绍到这里了,本文重点关注的是同时适用于栅格和矢量数据的矩阵数据管理模型(说下背景,团队核心成员有以水利遥感以及土壤环境监测,农田水利方面的一流高校老师)。

这里要介绍的是来自VLDB的TileDB, 先说明下,Array和矩阵其实真没撒区别,按照翻译来讲,它是数组的意思,也就是多维数组存储模型,我简单叫它多维矩阵模型(数组和矩阵在这里可以互换)。与其它数组存储模型SciDB、ArrayStore相比,它支持稀疏矩阵的有效存储和访问和更新。SciDB采用正规维度分割数据块,对某一部分数据的访问通常需要读这些大的分块,对其中一个像素的更新会导致严重的写延时。和之前说的Hadoop不适合具有读写更新需求的空间数据存储一样的道理,分块冗余存储的底层设施会依据某个固定的数据分块大小存储多个数据分块,怎么弄都得全部读取分块数据(也可能分块的大小小于128MB, 具体是不是128MB,要依据Hadoop集群管理人员的策略决定),而TileDB解决了这个问题。不过,有些地方我还是不赞同TileDB的MIT大神说法(用SQL查询和处理海量矩阵数据而不用写low level程序,其实也不一定就很low,哈哈!)

TileDB数据模型包含Array,dimensions,attributes,domains , coordinates以及cells。按照中文翻译分别表示数组,维度,属性,域,坐标和矩阵单元。每一个数组都由维度和属性构成。每一维度都有其名称和类型,其取值范围构成与之对应的domain。 所有这些维度域值的任意组合构成了定位数组单元cells的坐标coordinates。每个cell存储的是属性值。这里属性有可能是0个或者多个,每个属性的值有可能是固定的1个值,也有可能是一个定长或变长值元组。属性的取值类型是原子类型(int, float或者是char), 属性的取值也可能是变长原子类型元组。 在TileDB中矩阵类型要么是稀疏的,要么是密集的,判断是撒类型取决于cell中是否有空值。为了有效地支持存储,它引入了一个叫全局单元序列(global cell order)的概念。用户首先会为这些多维数据划分空间瓦片(Space tiles),通过为每一维指定一个瓦片范围(tile extent),多维数组在逻辑上被映射成大小相等的分块(这里大小相等是逻辑上的)。用户同时也会决定如何访问分块中的数组单元cell的顺序,例如行优先,或列优先。最后,在遍历整个矩阵时,会指定tile的遍历次序,也是行优先或者列优先。这样做的好处是用户的对矩阵单元的访问会促进底层组件的物理数据的合理组织以支持有效的读操作。之前说通过指定瓦片范围来组织存储,但对于稀疏矩阵来说,空的单元或者是单元中包含变长数据都会导致瓦片的大小(这里的大小是物理上的大小)不同。从而导致对这些数据的处理会产生“任务倾斜”。还记得火热的Apache Spark么? 调度任务到数据所在的位置,数据积累的越多,任务调度的也越多,延时就越大,道理一样的就不多说了。 至于如何解决这个问题,TileDB给出了答案,它用一个叫data tile的逻辑概念表示非空数据单元的集合。用capacity表示在一个data tile 中非空单元的个数。这样还是可以依据之前说的全局单元序列来管理稀疏矩阵。在介绍矩阵压缩,跟踪数组元素的更新操作以及矩阵元数据管理和分析源代码前,本文先介绍其系统架构以及矩阵的物理存储模型。

如图1所示,存储管理器保持对所有已打开矩阵的状态管理,C-API表示向外部暴露的数组操作接口,主要有初始化,读写,合并以及表示完成操作。每一个已打开数组的分片元数组(fragment)也会被保存到进程的堆空间中,这样多线程可以共享访问这些分片元数据。这里说的fragment,可以简单理解为对矩阵进行更新的时间戳标识的镜像数据,这种镜像数据通常是原始矩阵中的某些子区域变化产生的新的数据区域。这样分片的累加就会形成当前矩阵的最终表示,主要是为了促进读写效率。

《面向多维度矩阵存储的海量空间数据管理模型源码分析(以TileDB为例)》
《面向多维度矩阵存储的海量空间数据管理模型源码分析(以TileDB为例)》

图1,系统架构图

对于TileDB的物理存储来讲,每一个array,都会有一个文件目录对齐进行存储。在这个文件目录中,该矩阵的每一个分片数组(fragment)都会对应一个目录进行存储。此外,还包含一个特别的目录专门用于存储array schema的二进制表示。在分片数组(fragment)目录中按照每一属性对应一个文件的方式进行存储。特别需要注意的是,属性文件中的内容为按照global cell order(GCO)遍历的属性数据二进制值。 此外,在分片数组(fragment)目录还包含一个专门的文件用于存储分片元数据的二进制值。举例说明,一个矩阵包含两个属性a1, a2,这两个属性分别是定长数据类型整形,一个是变长数据类型,GCO遍历的模式指定为空间瓦片范围2×2,瓦片在矩阵上的遍历顺序按行优先策略,在瓦片中的数组单元遍历策略按行策略。这样对于固定属性来说,在数组对应的分片文件中生成一个a1.tdb文件,存储其二进制内容,对于变长属性来说,除了存储其数组单元的值之外,同样存储的另外一个文件存储说明其在矩阵中的数据偏移位置。

《面向多维度矩阵存储的海量空间数据管理模型源码分析(以TileDB为例)》
《面向多维度矩阵存储的海量空间数据管理模型源码分析(以TileDB为例)》

图2,密集矩阵的物理存储

作为结束,本文先不继续讲解稀疏矩阵的物理存储(存储的方式都差不多),为了支持对海量高维数据分析,arrayudf已经被正式提出了(还不清楚的google一下)。它使得,之前说的用声明式的语言描述所要访问数组元素以及对这些元素进行操作成为可能。从本质上来讲,TileDB只是做了简单的矩阵存储操作,为了支持快速的分析,我们将会在云计算和大数据栏目介绍新的解决思路。后续会依次补充源代码分析,架构演化以及实际应用效果。和以前读博一样,依然坚持在深夜写这些觉得还算有用的内容,希望能持续这种状态,不多说了下次再见!


推荐阅读
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  •        在搭建Hadoop环境之前,请先阅读如下博文,把搭建Hadoop环境之前的准备工作做好,博文如下:       1、CentOS6.7下安装JDK,地址:http:b ... [详细]
  • 我们在之前的文章中已经初步介绍了Cloudera。hadoop基础----hadoop实战(零)-----hadoop的平台版本选择从版本选择这篇文章中我们了解到除了hadoop官方版本外很多 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 对于开源的东东,尤其是刚出来不久,我认为最好的学习方式就是能够看源代码和doc,測试它的样例为了方便查看源代码,关联导入源代 ... [详细]
  • 《Spark核心技术与高级应用》——1.2节Spark的重要扩展
    本节书摘来自华章社区《Spark核心技术与高级应用》一书中的第1章,第1.2节Spark的重要扩展,作者于俊向海代其锋马海平,更多章节内容可以访问云栖社区“华章社区”公众号查看1. ... [详细]
  • 伸缩性|发生_分布式文件系统设计,该从哪些方面考虑?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了分布式文件系统设计,该从哪些方面考虑?相关的知识,希望对你有一定的参考价值。点击上方关注“ ... [详细]
  • MapReduce工作流程最详细解释
    MapReduce是我们再进行离线大数据处理的时候经常要使用的计算模型,MapReduce的计算过程被封装的很好,我们只用使用Map和Reduce函数,所以对其整体的计算过程不是太 ... [详细]
author-avatar
奋怒的小超_656
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有