铜仁市论坛

首页 » 分类 » 问答 » GI并行编程模型MR编程基于八叉树子
TUhjnbcbe - 2021/3/2 16:57:00
北京治白癜风效果好的医院 http://pf.39.net/bdfyy/bjzkbdfyy/

引子:GI的分布式计算框架的设计与研发,以RPC调用接口为基础,以GenericProgramming思维抽象分布式计算需求的各类TRAITS,借鉴谷歌等最新并行编程模型,分别开发了针对大数据量三维地震(数字岩心)算法的、基于八叉树子块数据文件的MR并行编程模型;针对复杂的三维盆地模拟有限元、有限体积数值模拟流程、体现三维地质建模特点的计算图并行编程模型;以及在传统HPC发展起来、针对大型稀疏矩阵的MPI并行编程模型。

目前,GI支持面向叠前(后)地震数据的属性分析、反演算法的MR分布式计算;今年,结合三维地质随机统计反演算法的全新实现,增加对分布式贝叶斯推断的支持。

地震勘探所产生的数据量在大幅增长,海量数据的产生虽然很好地反映了社会对石油、天然气等资源的极大需求,但是大规模的数据的处理问题也给地震勘探行业带来严峻的挑战。为了解决访问方法优化开发的瓶颈和存储服务器更新代价两方面问题,使用地震数据分布式存储策略可以用来提高设备利用率。地震勘探产生的海量数据所带来的问题是多方面的,包括存储、读取、冗余、抽取等。在实际情况中,读取地震数据需要考虑用户的具体情况,满足用户的需求,这一般体现在读取数据的速度和效率方面,同时还需要考虑到地震数据本身的特点。

获取的地震资料的量级随着地震采集及电子扫描技术的发展快速增长。特别是,单个大文件I/O节点不仅因大量数据交换而变得很慢,还存在单点故障、容易造成集群瘫痪等实际问题。尽管用来处理数据的计算机性能在不断提高,但数据规模爆炸式的增长仍然超越了内存的发展速度。从存储、加载到显示,需要重新审视现有的主流文件存储格式,并配套研发相适应的渲染、大数据挖掘等一系列支持大数据体的核心技术。在实际地震资料的处理时,影响数据处理效率的因素有很多,从整体上说,影响地震数据处理效率主要分为软件和硬件两个方面,也就是访问方法和访问环境的配置。但是由于访问方法的不断开发优化和服务器存储访问环境的更新需求造成了巨大的经费开销的同时访问方法的优化也越来越困难。

充分体现谷歌MR并行编程模型要点的面向分布式存储的批处理框架

在满足大数据量地震、数字岩心及测井数据的高效、高可靠性分布式存储前提下,需要形成配套的大数据分析技术来挖掘潜在的油气资源价值。大规模并行计算机的并行处理系统,以及发展基于工作站集群的并行处理系统是目前较为主流的粗粒度并行处理应用框架。配套的编程模型包括利用消息传递(如,MPI)等软件开发技术实现并行编程模型、数据并行编程模型、消息传递并行编程模型等。不同编程模型的取舍及实现的复杂度主要体现在——合适的并行粒度需要根据计算量、通信量、计算速度、通信速度进行综合平衡,同时设法加大计算时间相对于通信时间的比重,减少通信次数甚至以计算换通信等。考虑不管何种并行编程模型,均涉及任务划分、通信分析、任务组合及处理器映射等关键环节,GI采用谷歌提出的Map-Reduce(也称“批处理”)编程模型,是为处理大数据的计算任务而设计的,适用于大规模数据集的并行分析计算。批处理框架设计初衷很简单,就是“分而治之”的想法——即把一个任务分割成多个小任务,并且将多个小任务在不同的机器上进行计算(Map),最后再将计算结果根据约定的规则整合(Reduce)到一起,得到最终计算或分析结果。PetroV的任务管理服务根据待处理分布式文件大小及计算性质,分配适合的Mapper及Reducer任务服务个数,通过心跳、消息传递、广播、事件服务以及远程过程调用(RemoteProcedureCall,RPC)等多种异步调用机制调度宕机的任务服务及发现新加入的任务服务,并合理安排批处理计算过程(图10,虚线以上代表MAP阶段,以下代表REDUCE阶段)。

以地震属性分析为代表的MapReduce分布式并行实现

