G06T1/60 G06F16/51 G06F16/172 G06F16/182 G06F12/02
1.一种面向遥感影像数据的高效缓存方法,其步骤为:
1)各Data节点将收到的单个原始遥感影像数据文件从逻辑上分为多个固定大小的数据块,并将原始的遥感影像数据文件保存在存储系统中;各Data节点将申请到的内存空间分割为多个固定大小的内存块并将其放到空闲队列中;其中,数据块大小与内存块大小匹配;
2)当Data节点收到客户端的数据写入请求时,该数据写入请求包括数据写入的文件路径、数据写入位置、待写入数据;Data节点根据该数据写入请求中的数据写入位置、待写入数据的长度计算出涉及到的数据块编号;然后根据所述数据块编号查询本地内存是否存在对应的数据块,如果存在,则将对应的数据块移动到可写队列中,然后将数据写入这些数据块,如果不存在,则该Data节点与Master节点建立连接,查询所需数据块是否存在于邻居节点,如果存在,则从邻居节点拉取所需数据块到该Data节点的可写队列,否则从该Data节点的空闲队列中申请未使用的内存块放到该可写队列中,并将存储系统中所请求文件对应位置的数据加载到对应的内存块中,如果对应位置没有数据,则保留该位置对应的内存块为空,然后把待写入数据写入到所申请内存块中,最后将所有发生变化的内存块的元数据信息发送给Master节点进行更新;其中,文件对象为存储系统所存储文件的抽象,包含文件名和数据块信息。
2.如权利要求1所述的方法,其特征在于,当Data节点收到客户端的数据读取请求时,首先检查本地是否存在与所请求文件相对应一个文件对象,如果存在则将该文件对象返回给客户端,如果不存在则新建一个空的文件对象,然后根据该数据读取请求中的数据位置与数据量确定相关联的数据块编号,然后根据文件名与数据块编号查询对应数据块是否已全部加载到该Data节点内存,如果未全部加载,则该Data节点将文件名、文件唯一标识号、所需数据块的编号发送给Master节点进行查询,然后根据Master节点的反馈确定该Data节点所需数据块是否在邻居Data节点,如果是则直接从邻居Data节点获取对应数据块加载到该Data节点内存,否则从存储系统读取到该Data节点内存并更新对应的索引信息;当所有需加载数据块都已加载到该Data节点内存后,将根据该数据读取请求所加载数据块关联到该新建的文件对象上,然后将所请求的内存块中的数据返回给客户端;其中,该数据读取请求包括文件路径、读取位置、数据量。
3.如权利要求1或2所述的方法,其特征在于,当有多个邻居节点上存在所需数据块时,则根据当前的网络状态选择其中一个邻居节点作为数据传输对象;其中,衡量网络状态的指标包括TTL、邻居节点的当前连接数。
4.如权利要求1所述的方法,其特征在于,所述可写队列中的数据块由客户端调用相关接口强制写回存储系统以做持久化存储,或者由Data节点根据设定的时机进行批量回写操作存储系统以做持久化存储。
5.如权利要求1所述的方法,其特征在于,各Data节点周期性的通过心跳信息探测本节点到所有其他节点的TTL,并将自己当前维护的数据连接数一并上传至Master节点。
6.如权利要求1所述的方法,其特征在于,为每个加载到Data节点内存的数据块设置一个与之关联的版本号,每修改一次数据块则将其版本号加1。
7.如权利要求6所述的方法,其特征在于,数据块的版本信息存储于Master节点的全局元数据库中,客户端在读取一Data节点上的数据块之前,需要比对该Data节点上此数据块的版本号与Master上该数据块的版本号是否一致,如果版本号一致,则返回该Data节点上的数据块,否则由Master确定当前包含该数据块最新版本数据的邻居节点,并将该邻居节点信息告知该Data节点,由该Data节点从该邻居节点加载最新版本数据,如果所有邻居节点都不包含该数据块最新版本数据,则从存储系统加载该数据块最新版本数据。
8.一种面向遥感影像数据的高效缓存系统,其特征在于,包括一Master节点和若干Data节点,Master节点与各Data节点之间连接,以及各Data节点之间彼此连接;各Data节点分别与一存储系统连接;其中,
Master节点,用于管理全局元数据信息,记录了当前存储系统包含的存储节点,以及已加载到内存的遥感影像所包含的数据块的位置、版本信息;
Data节点,用于将收到的单个原始遥感影像数据文件从逻辑上分为多个固定大小的数据块,并将原始的遥感影像数据文件保存在存储系统中;以及将申请的内存空间分割为多个固定大小的内存块并将其放到空闲队列中;其中,数据块大小与内存块大小匹配;
当Data节点收到客户端的数据写入请求时,该数据写入请求包括数据写入的文件路径、数据写入位置、待写入数据;Data节点根据该数据写入请求中的数据写入位置、待写入数据的长度计算出涉及到的数据块编号;然后根据所述数据块编号查询本地内存是否存在对应的数据块,如果存在,则将对应的数据块移动到可写队列中,然后将数据写入这些数据块,如果不存在,则该Data节点与Master节点建立连接,查询所需数据块是否存在于邻居节点,如果存在,则从邻居节点拉取所需数据块到该Data节点的可写队列,否则从该Data节点的空闲队列中申请未使用的内存块放到该可写队列中,并将存储系统中所请求文件对应位置的数据加载到对应的内存块中,如果对应位置没有数据,则保留该位置对应的内存块为空,然后把待写入数据写入到所申请内存块中,最后将所有发生变化的内存块的元数据信息发送给Master节点进行更新;其中,文件对象为存储系统所存储文件的抽象,包含文件名和数据块信息。
9.如权利要求8所述的系统,其特征在于,当Data节点收到客户端的数据读取请求时,首先检查本地是否存在与所请求文件相对应一个文件对象,如果存在则将该文件对象返回给客户端,如果不存在则新建一个空的文件对象,然后根据该数据读取请求中的数据位置与数据量确定相关联的数据块编号,然后根据文件名与数据块编号查询对应数据块是否已全部加载到该Data节点内存,如果未全部加载,则该Data节点将文件名、文件唯一标识号、所需数据块的编号发送给Master节点进行查询,然后根据Master节点的反馈确定该Data节点所需数据块是否在邻居Data节点,如果是则直接从邻居Data节点获取对应数据块加载到该Data节点内存,否则从存储系统读取到该Data节点内存并更新对应的索引信息;当所有需加载数据块都已加载到该Data节点内存后,将根据该数据读取请求所加载数据块关联到该新建的文件对象上,然后将所请求的内存块中的数据返回给客户端;其中,该数据读取请求包括文件路径、读取位置、数据量。
10.如权利要求8或9所述的系统,其特征在于,为每个加载到Data节点内存的数据块设置一个与之关联的版本号,每修改一次数据块则将其版本号加1。
本发明以同一个集中多个节点的内存为主要存储介质,适用于提升大规模遥感影像处理过程中的数据读写效率。
目前,大部分遥感影像应用都是将数据直接存储于单机硬盘或跨机器的分布式网络文件系统(如NFS,MooseFS等)等底层存储系统中。在处理过程中,所涉及到的数据按需由底层存储系统动态加载到内存中,内存只存放当前计算所需要的少量数据,如果处理所涉及到的文件较大(遥感影像文件通常较大),内存就会频繁地与底层存储系统进行数据交换。考虑到内存与底层文件系统的速度差异较大(内存的读写速度通常是底层文件系统的10倍~100倍),这种交换所产生的延滞将严重影响数据处理效率。相反,如果以内存为主要存储介质,而将底层存储系统仅用作数据持久化介质,可以显著降低两者的数据交换频率,大幅提升数据处理效率。
随着计算机硬件技术的不断发展,单机内存的容量不断增大,使用内存作为大容量的存储介质越来越可行,但是考虑到遥感影像数据量庞大,仅单机内存仍然无法满足存储需求,为了获取更大的存储容量,将多台机器的内存连接为一个逻辑上大内存的分布式共享内存技术已取得广泛应用。目前比较成熟的技术框架有斯坦福大学开发的RAMCloud以及伯克利大学加州分校开发的Alluxio。
RAMCloud的设计目标以内存为主要存储介质,将所有数据存储于内存中,构建一个分布式大容量的键值对数据存储系统。为了达到较高的I/O吞吐量,提升内存利用率,RAMCloud在其内部采用了在常见文件系统中已取得广泛应用的日志存储结构(log-structured)。使用该存储结构可以很方便地将内存中的数据批量地刷到二级持久化存储中,且当系统节点出现故障时,还可以通过“回放”日志中的操作记录来恢复数据。
但是RAMCloud需要将所有的数据全部存储到内存中,这对于数据量在数百TB级别的遥感影像来说是不现实的。另外考虑到日志是顺序存储且每次操作都需要记录,基于日志的存储方案仅适合单条数据记录不大的文本、数值等类型的数据,而本发明所面向的单个遥感影像数据的大小通常不小于50MB,基于日志的存储方案过于笨重,会导致系统内存利用率不高,数据读写速度慢等。
Alluxio借鉴了分布式计算框架Spark中RDD(Resilient Distributed Dataset,弹性分布式数据集)的思路,将数据全部放在内存中,通过构造DAG(Directed AcyclicGraph,有向无环图)计算迭代图,分析数据的依赖关系、使用规律等,优化相关数据集的内存分配,使计算所涉及到的数据尽可能的全部预先加载到内存,避免动态加载导致的I/O开销。Alluxio的主要目标是为上层计算框架提供数据共享支持,相当于在原有分布式私有内存(如Spark的存储方案)上进行了扩展实现了跨计算任务的分布式共享内存,使得同一计算框架的不同任务、不同计算框架的不同任务都可以直接将需要共享的数据放在内存中进行共享。虽然Alluxio也提供了通用文件读写接口,但其性能效率相对于分布式网络文件系统没有明显提升,在不需要迭代计算的场景下无法充分发挥内存的速度优势。
针对现有技术中存在的技术问题,本发明的目的在于提供一种面向大规模遥感影像高效读写的分布式缓存方法及系统。
本发明所实现的存储系统分为两部分:Master节点与Data节点。其中Master节点负责全局元数据信息的组织管理,其中记录了当前存储系统包含的存储节点,以及已加载到内存的遥感影像数据块的存储位置、版本号等信息。
Data节点可以有多个,负责具体的数据存储与读写操作。每个Data节点都有一个DataServer服务程序,该程序对内负责内存存储空间的管理,对外负责与客户端应用程序交互,进行具体的读写操作,并定期向Master节点发送心跳信息,报告自己的状态。DataServer在启动时,会根据配置主动申请一定容量的内存空间作为数据存储空间,同时监听客户端发送过来的读写请求。客户端与DataServer的数据传输是通过socket进行的,如果客户端与DataServer处于同一个节点,则通过本地UNIX Socket进行连接,否则采用普通的TCP Socket进行连接。
系统结构如图1所示。
(1)遥感影像数据文件的存储组织方式
考虑到单个遥感影像数据文件较大,而大部分应用只需要读取整个文件中部分数据,所以本发明将单个原始遥感影像数据文件从逻辑上分为多个固定大小(256KB,可根据需要进行配置)的数据块,原始的遥感影像数据文件(未切割,仍是完整文件)保存在底层存储系统中(普通单机文件系统或分布式网络文件系统),需要的部分以数据块为基本单位加载到内存中,加载到内存的数据块由该数据节点的DataServer负责管理,可以被多个连接到DataServer的客户端程序共享。
文件对象与内存数据块的关系如图2所示。
(2)多队列内存数据块管理
为了方便管理,Data节点上的内存管理服务使用3个队列来管理内存数据块,3个队列分别为只读队列、可写队列以及空闲队列。
Data节点上的数据块管理服务DataServer初次启动时,根据预先配置,自动申请指定大小的内存空间,然后将申请的完整的内存空间分割为多个固定大小(256KB)的内存块,然后将这些内存块放到空闲队列中以待后续分配使用。
当客户端程序有数据需要加载时,首先与某个Data节点上的DataServer服务建立socket连接,然后将要读取的文件信息(如文件名、要读取的数据位置(offset)等)发送给DataServer,DataServer接收到数据读取请求时首先查询是否已有部分数据块加载到内存中:如果已加载到内存中,则直接将数据通过已建立的Socket连接返回给客户端;如果尚未加载,则从空闲队列中申请尚未使用的内存块,用于存放需要加载的文件数据,然后将这些数据块放到只读队列中,同时将这些数据发送给客户端。
当有写操作需要修改或增加文件数据时,首先由数据块管理服务查询此次写操作所涉及到的数据块是否存在于只读队列中,如果存在,则将其移到可写队列中,否则从空闲队列中申请尚未使用的内存块,并将此次写入可能影响到的数据加载到内存块中,最后将待写入的数据写到可写队列中对应的内存块中。
内存分配管理策略如图3所示。
(3)文件数据的读取流程
假设客户端需要读取的文件路径为:/data/landsat8/2018/lc81290382018140lgn00.tiff,该文件大小为100MB,但客户端只需要从第10^6个字节开始的20MB的内容。为了获取该数据,客户端程序首先与本地或远程Data数据节点上的DataServer建立连接,然后将文件路径(/data/landsat8/2018/lc81290382018140lgn00.tiff)、读取位置(10^6)、数据量(20MB)等信息发送给DataServer,DataServer收到该请求后,首先检查一下是否已存在一个文件对象与客户端请求的文件(lc81290382018140lgn00.tiff)相对应,如果存在则复用,如果不存在则新建一个空的文件对象,该文件对象是对客户端要操作的文件(lc81290382018140lgn00.tiff)的抽象,其中包含了文件名、数据块等信息,对外提供操作接口,对内管理内存数据块,且每个文件对象都有一个唯一ID作为标识,得到文件对象后DataServer根据需要读取的数据位置与数据量确定相关联的文件块的编号(数据位置是相对文件起始位置的偏移量,根据该偏移量可算出起始块号,再加上数据量可算出最后一个块号),在本例中,数据位置为10^6,所以起始块号为3(10^6/256KB),要读取的数据量为20MB,则由此可得到最后一个块号为83(3+20MB/256KB)。然后根据文件名与数据块号查询这些数据块是否已全部由底层文件系统加载到本机内存,对于不存在的数据块,则将文件名、文件唯一标识号、数据块号等信息发送给Master节点进行查询,以确定本机所缺少的数据块是否在邻居Data节点上,如果在的话则直接从邻居Data节点拉取到本地内存,否则的话Master节点从底层存储系统读取到本地内存并更新对应的内存数据块索引信息,当所有需要的数据块都已加载到内存,则将这些数据块关联到新建的文件对象上,然后交由客户端由这些内存块直接读取数据。
(4)文件数据的写入流程
假设需要写入数据的文件路径为:/landsat8/2018/lc81290382018140lgn00.tiff,客户端程序将文件路径、数据写入位置、待写入数据等信息通过与DataServer建立的连接发送到Data节点,DataServer收到该请求后,根据数据写入位置、待写入数据长度计算出涉及到的数据块编号:由要写入的文件偏移位置,算出起始内存数据块号,然后根据此次需要写入的数据量算出最后一个内存块号,由起始到最后一个内存块号中间的所有内存块都是本次写入所涉及到的数据块。确定数据块编号后:
DataServer首先查询要修改的数据块是否在本地内存;如果存在,则首先将对应的数据块移动到可写队列中,然后将数据写入这些数据块;
如果所涉及到的内存块不存在本地,则DataServer会首先与Master建立连接,根据文件标识与内存块号查询本机所缺少的数据块是否存在于邻居节点;
如果邻居节点包含所查询的内存数据块,则将邻居节点的数据块拉取到本地的可写队列进行更新;
如果邻居节点也不包含所查询的内存块从空闲队列中申请未使用的内存块放到可写队列中,将底层文件系统中对应的数据加载到这些内存块中,然后把待写入数据写入到这些内存块中;
如果底层原始文件在用户写入的某个文件位置上不包含数据(如用户要新增数据),则从空闲队列中申请未使用的内存块放到可写队列中,然后将要写入的数据直接写入这些内存块中;
最后将所有发生变化的内存块的元数据信息(如所属文件、数据块编号等)发送给Master进行更新。
可写队列中的数据块可以由客户端调用相关接口强制写回底层存储系统以做持久化存储,也可以由系统自行选择时机进行批量回写操作。
(5)网络感知的邻居节点选取方法
如上所述,在读写过程中,若当前节点需要拉取的数据不在本地,但存在多个邻居节点上,则根据当前的网络状态选择其中一个节点作为数据传输对象。衡量网络状态的指标包括TTL(作为反映网络快慢的指标)、目标节点的当前连接数(作为反映目标节点负载的指标)等。各个数据节点周期性的通过心跳信息探测本机到所有其他机器的TTL,并将自己当前维护的数据连接数一并上传至Master节点,由Master节点负责维护。
(6)数据一致性控制
当多个客户端通过不同的data节点对同一个文件进行读写操作时,有可能出现数据不一致现象,如图4所示。
A,B节点上的内存缓存了相同的文件数据,连接到A节点的客户端对这部分数据进行了修改,如果在此之后,连接到B节点的客户端继续读取这部分数据就会读到过期数据。
为了解决这个问题,本系统引入了版本信息进行一致性控制:每个加载到内存的数据块都有一个与之关联的版本号,初始为0,每修改一次数据块则将其版本号加1。
数据块的版本信息存储于Master节点的全局元数据库中,客户端在读取某个节点上的数据块之前,需要比对该节点上此数据块的版本号与Master上的版本号是否一致,如果版本号一致,则将数据块返回给该节点,否则由Master确定当前包含最新版本数据的邻居节点,并将该邻居节点信息告知当前Data节点,由Data节点从该邻居节点加载最新数据,如果所有邻居节点都不包含最新数据(因为内存容量的限制,这部分数据被从内存中剔除了),则直接由底层存储系统加载最新的数据。
数据块写入(更新)完成后,则立即更新对应的数据块的版本信息(增加版本号)。
在数据读写时,版本号的验证与更新过程如图5、图6所示。
与现有技术相比,本发明的积极效果为:
·以数据块作为内存存储的基本单位,相对于缓存整个文件的方式,粒度更细,内存利用率更高;
·数据块的大小可定制,可以根据具体需求进行调整,能适应不同尺寸文件的存储需求;
·通过版本号保证数据一致性,相对于Raft/Paxos等算法,流程简单,由此带来的系统开销较小;
·可扩展性好:存储节点都是相对独立的,可以根据负载情况动态调整数据节点的数量,
且数据节点的调整对客户端程序完全透明。
图1为系统结构图;
图2为文件对象与内存数据块的映射关系;
图3为内存管理策略示意图;
图4为数据一致性控制示意图;
图5为数据版本号的验证流程图;
图6为数据版本号更新流程图;
图7为文件对象与数据块对象的类图。
下面将结合附图以及实施例对本发明做进一步的阐述说明。
Master节点部署了全局元数据管理服务,所管理的元数据主要包含以下信息:
Master节点通过标准RESTful(Representational State Transfer)接口对外提供服务:
·QueryBlock(filename,fileid,number):根据文件名、文件标识号、块编号获取对应数据块的元数据信息(主要包括位置、版本等信息);
·UpdateBlock(filename,fileid,number,info):将客户端发送过来的数据块信息(info)更新到对应的记录中。
Data节点负责具体数据的存储与读写操作,其中也缓存了部分元数据信息,Data节点上的DataServer服务程序通过文件对象(FileObject)与数据块(DataBlock)对象来进行具体的读写操作。
数据块对象是对内存数据块的抽象,其主要功能是内存数据管理,其成员属性包括数据块编号、内存地址(指针)、版本号等,成员方法包括读取数据、写入数据、删除数据、将数据块写回底层存储系统等操作。
文件对象是对文件数据的抽象,其主要功能是为客户端应用程序提供标准的读写操作接口。每个文件对象都对应一个实际存储于底层文件系统的文件,其中包含多个已加载到内存的数据块对象。
文件对象与数据块对象的类图结构如图7所示。
初始时,文件对象中不包含任何数据块,只有当客户端程序调用文件对象的相关接口进行操作时,data节点的数据服务程序才会根据文件名、文件标识与块编号将内存中的数据块映射为数据块对象然后关联到文件对象上。
对于不存在本地内存的数据块,文件对象调用相关接口由底层文件系统或相邻的邻居节点加载到本地。本地加载直接调用本地文件系统的接口,如果数据块存储于邻居节点,则需要通过网络服务来加载。
当data节点上的数据块发生变化时,比如因为读写操作导致某个文件加载到内存的数据块增加或因为内存空间的限制导致某个文件对应的内存块被剔除,则通知Master节点进行元数据块信息更新。
网络服务基于底层TCP协议实现,数据获取连接为:mem://datanode/fileid/x/y,其中mem表示这是一个加载邻居内存的请求,datanode表示邻居节点的服务地址(IP地址),fileid表示此次要获取的文件标识号,x标识起始数据块号,y标识终止数据块号。
以上实施例仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求所述为准。
本文发布于:2023-04-14 16:20:52,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/1/87266.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |