GI的自主八叉树分布式存储学以致用,体现大数据量三维地震数字岩心格式特点的高性能分布式存储

Posted GI 地质智能软件平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GI的自主八叉树分布式存储学以致用,体现大数据量三维地震数字岩心格式特点的高性能分布式存储相关的知识,希望对你有一定的参考价值。

引子:针对从盆地到单井的地质编图、影像数据、二维数字岩心数据等,GI提供了自主空间数据库存储机制。应对盆地级大数据量上述类型的基础数据时,可基于mysql多库部署并进行水平切分。考虑地震、数字岩心等数据存储的特殊性、诸如中国石化12家油田(不同地理位置)大数据量地震数据子块文件一致性管理、底层C++代码的性能因素等等因素,参考GFS技术规范及HADOOP相关技术白皮书,GI积极实践了自主的八叉树分布式存储框架。


   谷歌分布式文件系统(GFS,Google File System)及配套大数据存取、分析技术的发展,为油气勘探开发领域大数据存储和处理高并发请求及海量数据处理的软件体系架构设计带来不一样的思考:区别于集群方案中的纵向扩展(提升每个节点的服务器性能),通过横向扩展(增加更多的廉价计算机)来提升分布式系统的整体性能;‚由成本低廉的PC服务器组成的集群,在性能方面能够达到或超越大型机的处理性能,但在成本上远低于大型机;ƒPC服务器在硬件可靠性方面比大型机有差距,但是通过配套开发的分布式存储及分析技术来对硬件进行容错,保证整体系统的高可靠性;„通过网络松散耦合的分布式系统,尽可能减少节点间通信,确保单个节点的性能高低对分布式系统整体性能影响不大。

   参考GFS设计理念和消化其关键分布式技术,GI实践了基于远程过程调用(Remote Process Calling, RPC)的新一代分布式存储框架。新的软件架构设计凸显了对大数据管理和分析能力的支持,同时满足低成本软件部署的要求;支持非高性能(廉价)计算机即为“存储”或“计算”节点,易组建低成本企业级勘探部署规划协同工作环境 —— 将安装了GI系列版本专业软件的所有计算机视为一台计算机,计算资源的配置对于用户而言是透明的,大幅降低系统部署的复杂度、降低成本并提高资源使用的灵活性。尤其,后续提出的基于地理网格剖分和地质编码的数据文件命名机制,为超大体量、地理远隔的不同公司的地震等数据的“抓取”与管理,提供了一致性的分布式文件存取接口。

   

主流存储格式比对

  SEG-Y格式是用来存储地震数据的通用格式。在数据量较大情形下,SEG-Y不利于地震道数据的随机读取和快速访问。地震道沿着一条测线(inline)方向连续存储,沿着该方向可连续读取数据。但沿着另外两个方向获取数据时,由于无法从文件中连续读取,效率是比较低的。三维数字岩心的RAW格式按扫描行存储,存在同样的访问瓶颈问题。可见,从SEG-Y或RAW文件中获取子体或立方体范围数据比较困难。业内诸多公司一直致力于高效叠前数据存取技术的研发,如“道集索引”和“简单分块”存储技术等(表)。道集索引技术强调地震道数据按照SEG-Y模式独立存储外,提前扫描所有地震道头信息,建立体现不同哈希策略的索引文件,用于快速定位不同叠前道集所处道集数据存储的文件位置,地震道的存储还是按照测线方向组织。简单分块技术通过约定Inline、Xline和采样范围,分块存储地震道数据,块内地震道数据存储顺序与SEG-Y一致。GI不再遵循SEG-Y地震道存储顺序,结合八叉树编码与空间位置转换技术以及参考吉林大学白鑫的研究成果,充分利用八叉树结构与编码的多分辨率机制,实现对三维大数据体的结构分层(多分辨率)、分块存储。八叉树分块存储在兼顾了不同方向的快速数据访问的基础上,能够实现不同分辨率条件下的三维数据体的实时渲染(表1,地震数据体线、道、深度数分别为a、b、c,简单分块大小是16×16×16,立方体查询的Inline数为x,Xline数为y,采样点数为z)。



八叉树编码与分块存储

   八叉树空间结构的三维空间编码主要采用的是线性莫顿(Morton)编码。八叉树节点体现了空间坐标信息,同时易于实现自然数的映射,即某一体数据块的具体文件存储位置。莫顿码本质上是一种八进制码,每一位八进制数位可以看成3位二进制数,由所在节点的空间位置编码而来(其中,n表示子体数据块所处的空间结构位置):Morton= [(x0,y0,z0),(x1,y1,z1),…,(xn-1,yn-1,zn-1)]。考虑到图中不同层级的子块的莫顿码可能相等,需要对整个八叉树的所有子块进行自然数排序的编码(Tile ID)。数据切分、存储时,通过定义三维叠前地震数据或数字岩心数据及最小切分数据块范围,从测网到空间坐标转换为不同层级(不同分辨率)莫顿码,排序不同层级子块定义自然数编码(Tile ID),进而映射到不同体数据块文件存储位置。读取子块数据时,当给出三维空间数据获取范围时,通过计算八叉树中所在的空间位置得到莫顿码,进而以子块自然数编码(Tile ID)为索引定位体数据在文件中的存储位置;同样,给出数据存储位置,也可以计算子块自然数编码(Tile ID),得到它在体数据或八叉树中的空间位置。