当下,上TB甚至PB的叠前(后)地震数据由于采用的是直接存储整个大数据文件的方式,面向集群的大文件存取存在着对存储和执行环境要求高、网络互连设备昂贵、地理上连接距离有限、需要配备专业人员维护、访问速度瓶颈等问题。特别是,单个大文件I/O节点不仅因大量数据交换而变得很慢,还存在单点故障、容易造成集群瘫痪等实际问题。单机环境地震属性分析计算比较耗时,使用GI的MR分布式并行框架,可以缩短计算时间。相比于传统方法,使用分布式并行框架完成地震属性分析相关计算用时明显减少,并且计算用时随着集群中节点数目的增加而减少。

在使用分布式架构存储地震数据的基础上,如何生成分布式地震数据文件,怎样提升生成速度是重点,其需要考虑的因素是多方面的。首先需要解决的问题是文件读写速度如何做到最快,其次要考虑到带宽、存储空间等因素,最终实现一个快速分布式切分方法。GI利用三维空间下八叉树结构与编码的快速空间定位机制,实现对三维大数据体的结构分块存储,同时根据硬盘数据访问特点及分布式环境特性,实现了对分布式切分和地震属性分析为代表的地震解释算法的速度优化。

1、本地SEGY文件的八叉树分块分布式存储

地震数据可以看做一个三维的数据立方体,长宽高分别对应主测线,联络线和深度。通过配置小立方体的长宽高,和源地震数据的长宽高比较,得到源地震数据在三个方向上与小立方体三个方向上长度的比值,取比值最大的一个方向并计算满足大于此比值的最小的2的次幂,这个次幂数即为八叉树切分的层级数。对地震数据按照设定的小立方体大小进行切分,生成若干子块文件,实现八叉树结构的地震分块存储。本方法中只切分生成最终一级的子块,其他层级的子块并不进行切分生成。

将子块文件传输到不同存储节点中进行存储,实现分布式存储。分布式存储的结构包括local(本地)、master(存储管理服务)、chunk(子块存储服务)三个类型的对象,其中local(本地)存放了待切分的源地震数据,master(存储管理服务)中存放切分和chunk(子块存储服务)节点的参数配置,chunk(子块存储服务)节点中存放切分生成的子块以及包含源地震数据测网信息的索引文件。master(存储管理服务)及chunk(子块存储服务)节点会运行数据存取服务程序,其可以实现不同计算机之间的数据发送和接收功能,此服务程序基于RCF(RemoteCallFramework,远程调用框架)的开源代码实现,此处不展开叙述。PetroV将子块平均分配传输到各个chunk(子块存储服务)节点中,实现分布式存储。

2、部署映射与归并服务

对批处理编程模型而言,任务划分与高效执行是建立在合理的数据粒度切分基础上。谷歌提出的map-reduce(映射归并)编程模型,是为处理大数据的计算任务而设计的,适用于大规模数据集的并行分析计算。map-reduce(映射归并)设计初衷很简单,就是“分而治之”的想法——即把一个任务分割成多个小任务,并且将多个小任务在不同的机器上进行map(映射),最后再将计算结果根据约定的规则reduce(归并)到一起,得到最终计算或分析结果。本方法中的map-reduce(映射归并)是面向地震数据分析的服务,可执行常见的切片、地震属性分析及反演等算法,每一个mapper(映射服务)或reducer(归并服务)本身又是一个多线程执行框架。

映射归并服务的结构包括Jobservant(任务管理服务),mapper(映射服务),reducer(归并服务),配置包括服务器的地址、端口、工作路径设置,服务之间的数据传输基于RCF(RemoteCallFramework,远程调用框架)的开源代码实现,实现心跳、消息传递、广播、事件服务等多种异步调用机制调度宕机的任务服务及发现新加入的任务服务,并合理安排计算过程。

配置Jobservant(任务管理服务)时,需要将mapper(映射服务),reducer(归并服务)的配置添加进去使其可以管理他们。另外,需要将master(存储管理服务)的配置传给Jobservant(任务管理服务)以供mapper(映射服务),reducer(归并服务)从chunk(子块存储服务)下载子块文件。如图2左上角部分所示,从本地初始化映射归并服务,将映射和归并的配置传给Jobservant(任务管理服务),后者在需要下载子块数据进行计算时继续向元数据服务即master(存储管理服务)索取。

