聂 沛,陈广胜,景维鹏
(1. 东北林业大学 信息与计算机工程学院,黑龙江 哈尔滨 150040;2. 黑龙江省林业生态大数据存储与高性能(云)计算工程研究中心,黑龙江 哈尔滨 150040)
遥感是从人造卫星、飞机或其他飞行器上收集地物目标的电磁辐射信息的技术,在资源调查、环境评估、灾害预测、国土管理、城市规划、交通运输等几乎所有领域都涉及到遥感技术的应用[1]。随着高分辨率对地观测时代的到来,获取到的影像数据以TB级的速度增长,如何将海量影像数据进行高效存储成为近年来的研究热点。传统的影像数据存储基于关系型DBMS实现的空间数据库,这种集中式的文件存储管理能很好地适应各种复杂影像数据结构,但系统扩展性和单服务器容易成为瓶颈[2]。为了解决该问题,很多专家学者提出多种解决方案[3-8]。但仍存在不足之处,主要有以下两点:当前研究往往将关注重点放在影像像元数据,没有对元数据的存储进行合理高效的设计,常规的方案往往将像元数据与元数据分开存储,增加系统耦合性与层次,降低系统内聚性;影像分块固定,没有提供灵活可变的数据分块存储策略,灵活可变的数据分块对于上层复杂影像算法处理至关重要。因此,为了解决存储系统层次复杂、分块策略较固定等一系列问题,基于HDFS设计实现一种高效的面向遥感影像分布式存储模型-MapImage,模型存储充分考虑影像像元数据、影像金字塔、元数据之间的联系,同时针对处理算法访问特性,提供灵活可变的数据分片策略以供选择,提高系统的可用性。
高光谱遥感影像数据结构复杂、数据量大,一般的处理方法是将单幅影像进行分层分块,再利用编码映射到一维空间[9],从而减少与客户端的单次数据量交互,提高读取效率,同时由于遥感影像数据处理在不同程度上具有数据相关性,如何合理地数据分块以适应上层处理算法的存取要求也是存储的关注点之一[10]。
遥感影像数据包括影像像元数据和影像元数据,影像像元数据是遥感影像的主体,记录地物对于光波的反射情况,元数据作为数据查询与处理的重要依据,在此基础上,将海量遥感影像按照不同分辨率进行切分,建立分层分块影像金字塔,数据模型如图1所示。
由图1可见,影像数据模型包括3部分,分别为:①波段数据。不同波段数据代表地物对不同光波反射情况,在各波段上对数据进行分块组织,在图1中将波段数据等分为16块。②元数据。元数据是关于影像数据特征的表述,是关于数据的数据,元数据描述与图像获取有关的参数及后处理相关参数[11],影像元数据详细内容如图2所示,元数据的存储由于数据量较小,且结构化程度高,一般采取关系型数据库或XML文件的形式存储。③影像金字塔。影像金字塔通过对原始影像进行重采样形成不同分辨率的多层数据,再对分辨率由粗到细、数据量由小到大的金字塔在每一层上进行数据分块,实现应用层对于不同规格数据的快速访问。这一技术现今已经十分成熟,在GoogleMap、Bing Map、百度地图、高德地图中都被广泛应用[12]。
图1 遥感影像数据模型
图2 影像元数据
在遥感影像处理算法中,计算往往具有不同程度的相关性,如某像素或某局部区域的数据处理需要其相邻的空间位置的数据、其它光谱波段或其他时间维度的图像数据共同参与计算,而计算与遥感图像数据在不同维度上的相关性使得遥感数据处理算法的数据访问模式变得复杂,其数据访问请求除了常规的连续数据访问外,还存在非规则的不连续数据访问模式,如列访问、矩形块访问,这种数据访问模式困难在于算法通常需要访问文件视图上大量具有多种空间间隔和尺寸的数据片[13]。因此,在影像数据存储时,需要将上层不同访问模式考虑进来,在对数据按波段存储的基础上,提供各种不连续访问的分块接口,如自定义大小的矩形分块存储、按行按列进行存储等。
现有方案一般应用分布式NoSQL数据库或分布式文件系统直接进行影像数据块的存储,元数据与影像像元数据分离,以关系型数据库表或XML文件存储。为了解决当前研究中的不足,基于分布式文件系统HDFS设计实现一种高效可用的分布式影像存储模型,满足上层各种应用的访问需求。
分布式文件系统是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与存储节点相连,设计目标是在通用、廉价的硬件平台上构建大容量、高吞吐率和可伸缩性的分布式存储架构。具有代表性的分布式文件系统有GFS、HDFS、NFS、DFS等,这些分布式文件系统基本采用Master/Slave结构,将目录、文件名或文件数据块等的元数据信息存放在主节点的内存中,是针对大型数据集的存储而优化,对于海量影像块小文件的存储,易造成主节点性能瓶颈[14]。HDFS是一个开源的分布式文件系统,HDFS集群由一个名称节点和多个数据节组成,名称节点是用以管理文件命名空间和调节客户端文件访问的主服务器,文件以数据块的形式存储在数据节点。对于小文件的存储,HDFS提供两种类型的容器,分别是SequenceFile和MapFile,而SequenceFile的每条记录是可序列化的键值对记录。MapFile是排序后的SequenceFile,MapFile由两部分组成,分别是data和index,MapFile结构如图3所示;index作为文件的数据索引,主要记录了每个记录的key值,以及该记录在文件中的偏移位置。在MapFile被访问的时候,索引文件会被加载到内存,通过索引映射关系可迅速定位到指定Record所在文件位置,因此,相对SequenceFile而言,MapFile的检索效率是高效的,缺点是会消耗一部分内存来存储index数据[15]。
图3 Mapfile结构示意图
影像数据模型包括影像像元数据、影像金字塔、元数据3部分,如何高效地组织这3部分数据是影像数据存储的核心问题,在当前的研究成果中,往往将影像数据与元数据分离开,以不同的结构进行存储,使得系统内聚性降低,而各部件间耦合性增加。
利用HDFS进行影像数据模型的存储,基于容器Mapfile设计实现一个高效的分布式存储模型-MapImage(见图4),该模型将影像数据结构捆绑在一起,大大提升系统内聚性,同时解决数据分块产生的小文件问题,同时为支持各种数据访问模式,提供影像数据的分块存储接口,只需要指定相应的分布参数,就可以对图像各波段进行可变大小的分块;如面向矩形块访问的分布式影像矩形块存储,将一幅影像分割成多个矩形块,又如面向列访问的分布式列存储模型、面向跨多波段访问的分波段存储。
由图4可见,模型利用Mapfile存储整个影像数据模型的映像,Mapfile中的值可以存储序列化后的二进制数据,对于异构的数据都可以很好地进行组织存储,同时内置索引文件,对于指定的影像块及元数据都可以进行快速检索,模型数据分为3部分:
1)Raster Info对应影像级元数据,代表整幅影像共有的元数据。
2)Bands Info代表影像各个波段元数据信息,各波段元数据信息样式和长度一致。
3)RasterData存储的是影像的像元,是影像数据的主体部分,该段的组织方式由Raster Info中分布方式参数指定,分布方式有按波段分块存储、按行分块存储、按列分块存储、按矩形块存储。在MapImage中,数据都是分波段存储,所有分布方式都是建立在此之上,每个波段以影像金字塔结构进行存储;以按波段分布举例,首先重采样形成影像金字塔,对于影像数据不进行分块切割,各层的单个波段整幅影像数据直接存储在一个键值对中。
根据不同的应用需求,对于影像应该采取特定的分块策略,依照MapImage模型特点,设计实现相应存储及访问接口,存储的过程是将本地的影像调用Mapfile接口和GDAL库读写接口按指定的分布方式将影像存储到HDFS上,接口类为PutToHDFS,该类介绍如下:
Class PutToHDFS:
Int AllocateAsBand(String filedir)
//按波段分布
Int AllocateAsRow(String filedir,int Ysize)
//按行分布,需指定每块的列方向大小
Int AllocateAsRect(String filedir,int Xsize)
//按列分布,需指定每块的行方向大小
Int AllocateAsCol(String filedir,int Xsize,int Ysize)
//按矩形块分布,需指定矩形块的长和宽
图4 MapImage分布式存储模型
读取影像接口为类ReadMapImage,该类中提供一系列访问特定数据的方法,形如GetXXX(),元数据的获取大同小异,只需指定影像文件名或波段号,就可以进行访问,而像元数据的获取较为复杂,在指定文件名及波段号的基础上,还需指定X、Y方向的索引及数据层号,同时还需创建字节数组缓存像元数据,以矩形块读取为例阐述接口的使用规范如下:
矩形块读取接口为Boolean GetRect(String filename,int band, int layer, int xIndex,int yIndex,byte[] buffer),其中filename为待访问的文件,而文件中存储中的是分层的多波段数据,所以在访问某一块矩形数据时,需要指定波段号band以及金字塔数据层号layer,根据波段号定位到某个波段数据,而波段数据以金字塔形式存储,包含多层数据,定位到某波段之后,再通过层号定位到金字塔的某层数据,最后通过矩形块在横竖方向的编号xIndex和yIndex读取指定矩形数据块,缓存到数组buffer中,读取成功返回true,否则返回false。
对本文提出的模型进行编码实现,应用不同大小的数据集进行网络环境下的存取实验,实验存取流程如图5所示,同时进行两组实验对比:一组以分布式NoSQL数据库Hbase存储影像块,关系型数据库存储元数据;另一组将数据块直接以影像文件形式存储在HDFS,元数据以XML文件组织。
图5 实验存取流程
实验所需的硬件条件、软件环境、实验数据见表1—表3。
表1 硬件平台
表2 软件环境
表3 实验数据
实验采取两种分块策略来测试模型的存取性能:一种是矩形分块,分块大小为512×512;另一种按列分块,即将图像一列作为一个分块进行存储,实验重采样比率为4∶1,数据集从单幅影像(364 MB)至8幅影像(2 548 MB),图6为数据按矩形分块时随数据量增长存取时间变化趋势,图7为数据按列分块时存取时间的变化趋势。
从图6(a)及图7(a)可以看出,列分块较矩形分块数据粒度更小,数据切割和组织耗费更多的时间,HDFS文件存储方案和MapImage存储方案写入时间较接近,这两种方案较Hbase存储方案写入时间平均减少14.5%和16.3%,可见利用分布式文件系统存储数据块较Hbase数据库具有更佳的写入性能,而对于MapImage和HDFS文件这两种方案,后者没有对数据文件进行很好的组织,易造成名字节点的性能瓶颈;观察图6(b)及图7(b),列分块数据粒度小,客户端与服务器交互更频繁,读取耗费时间更多,Hbase方案和MapImage方案较HDFS文件方案数据读取时间平均减少21.8%和28.8%,可见HDFS文件组织影像数据块时读取性能较差,Hbase方案读取时首先需要连接关系型数据,读取元数据,再根据元数据信息去Hbase中读取数据块,系统内耦合度较高,所以该方案比MapImage读取消耗更多的时间。
通过以上的实验及其分析,可以得到以下结论:
1)利用分布式文件系统直接存储影像块数据消耗的时间少,但数据块直接以文件的形式存储易造成HDFS小文件问题。
2)具有索引的数据结构如Mapfile和数据库表在数据读取时性能较好。
图6 按矩形分块数据存取时间
图7 按列分块数据存取时间
3)在对影像数据模型的存储中,影像元数据及像元数据联系很紧密,存储时需要将这两者一并进行考虑。
4)本文提出的MapImage影像分布式存储模型,解决数据块直接存储时的小文件问题,较现有的遥感影像数据模型存储方案具有更好的存取性能。
高光谱多波段影像具有数据量大的特点,分布式存储是一种有效的处理方式,针对当前研究中的不足之处,本文基于分布式系统HDFS提出一种遥感影像分布式存储模型,将影像数据模型中各部分数据存储在同一结构中,使得系统内聚性增强;同时兼容上层各种数据访问需求,提供各种数据分片策略,大大增强可用性。通过实验表明该存储模型支持多种影像数据存取模式,较传统方案在数据写入时效率最大提升16.3%,数据读取时效率最大提升28.8%,具有优良的数据读取性能,对于遥感领域具有较高的应用价值。下一步的研究重点是将底层数据存储和并行计算框架相结合,加速数据处理。