分布式存储框架

   框架由元数据服务(CGFSMasterServant)和子数据块存取服务(CGFSChunkServant)组成。框架屏蔽了基于八叉树切分后地震、数字岩心数据块在上百台计算机的后台冗余或备份存储的事实,实现了几乎与单机文件系统接口一致的分布式文件存取接口,完成对整个分布式文件系统的访问及修改操作。CGFSMasterServant通过维护元数据表,实现虚拟分布式文件存储目录(也称命名空间)。目录体系可被完全加载到内存中,快速计算并反馈每一分布式文件特定偏移量的体数据块存取服务所在的网络位置信息;元数据表的属性主要包括文件到数据块的映射信息、文件及数据块的访问权限、数据块版本信息及所在数据块服务状态等;元数据表的操作是原子性的,并用日志记录操作顺序并备份到影子服务,便于宕机恢复;同时元数据服务通过心跳等机制随时知晓每一体数据块存取服务的状态,并能够及时发现新加入的数据服务,用于新的数据块文件的存储或备份。八叉树切分后体数据块作为独立单一文件,通过简单取余(Robin)或一致性哈希策略,分配到不同CGFSChunkServant。通过元数据服务定位后,客户端主要与特定的数据服务完成大数据量的读取动作。需要注意的是,八叉树切分的粒度并不是GFS建议的64M,而强调地震数据切分粒度,有助于尽量减少CGFSMasterServant与CGFSChunkServant之间以及以地震剖面显示为代表的客户端与CGFSChunkServant之间的交互次数,充分利用现有网络带宽。分布式存储框架的通信渠道主要表现为通过周期性心跳机制,元数据服务及时获取新增、删除以及运行中数据块服务的信息。数据传输渠道主要表现为客户端与不同数据服务之间的读、写操作。

【GI的自主八叉树分布式存储】学以致用,体现大数据量三维地震、数字岩心格式特点的高性能分布式存储

【GI的自主八叉树分布式存储】学以致用,体现大数据量三维地震、数字岩心格式特点的高性能分布式存储


地震子块文件切分


  (1)SEG Y到子块文件

将源地震数据预切割成多份中间文件,每份中间文件对应一个存储节点。然后将中间文件传输到对应的存储节点中。如图7左半部分所示,以顺序读源文件、顺序写中间文件的方式来最大限度地减少本地时间开销,将中间文件传输到存储节点后,本地地震数据文件的切分就已经完成。

【GI的自主八叉树分布式存储】学以致用,体现大数据量三维地震、数字岩心格式特点的高性能分布式存储

                 地震数据子块文件切分与存储


  (2)读取子块文件合并为SEG Y文件

   对于分布式的数据体,可以再转换回本地的SEG Y数据体。如图8所示,方法与生成相反,首先对于各个存储节点,将子块合并回中间文件,然后将中间文件下载到本地,本地再将这些中间文件合并为本地数据体。


440GB叠前地震数据的切分与合并

   采用某工区的全方位共反射角道集,进行了多次分布式文件的生成与读写操作,目的在于验证:普通廉价计算机和低带宽网络环境下,相对于单机本地访问SEG Y文件,PetroV DFS的网络数据传输时间增加并不明显,但新建的分布式文件对后续系列高计算强度要求的解释算法的支撑,是单机本地文件无法做到的。试验选定的叠前地震道集是通过广义kirchhoff偏移获取的深度域共成像点道集,大小440GB,inline范围从1332到1732,共401条纵测线;xline范围从1502到1402,共401条联络测线;共有160001个CDP点,每个CDP点处为一个1000道的叠前道集,因此总共有160000001道,每道有751个采样点。测试对象是24台2010年购买的服务器,远低于现今主流服务器配置。


  经过多次试验,440GB地震文件的分布式存、取稳定。以分布式文件的写入为例,总体时间为9小时40分左右,包括:第一步, 扫描整体道头的时间为5小时10分,这是不同类型软件应用SEG Y地震数据必须的一步【11-13】。后续道头扫描会基于第一次扫描建立的索引文件,在5分钟内完成所有道头扫描;第二步,按照八叉树算法切割SEG Y文件,形成本地中间文件,异步上传对应存储节点,时间为4小时7分;第三步,每一存储节点最终形成440GB对应 的分布式子块文件的时间为21分。


三维数字岩心八叉树切分

   对于三维数字岩心数据,首先计算八叉树的层数,其满足关系:2^(层数-1)*子块像素长度>=文件像素长度,2^(层数-1)*子块像素宽度>=文件像素宽度,2^(层数-1)*子块像素深度>=文件像素深度。对于三维数字岩心数据,按照八叉树每个子块编码的顺序从小到大依次取每个块所对应的位置中的岩心数据,八叉树子块编码与对于位置的转换方法已有较多资料介绍,此处不再展开叙述。假设实际数字岩心的八叉树有5层,子块的个数为8^(5-1)=4096个。每个子块读取的数据量大小由用户设定的子块大小决定,子块大小为128*128*128,所以每次取2M的数据,对于处于边界区域的子块,其长、宽度或深度可能达不到设定的子块大小,只取到边界即可,对于长度、宽度或深度为0,或者编码所对应区域已超出文件长、宽、深度值,则生成空子块。数字岩心数据量较大,可以采用多线程的方式进行读取,三维数字岩心线程数量可设为8的若干次幂将需要读取的子块总量按照线程数量进行平分,每个线程读取自己那部分子块。

以上是关于GI的自主八叉树分布式存储学以致用,体现大数据量三维地震数字岩心格式特点的高性能分布式存储的主要内容,如果未能解决你的问题,请参考以下文章

在八叉树中合并叶子

PCL学习八叉树

空间划分的数据结构(四叉树/八叉树/BVH树/BSP树/k-d树)

3d激光雷达开发(八叉树)

octomap点云压缩

PCL:八叉树Octree实现点云K近邻搜索