在进行映射归并时,流程如图2所示,其包括任务的切分及调度策略的执行,根据当前分布式存储文件的实际网络存储位置及待分析任务的实际计算要求,以最佳“负载均衡”策略安排mapper(映射服务)和reducer(归并服务)。一次映射归并的计算流程为,首先用户配置好的属性计算参数传给mapper(映射服务),reducer(归并服务),他们从分布式文件数据块按照约定的计算数据体大小获取所有计算单元(MapStart),通过遍历分布式地震数据子块(Map),提取数据,然后遍历每个子块中的数据,以键值对(key-value)为单位进行计算。键值对是指地震数据体的空间位置范围与范围对应的地震数据组成一对对应关系的结构体,对键值对中的数据进行属性求取,求取是由多线程并行框架执行,并将计算结果写到mapper(映射服务)结果文件中,然后将文件传给reducer(归并服务)。在确认所有mapper(映射服务)完成中间分析结果后,异步消息激活reducer(归并服务)工作,在那边进行归并,遵循键值对提取同一类别中间计算结果(ReduceStart),遍历并根据约定的算法归并最终数据块文件(Reduce),形成并建立分布式结果存储文件结果(ReduceChunk),得到最终的计算结果,然后上传到chunk(子块存储服务)节点中,完成分布式映射。同样,reduce(归并)的过程也是基于多线程并行框架执行。

在map-reduce(映射归并)时,一些关键的步骤如图3所示,mapper(映射服务)从不同的chunk(子块存储服务)获取待处理的粗粒度数据文件并读取键值对(key-value),执行匹配的地震属性求取函数,中间产生的结果存储到圆形内存缓冲区(先进先出类型),达到阈值后写入本地硬盘并初步归并(Combine)形成面向不同reducer(归并服务)的子块文件,便于上传到对应的reducer(归并服务)。Jobservant(任务管理服务)通知reducer(归并服务)所属的子块文件都在哪些mapper(映射服务)里并进行下载。当reducer(归并服务)把所有它负责的中间键值对都读过来后,先对它们进行归并排序形成中间临时文件,使得相同键的键值对聚集在一起。reducer(归并服务)遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce(归并)算法函数,该函数产生的输出会添加到最终的输出文件中。

3、配置地震属性分析(计算)参数

地震数据属性求取模块参数配置包括计算的测网及深度范围,不同的地震属性计算有各自特有的计算参数,如三角滤波属性的计算,包括滤波器参数,频率范围等配置,输出为4个地震数据体和6个地震数据切片。GI用对不同属性模块采用不同的参数结构进行存储,并发送给分布式服务。

另外,还需要配置分布式相关参数,包括Jobservant(任务管理服务)的地址和端口号,用来在本地建立与其连接的接口服务,将属性求取任务传给它。同时,最终的输出结果一方面下载到本地,另一方面也会存放到chunk(子块存储服务)节点中,以便以后直接下载,用户需要输入此结果的分布式文件名称用来生成分布式结果文件。用户建立分布式文件名后,master(存储管理服务)会建立这个分布式文件名对应的一整套参数,包括各个chunk(子块存储服务)节点所负责的子块,各个子块的文件名等,子块的切分与分配方式与源数据相同即可。

4、分布式映射(map)计算

一次完整的分布式实现流程如图4所示,首先通过Jobservant(任务管理服务)获取到mapper(映射服务)和reducer(归并服务)的地址并初始化与他们连接的接口服务,接下来Jobservant(任务管理服务)会为他们分配各自负责的子块文件。mapper(映射服务)和reducer(归并服务)都是有多个的,分配时,先获取各自工作路径所在硬盘的剩余空间,在平均分配子块的基础上,超出存储空间的不再继续分配子块。各个mapper(映射服务)和reducer(归并服务)所负责的子块配置好后,本地将地震属性求取参数传给他们,mapper(映射服务)开始进行映射,同时mapper(映射服务)建立与reducer(归并服务)的连接接口,当自身的计算完成后将计算结果发送过去。reducer(归并服务)继续将映射结果归并并生成最终的计算结果,然后传回本地及chunk(子块存储服务)节点,实现结果的分布式存储。

一次map(映射)的具体流程如图5所示,

