遥感影像作为一种特殊的数字图像, 具有高分辨率, 高覆盖范围, 信息量大等特点. 在环境监测, 资源探测, 灾害防护, 城市规划, 军事行动等方面具有极高的应用价值[1].
陕西某测绘所近些年一直使用单机文件系统如NTFS, 进行遥感影像数据存储. 随着影像数据不断积累, 数据规模达到海量级别, 传统解决方案不能满足海量存储需求, 同时扩展性很差, 不支持多用户数据共享. 与此同时, 科研人员在进行业务处理时, 发现影像读取速度缓慢, 进行影像聚类处理时, 等待周期较长.
针对以上问题, 本文基于Hadoop和三级缓存技术, 设计了一套遥感影像业务管理系统, 提供影像存储, 算法注册, 分布式计算的功能. 系统测试结果表明, 影像读取速度提升2倍以上, 计算处理时间缩短三分之一以上.
本文将介绍以下内容: 第2节介绍相关研究状况, 第3节是遥感影像管理系统架构设计, 第4节介绍四个核心模块的实现原理, 第5节给出系统测试方法和结果.
2 相关研究状况关于如何存储和管理遥感影像数据, 国内外学者和商业技术公司都进行了很多相关的研究. 这些研究内容主要分为以下三种方式:
1) 采用传统文件系统, 如NTFS, EXT, FAT, HFS等. 首先将影像数据瓦片化, 之后将瓦片数据根据空间位置信息, 按照特定的目录结构进行存储. 这种方式成本低廉, 使用简单, 但是容错性和扩展性差, 不支持多用户数据共享, 并发操作等.
2) 采取关系型数据库(RDBMS), 如MySQL, Oracle等. 首先将影像数据进行分块, 之后将数据块转化成二进制大对象(Binary Large Object), 进行入库管理. 这种方式查询方式简单, 支持多用户数据共享. 但是关系型数据库对大对象(Blob)存取效率不高. 其次, 单个Blob对象一般最大支持4 GB的大小, 限制了影像数据块规模.
3) 采用集中式文件系统, 如ArcGIS Image Server等. 这种方式技术成熟, 易于维护. 但是这种方式的扩展性较差, 同时随着用户规模的增加, 中央服务器很容易达到性能瓶颈.
本文采用HDFS分布式存储策略, 将系统构建在廉价的PC机之上, 具有高度的容错性, 可扩展性, 易于维护的特点[2,3]. 同时基于LFU缓存算法, 设计了三级缓存模块, 用来高速缓存影像数据. 两种方式相互结合, 前者解决海量存储的需求, 后者实现影像数据的快速读取.
除此之外, 关于如何处理影像数据, 传统的解决方案是将处理算法运行在单一PC机之上. 但是很多影像处理算法如K均值、ISODATA等, 可以结合MapReduce这种分布式处理框架进行改进[4–7]. 本文设计了算法注册和处理模块, 支持单机处理和MapReduce分布式处理两种运行模式.
3 系统架构如图1所示, 系统采用B/S架构设计, 为用户提供友好的Web客户端. 方便用户进行影像导入, 计算处理等操作.
![]() |
图 1 系统架构设计 |
整套系统分为四个核心模块, 分别是三级缓存模块, HDFS读写模块, 算法注册模块以及计算处理模块. 满足软件设计高内聚, 低耦合的标准, 每个模块功能如下:
1) 三级缓存模块: 缓存影像数据块和计算处理模块产生的临时数据, 加速读取速度.
2) HDFS读写模块: 构建HDFS集群, 对外提供读写接口. 满足遥感影像海量存储和多用户共享数据的需求.
3) 算法注册模块: 获取算法元数据信息, 导入MySQL数据库持久化.
4) 计算处理模块: 根据算法元数据, 开启单机处理模式或者MapReduce分布式模式.
影像数据写入时, 首先浏览器客户端与三级缓存模块和HDFS读写模块交互, 确定写入路径. 之后将影像数据从本地同时写入三级缓存模块和HDFS集群. 最后客户端端接收到成功写入信号, 关闭写入工作流. 否则, 重新发起写工作.
影像数据读取时, 浏览器客户端首先与三级缓存模块交互, 查找影像数据. 如果查找成功结束读取工作, 否则继续与HDFS底层存储模块交互, 查找数据块.
算法注册时, 浏览器客户端将算法包元数据写入MySQL, 算法包同时写入三级缓存模块和HDFS集群. 算法运行时, 根据算法元数据, 开启对应算法运行模式.
4 模块原理和实现 4.1 三级缓存模块三级缓存模块在系统中功能为以下两点: (1) 缓存影像数据, 提高影像读取速率. (2) 缓存影像处理过程中产生的临时数据, 减少影像处理时间.
根据上述设计目标, 本模块架构设计采用主从设计思想, 共分为四个部分: Master、Salve、Client以及切割预处理. 如图2所示.
![]() |
图 2 三级缓存模块架构 |
当影像文件写入Salve节点之前, 先对文件进行切割预处理, 将影像切割成很多128 MB大小相同的数据块, 不足128 MB的数据按实际大小成块. 例如一个500 MB的影像文件, 会切割成三个128 MB和一个116 MB大小的数据块.
Master负责影像文件元数据管理. 元数据采用Inode Tree形式, 每个影像文件都是一个Inode. 每个Inode记录着: 文件对应的数据块id、名称、大小, 存储节点位置等信息. 同时维护一张Mount表, 记录每个文件三级缓存系统路径与HDFS文件路径的映射关系. 例如三级缓存系统根路径”/”对应“hdfs://master:9000/ThreeCache/”. 方便影像文件在三级缓存系统和HDFS集群中的映射管理.
Salve负责存储影像数据块, 管理本地MEM(内存)、SSD(固态硬盘)和HDD(硬盘), 三种硬件设备构成三层缓存结构, 其读写速度依次递减. 每个数据块根据LFU (Least Frequently Used)算法缓存机制, 计算出热度值. 数据块根据热度值, 依次递减排列, 缓存到MEM、SSD、HDD中.
如图3所示, 在LFU算法中[8], 每个数据块历史访问次数越多, 热度值就越高. 核心思想是根据历史访问频率来判定未来访问频率. 同一影像文件对应的所有数据块具有相同的热度值.
![]() |
图 3 LFU缓存机制算法 |
算法1. LFU算法
1. 新加入数据块, 放到缓存队列末尾. 初始热度值为1.
2. 缓存队列中数据块每被访问一次, 热度值增加1.
3. 队列重新排序, 热度值依次递减. 热度值相同的数据块, 最近访问时间靠后的, 排在前面.
4. 缓存队列满时, 加入新的数据块, 淘汰队列末尾数据块到低层次存储结构.
5. 低层次存储结构重复步骤1、2、3、4.
6. 三级存储结构满时, 淘汰数据块.
Client作为客户端, 负责向外提供文件写入和读取的访问接口. 当发生影像文件读取时, 三级缓存模块工作流程如下:
1) Client接收到影像文件读取请求, 发送信息给Master, 返回对应数据块位置信息.
2) 根据块位置信息, 在Salve中查找. 如果命中数据块, 就合并数据块成文件发送给对话发起模块, 之后Client结束对话.
3) 如果没有命中数据块, 则说明数据块被淘汰, 返回失败信息给Client.
4) Client当接收到返回的失败信息后, 返回查找失败信息给对话发起模块, 结束对话.
如果三级缓存系统中没有影像文件, 只能向HDFS发起RPC请求, 读取数据. 同时该影像文件重新加载到三级缓存系统, 更新热度值. 重新排列缓存系统中数据块位置.
4.2 HDFS读写模块HDFS读写模块与三级缓存模块都具有影像数据存储功能. 但该模块功能在系统中作用是满足影像数据的海量存储需求.
实现方案是构造UploadFile, DownloadFile方法, 方法中调用Hadoop提供fileSystem类getFileStatus, copyFromLocalFile, open, delete相关方法. 如图4所示, 当影像文件写入时, 该模块工作流程如下:
1) Web前端获取影像名称, 初始路径, 目标路径. 发送写入请求给HDFS读写模块.
2) HDFS读写模块接收写入请求后, 调用UploadFile方法获取初始路径, 和目标路径, 写入configuration. 再调用HDFS的copyFromLocalFile接口.
3) HDFS集群调用DistributedFileSystem对象, 的create方法, 返回FSDataOutputStream对象, 创建一个文件输出流.
4) 调用DistributedFileSystem对象, 与Name-Node进行RPC调用, 在分布式文件系统创建目标路径.
5) 调用FSDataOutputStream对象, 向DataNode开始发起写入请求. 原始影像被分割成大小为64k的packet, 包含校验码等发送出去.
6) DataNode与其他DataNode(副本放置)组成Pipeline依次传输Packet, 写入成功后, 返回写入ack信息.
7) DataNode全部写入成功后FSDataOutput-Stream调用close方法, 关闭字节流. 读写模块检测到写入成功后, 发送信号给Web后端, 结束整个写入任务.
![]() |
图 4 影像导入界面 |
UploadlFile关键代码如下:
//初始路径
String FromPath = "/local /高分辨率遥感影像/中国多地区遥感影像/影像1/ TH01-01_R201202210000003 _1A_SXZ_4_883_123.jpg";
//目标路径
String ToPath= "/hdfs/高分辨率遥感影像/output";
//程序配置
Configuration config = new Configuration();
config.set("fs.default.name","hdfs://master: 9000");
hdfs = FileSystem.get(new URI ("hdfs://master:9000"), config);
Path srcPath = new Path(FromPath);
Path destPath = new Path(ToPath);
boolean delSrc = true;
hdfs.copyFromLocalFile(delSrc, srcPath, destPath);
4.3 算法注册管理模块如图5所示, 算法注册模块提供影像处理算法包注册和管理的功能. 由于MySQL数据库适合存储结构化数据, 同时千万级别以下查询响应延迟低, 所以将算法的名称、算法类型、算法包路径等元数据信息, 保存在MySQL数据库进行持久化. 算法包的数据量不适合使用MySQL, 将分别写入三级缓存模块和HDFS模块.
![]() |
图 5 算法注册界面 |
主要工作流程如下:
1) 用户在浏览器端, 填写算法名称, 算法版本, 算法简介, 从本地文件系统选择要注册的算法包.
2) 注册保存后, 后端将算法元数据信息发送给MySQL数据库,
3) 算法包信息同时发送给三级缓存模块和HDFS模块, 进行写入操作.
4) 使用算法包时候, 查询MySQL数据库表, 得到算法包路径信息.
5) 根据算法路径信息, 先向三级缓存模块查找, 如果查找失败, 最后调用HDFS的Java接口查找.
数据库表设计结构如表1.
![]() |
表 1 算法注册表结构 |
4.4 计算处理模块
计算处理模块提供影像处理的功能, 支持单机和分布式处理两种模式. 算法表结构中Is_MapReduce字段, 决定该算法的处理模式.
单机处理模式跟传统ENVI, IMAGINE等软件计算处理方式相同, 往往耗时较长. 由于很多影像处理算法可以结合MapReduce进行改进, 例如K均值, ISODATA[9–11]. 只要实现Map和Reduce两个函数, 就可以采用分布式处理模式, 如算法2.
算法2. 改进后的K均值算法
1. 在Main函数中, 读取初始n个中心位置, 保存到Configuration对象中.
2. 重写Map函数, 读取遥感信息图像, 计算每个像素点到n个中心位置的欧式距离, 距离最短的则为该像素点所属的聚类中心, 输出<聚类中心id, 对应像素点>.
3. Shuffle过程: 不同聚类中心, 经过哈希后, 哈希值相同的, 传给同一个Reduce节点.
4. 重写Reduce函数, 每个聚类中心点, 根据对应的所有像素点, 计算均值. 得到新的聚类中心点, 输出<聚类中心id, 新的聚类中心id>.
5. 计算新的聚类中心和之前聚类中心的距离, 如果小于设定阈值, 输出结果. 否则, 新的聚类中心id, 写入Configuration中, 跳转到步骤2.
基于上述算法, 该模块工作流程如下:
1) 计算模块接收到算法包元信息, 根据 Is_MapReduce值, 若为真, 开启分布式处理模式.
2) 解析算法包信息, 开启多个Map任务, 产生的新的键值对写入本地三级缓存系统, 进行分区.
3) 新的键值对, 按照分区序号通过Shuffle过程, 发送给不同Reduce节点.
4) 不同Reduce节点, 按照算法包实现的Reduce函数, 产生新的键值对, 写入三级缓存系统, 输出结果.
5 系统性能测试 5.1 硬件环境由6台普通PC机, 千兆网卡, 千兆交换机组成服务集群. 一个作为NameNode主节点或三级缓存模块的Client和Master, 其它作为DataNode或三级缓存的salve节点. 其中主节点装载MySQL数据库, 版本为5.7.20. 节点配置如表2.
![]() |
表 2 集群软件及硬件配置 |
5.2 影像读取速度测试
测试条件采用145张TIFF格式的影像数据, 单幅大小约为178 MB, 总容量为25.81 GB. Hadoop配置文件hdfs-site.xml参数设定如下:
<property>
<name>dfs.block.size</name>
<value>134217728</value> --块大小128 M
<description>Block size</description>
</property>
<property>
<name>dfs.replication</name>
<value>3</value> --副本数量为3
<description> </property>
先直接使用HDFS hadoop fs-get命令, 进行读取测试. 再测试加入三级缓存模块后的读取速度测试. 每种测试方法反复进行5次, 记录耗费时间. 测试结果如图6所示.
![]() |
图 6 影像读取速度测试 |
根据测试数据, 计算出HDFS读取影像耗费时间平均为466.72 s, 平均读取速度为55.30 m/s. 加入三级缓存模块后, 平均耗费时间为200.06 s, 平均读取速度为129.01 m/s. 实验结果表明, 三级缓存模块可以将影像读取速度提升2倍以上, 有效解决影像数据读取缓慢的问题.
另外注意到, 三级缓存模块第一次读取耗费时间稍长, 之后就趋于平稳. 经过分析, 原因是首次读取时, 很多数据块可能位于底层次存储结构中. 再次读取时, 数据块热度值更新, 在缓存队列中的位置发生前移.
5.3 影像聚类处理测试分别输入178 MB、365 MB、712 MB、1424 MB的影像数据, 模拟不同数据量对聚类时间的影响. 再使用单个节点, 模拟传统单节点聚类处理过程. 最后分别使用2个, 3个, 4个, 5个计算节点, 模拟不同集群性能对处理时间的影响.
算法包中Main函数, 调用JobConf中setNumReduceTask方法, 将Reduce数量设置和计算节点数量相等. 测试结果如图7所示.
![]() |
图 7 聚类处理时间测试 |
根据实验结果发现, 在数据量比较小的时候, 随着节点数量增加, 时间曲线下降不明显. 尤其是当数据规模只有178 MB情况下, 两个计算节点处理时间会稍许增加. 这是因为开启多节点进行聚类处理, 任务切割、网络通信时间会增加. 数据规模不大情况下, 反而导致整体时间开销增加.
随着输入数据量的增大, 可以发现时间曲线下降效果较为显著. 当达到1 GB数据规模时, 时间开销较传统单节点处理方式, 可以减少40%以上.
6 总结和展望本文根据陕西某测绘所遇到的影像存储需求量大, 读写速度慢, 计算时间周期长, 多用户无法共享数据等问题. 基于Hadoop开源框架和LFU算法, 构建了一套影像业务管理系统, 提供影像存储, 算法注册, 影像处理功能. 实验结果证明, 该系统有效解决了上述问题, 其中三级缓存模块显著提升了整体系统的性能.
由于算法注册模块是通用模块, 同时支持基于单节点开发的算法包, 以及基于MapReduce计算框架开发的算法包. 之后工作, 可以就ISODATA, Sobel边缘检测[12]等常见的遥感影像处理算法如何结合MapReduce框架, 进行算法包的开发研究.
[1] |
冶鑫晨, 于炯, 钱育蓉. 基于Hadoop的遥感影像节能存储策略. 电子技术与软件工程, 2016(8): 196. |
[2] |
郝树魁. Hadoop HDFS和MapReduce架构浅析. 邮电设计技术, 2012(7): 37-42. DOI:doi:10.3969/j.issn.1007-3043.2012.07.008 |
[3] |
Borthakur D. HDFS architecture guide. The Apache Software Fundation, 2008.
|
[4] |
高见文, 薛行贵, 罗杰, 等. 基于迭代式MapReducede的海量数据并行聚类算法研究. 中国科技论文, 2016, 11(14): 1626-1631. DOI:10.3969/j.issn.2095-2783.2016.14.014 |
[5] |
Elleuch W, Wali A, Alimi AM. An investigation of parallel road map inference from big GPS traces data. Procedia Computer Science, 2015, 53: 131-140. DOI:10.1016/j.procs.2015.07.287 |
[6] |
Vaidya M. Critical study of performance parameters on distributed file systems using MapReduce. International Conference on Information Security and Privacy, 2015. DOI:10.1016/j.procs.2016.02.037 |
[7] |
陈华, 陈书海, 张平, 等. K-means算法在遥感分类中的应用. 红外与激光工程, 2000, 29(2): 26-30. DOI:10.3969/j.issn.1007-2276.2000.02.008 |
[8] |
王磊, 孟昭鹏, 刘亚琼. 一种基于LFU置换的BWT压缩算法的改进. 微计算机应用, 2008, 29(3): 80-83. DOI:10.3969/j.issn.2095-347X.2008.03.017 |
[9] |
Anandkrishna R, Kumar D. Improving mapreduce for incremental processing using map data storage. Procedia Computer Science, 2016, 87: 288-293. DOI:10.1016/j.procs.2016.05.163 |
[10] |
Ling X, Yuan Y, Wang D, et al. Joint scheduling of MapReduce jobs with servers: Performance bounds and experiments. Journal of Parallel and Distributed Computing, 2016, 90–91: 52–66.
|
[11] |
蒋利顺, 刘定生. 遥感图像K-Means并行算法研究. 遥感信息, 2008(1): 27-30. DOI:10.3969/j.issn.1000-3177.2008.01.006 |
[12] |
徐昌荣, 王聪颖. 基于Hadoop集群的Sobel边缘检测. 江西理工大学学报, 2013(3): 38-41, 74. |