(1)首先从chunk(子块存储服务)节点下载源地震数据的索引文件获取测网参数,然后结合传过来的地震属性求取参数,得到输出的测网范围,写成一个参数文件发送到chunk(子块存储服务)节点中,发送过去的路径即用户配置的分布式结果存放路径;

(2)遍历其负责的各个子块文件,从master(存储管理服务)向chunk(子块存储服务)节点下载子块文件,同时生成子块所属的键值对。键值对是根据八叉树算法得到子块在源地震数据中的空间位置范围,得到子块的主测线号、联络线号、深度三个方向上的范围,形成一组键值对,每个键值对包括主测线号、联络线号,以及深度范围,其中深度范围即子块的深度范围,主测线号、联络线号是子块在这两个方向上所包含的所有号。即每个键值对表示子块在深度方向上的一整条。然后初始化此子块的计算结果输出文件,即通过子块的名称,拼接”_result”后缀来表示输出文件名;

(3)获取当前子块的键值对数据,即依次从子块中读取深度上的一整条数据,存放到键值对中。对于叠前地震数据,同样的主测线号、联络线号对应的是多条数据而不是一条数据,将它们都读取出来顺序放到键值对中,数据的条数可以从源地震数据测网信息中得到。然后对每个键值对进行属性求取,即通过传入的属性求取参数,运行地震属性算法,并将输出写回键值对,此时键值对中存放的为输出结果。本方法中地震属性的输入输入数据量可能不同,例如三角滤波,输入一个地震数据,输出4个地震数据及6个切片,那么键值对中存放的格式为顺序存放4条计算结果,然后再存放6个计算结果;

(4)当计算过的键值对达到设定的内存数量限制时,将键值对写到对应的输出文件中,写入整个键值对结构体,包括主测线号、联络线号、深度范围和计算结果。当一个子块计算完毕后,提交当前内存中的所有键值对到对应的结果文件中;

(5)发送这些结果文件到reducer(归并服务)节点中,对于具体一个结果文件,其对应一个子块,拥有一个子块编号,首先向Jobservant(任务管理服务)获取各个reducer(归并服务)所负责的子块编号,然后将这个子块传到负责它的reducer(归并服务)中。

4、分布式归并(reduce)计算

当所有节点的映射计算完毕后,一次reduce(归并)的具体流程如图6所示,

(1)初始化输出文件,分为两部分,一部分为单一的一个文件”reduceresult.afs”,存储此reducer(归并服务)所有的结果,用来本地下载并读取;另一部分为按子块结构组织的一批文件,存放各个子块的计算结果,之后会上传到chunk(子块存储服务)节点,实现结果的分布式存储;

(2)遍历其所负责的所有子块,对每个子块,获取其含有的键值对数据,方法为直接读取对应的mapper(映射服务)传过来的结果文件内容得到键值对数据。然后遍历这些键值对,进行reduce(归并),基本内容是将这些键值对合并起来,去掉键值对信息只保留数据部分,形成八叉树子块。对涉及到需要键值对间计算的部分,例如有些属性求取不能仅通过对单一的键值对数据计算得到结果,还需要周围键值对数据共同生成结果,即“面元”计算,则进行相应的处理,如3x3面元,则对每个键值对结合周围8个键值对共同生成结果;

(3)当计算过的键值对达到设定的内存数量限制时,将键值对写到对应的输出文件中,对于”reduceresult.afs”写入整个键值对结构体,包括主测线号、联络线号、深度范围和计算结果;对于按子块结构组织的一批文件,只写入具体数据即可。当一个子块计算完毕后,提交当前内存中的所有键值对到对应的结果文件中;

(4)发送这些结果文件到chunk(子块存储服务)节点中,对于具体一个结果文件,其对应一个子块,拥有一个子块编号,首先向master(存储管理服务)要到各个chunk(子块存储服务)存储的子块编号,然后将子块传输到负责它的chunk(子块存储服务)中;本地下载”reduceresult.afs”读取其中的键值对,按照键值对的位置信息写入到新建的输出数据体或切片中,完成分布式结果的下载。

至此,地震数据分布式属性求取流程完毕。

部分泛化代码:

预览时标签不可点收录于话题#个上一篇下一篇
1
查看完整版本: GI并行编程模型MR编程基于八叉树子