張 揚(yáng),謝 彬,王敬平,唐 鵬
(華東計(jì)算技術(shù)研究所,上海 201808)
遙感影像作為一種特殊的數(shù)字圖像,具有高分辨率,高覆蓋范圍,信息量大等特點(diǎn).在環(huán)境監(jiān)測(cè),資源探測(cè),災(zāi)害防護(hù),城市規(guī)劃,軍事行動(dòng)等方面具有極高的應(yīng)用價(jià)值[1].
陜西某測(cè)繪所近些年一直使用單機(jī)文件系統(tǒng)如NTFS,進(jìn)行遙感影像數(shù)據(jù)存儲(chǔ).隨著影像數(shù)據(jù)不斷積累,數(shù)據(jù)規(guī)模達(dá)到海量級(jí)別,傳統(tǒng)解決方案不能滿足海量存儲(chǔ)需求,同時(shí)擴(kuò)展性很差,不支持多用戶數(shù)據(jù)共享.與此同時(shí),科研人員在進(jìn)行業(yè)務(wù)處理時(shí),發(fā)現(xiàn)影像讀取速度緩慢,進(jìn)行影像聚類處理時(shí),等待周期較長(zhǎng).
針對(duì)以上問題,本文基于Hadoop和三級(jí)緩存技術(shù),設(shè)計(jì)了一套遙感影像業(yè)務(wù)管理系統(tǒng),提供影像存儲(chǔ),算法注冊(cè),分布式計(jì)算的功能.系統(tǒng)測(cè)試結(jié)果表明,影像讀取速度提升2倍以上,計(jì)算處理時(shí)間縮短三分之一以上.
本文將介紹以下內(nèi)容: 第2節(jié)介紹相關(guān)研究狀況,第3節(jié)是遙感影像管理系統(tǒng)架構(gòu)設(shè)計(jì),第4節(jié)介紹四個(gè)核心模塊的實(shí)現(xiàn)原理,第5節(jié)給出系統(tǒng)測(cè)試方法和結(jié)果.
關(guān)于如何存儲(chǔ)和管理遙感影像數(shù)據(jù),國(guó)內(nèi)外學(xué)者和商業(yè)技術(shù)公司都進(jìn)行了很多相關(guān)的研究.這些研究?jī)?nèi)容主要分為以下三種方式:
1) 采用傳統(tǒng)文件系統(tǒng),如NTFS,EXT,FAT,HFS等.首先將影像數(shù)據(jù)瓦片化,之后將瓦片數(shù)據(jù)根據(jù)空間位置信息,按照特定的目錄結(jié)構(gòu)進(jìn)行存儲(chǔ).這種方式成本低廉,使用簡(jiǎn)單,但是容錯(cuò)性和擴(kuò)展性差,不支持多用戶數(shù)據(jù)共享,并發(fā)操作等.
2) 采取關(guān)系型數(shù)據(jù)庫(kù)(RDBMS),如MySQL,Oracle等.首先將影像數(shù)據(jù)進(jìn)行分塊,之后將數(shù)據(jù)塊轉(zhuǎn)化成二進(jìn)制大對(duì)象(Binary Large Object),進(jìn)行入庫(kù)管理.這種方式查詢方式簡(jiǎn)單,支持多用戶數(shù)據(jù)共享.但是關(guān)系型數(shù)據(jù)庫(kù)對(duì)大對(duì)象(Blob)存取效率不高.其次,單個(gè)Blob對(duì)象一般最大支持4 GB的大小,限制了影像數(shù)據(jù)塊規(guī)模.
3) 采用集中式文件系統(tǒng),如ArcGIS Image Server等.這種方式技術(shù)成熟,易于維護(hù).但是這種方式的擴(kuò)展性較差,同時(shí)隨著用戶規(guī)模的增加,中央服務(wù)器很容易達(dá)到性能瓶頸.
本文采用HDFS分布式存儲(chǔ)策略,將系統(tǒng)構(gòu)建在廉價(jià)的PC機(jī)之上,具有高度的容錯(cuò)性,可擴(kuò)展性,易于維護(hù)的特點(diǎn)[2,3].同時(shí)基于LFU緩存算法,設(shè)計(jì)了三級(jí)緩存模塊,用來(lái)高速緩存影像數(shù)據(jù).兩種方式相互結(jié)合,前者解決海量存儲(chǔ)的需求,后者實(shí)現(xiàn)影像數(shù)據(jù)的快速讀取.
除此之外,關(guān)于如何處理影像數(shù)據(jù),傳統(tǒng)的解決方案是將處理算法運(yùn)行在單一PC機(jī)之上.但是很多影像處理算法如K均值、ISODATA等,可以結(jié)合Map-Reduce這種分布式處理框架進(jìn)行改進(jìn)[4–7].本文設(shè)計(jì)了算法注冊(cè)和處理模塊,支持單機(jī)處理和MapReduce分布式處理兩種運(yùn)行模式.
如圖1所示,系統(tǒng)采用B/S架構(gòu)設(shè)計(jì),為用戶提供友好的Web客戶端.方便用戶進(jìn)行影像導(dǎo)入,計(jì)算處理等操作.
圖1 系統(tǒng)架構(gòu)設(shè)計(jì)
整套系統(tǒng)分為四個(gè)核心模塊,分別是三級(jí)緩存模塊,HDFS讀寫模塊,算法注冊(cè)模塊以及計(jì)算處理模塊.滿足軟件設(shè)計(jì)高內(nèi)聚,低耦合的標(biāo)準(zhǔn),每個(gè)模塊功能如下:
1) 三級(jí)緩存模塊: 緩存影像數(shù)據(jù)塊和計(jì)算處理模塊產(chǎn)生的臨時(shí)數(shù)據(jù),加速讀取速度.
2) HDFS讀寫模塊: 構(gòu)建HDFS集群,對(duì)外提供讀寫接口.滿足遙感影像海量存儲(chǔ)和多用戶共享數(shù)據(jù)的需求.
3) 算法注冊(cè)模塊: 獲取算法元數(shù)據(jù)信息,導(dǎo)入MySQL數(shù)據(jù)庫(kù)持久化.
4) 計(jì)算處理模塊: 根據(jù)算法元數(shù)據(jù),開啟單機(jī)處理模式或者M(jìn)apReduce分布式模式.
影像數(shù)據(jù)寫入時(shí),首先瀏覽器客戶端與三級(jí)緩存模塊和HDFS讀寫模塊交互,確定寫入路徑.之后將影像數(shù)據(jù)從本地同時(shí)寫入三級(jí)緩存模塊和HDFS集群.最后客戶端端接收到成功寫入信號(hào),關(guān)閉寫入工作流.否則,重新發(fā)起寫工作.
影像數(shù)據(jù)讀取時(shí),瀏覽器客戶端首先與三級(jí)緩存模塊交互,查找影像數(shù)據(jù).如果查找成功結(jié)束讀取工作,否則繼續(xù)與HDFS底層存儲(chǔ)模塊交互,查找數(shù)據(jù)塊.
算法注冊(cè)時(shí),瀏覽器客戶端將算法包元數(shù)據(jù)寫入MySQL,算法包同時(shí)寫入三級(jí)緩存模塊和HDFS集群.算法運(yùn)行時(shí),根據(jù)算法元數(shù)據(jù),開啟對(duì)應(yīng)算法運(yùn)行模式.
三級(jí)緩存模塊在系統(tǒng)中功能為以下兩點(diǎn): (1) 緩存影像數(shù)據(jù),提高影像讀取速率.(2) 緩存影像處理過程中產(chǎn)生的臨時(shí)數(shù)據(jù),減少影像處理時(shí)間.
根據(jù)上述設(shè)計(jì)目標(biāo),本模塊架構(gòu)設(shè)計(jì)采用主從設(shè)計(jì)思想,共分為四個(gè)部分: Master、Salve、Client以及切割預(yù)處理.如圖2所示.
圖2 三級(jí)緩存模塊架構(gòu)
當(dāng)影像文件寫入Salve節(jié)點(diǎn)之前,先對(duì)文件進(jìn)行切割預(yù)處理,將影像切割成很多128 MB大小相同的數(shù)據(jù)塊,不足128 MB的數(shù)據(jù)按實(shí)際大小成塊.例如一個(gè)500 MB的影像文件,會(huì)切割成三個(gè)128 MB和一個(gè)116 MB大小的數(shù)據(jù)塊.
Master負(fù)責(zé)影像文件元數(shù)據(jù)管理.元數(shù)據(jù)采用Inode Tree形式,每個(gè)影像文件都是一個(gè)Inode.每個(gè)Inode記錄著: 文件對(duì)應(yīng)的數(shù)據(jù)塊id、名稱、大小,存儲(chǔ)節(jié)點(diǎn)位置等信息.同時(shí)維護(hù)一張Mount表,記錄每個(gè)文件三級(jí)緩存系統(tǒng)路徑與HDFS文件路徑的映射關(guān)系.例如三級(jí)緩存系統(tǒng)根路徑”/”對(duì)應(yīng)“hdfs://master:9000/ThreeCache/”.方便影像文件在三級(jí)緩存系統(tǒng)和HDFS集群中的映射管理.
Salve負(fù)責(zé)存儲(chǔ)影像數(shù)據(jù)塊,管理本地MEM(內(nèi)存)、SSD(固態(tài)硬盤)和HDD(硬盤),三種硬件設(shè)備構(gòu)成三層緩存結(jié)構(gòu),其讀寫速度依次遞減.每個(gè)數(shù)據(jù)塊根據(jù)LFU (Least Frequently Used)算法緩存機(jī)制,計(jì)算出熱度值.數(shù)據(jù)塊根據(jù)熱度值,依次遞減排列,緩存到MEM、SSD、HDD中.
如圖3所示,在LFU算法中[8],每個(gè)數(shù)據(jù)塊歷史訪問次數(shù)越多,熱度值就越高.核心思想是根據(jù)歷史訪問頻率來(lái)判定未來(lái)訪問頻率.同一影像文件對(duì)應(yīng)的所有數(shù)據(jù)塊具有相同的熱度值.
圖3 LFU緩存機(jī)制算法
算法1.LFU算法1.新加入數(shù)據(jù)塊,放到緩存隊(duì)列末尾.初始熱度值為1.2.緩存隊(duì)列中數(shù)據(jù)塊每被訪問一次,熱度值增加1.3.隊(duì)列重新排序,熱度值依次遞減.熱度值相同的數(shù)據(jù)塊,最近訪問時(shí)間靠后的,排在前面.4.緩存隊(duì)列滿時(shí),加入新的數(shù)據(jù)塊,淘汰隊(duì)列末尾數(shù)據(jù)塊到低層次存儲(chǔ)結(jié)構(gòu).5.低層次存儲(chǔ)結(jié)構(gòu)重復(fù)步驟1、2、3、4.6.三級(jí)存儲(chǔ)結(jié)構(gòu)滿時(shí),淘汰數(shù)據(jù)塊.
Client作為客戶端,負(fù)責(zé)向外提供文件寫入和讀取的訪問接口.當(dāng)發(fā)生影像文件讀取時(shí),三級(jí)緩存模塊工作流程如下:
1) Client接收到影像文件讀取請(qǐng)求,發(fā)送信息給Master,返回對(duì)應(yīng)數(shù)據(jù)塊位置信息.
2) 根據(jù)塊位置信息,在Salve中查找.如果命中數(shù)據(jù)塊,就合并數(shù)據(jù)塊成文件發(fā)送給對(duì)話發(fā)起模塊,之后Client結(jié)束對(duì)話.
3) 如果沒有命中數(shù)據(jù)塊,則說(shuō)明數(shù)據(jù)塊被淘汰,返回失敗信息給Client.
4) Client當(dāng)接收到返回的失敗信息后,返回查找失敗信息給對(duì)話發(fā)起模塊,結(jié)束對(duì)話.
如果三級(jí)緩存系統(tǒng)中沒有影像文件,只能向HDFS發(fā)起RPC請(qǐng)求,讀取數(shù)據(jù).同時(shí)該影像文件重新加載到三級(jí)緩存系統(tǒng),更新熱度值.重新排列緩存系統(tǒng)中數(shù)據(jù)塊位置.
HDFS讀寫模塊與三級(jí)緩存模塊都具有影像數(shù)據(jù)存儲(chǔ)功能.但該模塊功能在系統(tǒng)中作用是滿足影像數(shù)據(jù)的海量存儲(chǔ)需求.
實(shí)現(xiàn)方案是構(gòu)造UploadFile,DownloadFile方法,方法中調(diào)用Hadoop提供fileSystem類getFileStatus,copyFromLocalFile,open,delete相關(guān)方法.如圖4所示,當(dāng)影像文件寫入時(shí),該模塊工作流程如下:
1) Web前端獲取影像名稱,初始路徑,目標(biāo)路徑.發(fā)送寫入請(qǐng)求給HDFS讀寫模塊.
2) HDFS讀寫模塊接收寫入請(qǐng)求后,調(diào)用UploadFile方法獲取初始路徑,和目標(biāo)路徑,寫入configuration.再調(diào)用HDFS的copyFromLocalFile接口.
3) HDFS集群調(diào)用DistributedFileSystem對(duì)象,的create方法,返回FSDataOutputStream對(duì)象,創(chuàng)建一個(gè)文件輸出流.
4) 調(diào)用DistributedFileSystem對(duì)象,與Name-Node進(jìn)行RPC調(diào)用,在分布式文件系統(tǒng)創(chuàng)建目標(biāo)路徑.
5) 調(diào)用FSDataOutputStream對(duì)象,向DataNode開始發(fā)起寫入請(qǐng)求.原始影像被分割成大小為64k的packet,包含校驗(yàn)碼等發(fā)送出去.
6) DataNode與其他DataNode(副本放置)組成Pipeline依次傳輸Packet,寫入成功后,返回寫入ack信息.
7) DataNode全部寫入成功后FSDataOutput-Stream調(diào)用close方法,關(guān)閉字節(jié)流.讀寫模塊檢測(cè)到寫入成功后,發(fā)送信號(hào)給Web后端,結(jié)束整個(gè)寫入任務(wù).
圖4 影像導(dǎo)入界面
UploadlFile關(guān)鍵代碼如下:
如圖5所示,算法注冊(cè)模塊提供影像處理算法包注冊(cè)和管理的功能.由于MySQL數(shù)據(jù)庫(kù)適合存儲(chǔ)結(jié)構(gòu)化數(shù)據(jù),同時(shí)千萬(wàn)級(jí)別以下查詢響應(yīng)延遲低,所以將算法的名稱、算法類型、算法包路徑等元數(shù)據(jù)信息,保存在MySQL數(shù)據(jù)庫(kù)進(jìn)行持久化.算法包的數(shù)據(jù)量不適合使用MySQL,將分別寫入三級(jí)緩存模塊和HDFS模塊.
圖5 算法注冊(cè)界面
主要工作流程如下:
1) 用戶在瀏覽器端,填寫算法名稱,算法版本,算法簡(jiǎn)介,從本地文件系統(tǒng)選擇要注冊(cè)的算法包.
2) 注冊(cè)保存后,后端將算法元數(shù)據(jù)信息發(fā)送給MySQL數(shù)據(jù)庫(kù),
3) 算法包信息同時(shí)發(fā)送給三級(jí)緩存模塊和HDFS模塊,進(jìn)行寫入操作.
4) 使用算法包時(shí)候,查詢MySQL數(shù)據(jù)庫(kù)表,得到算法包路徑信息.
5) 根據(jù)算法路徑信息,先向三級(jí)緩存模塊查找,如果查找失敗,最后調(diào)用HDFS的Java接口查找.
數(shù)據(jù)庫(kù)表設(shè)計(jì)結(jié)構(gòu)如表1.
表1 算法注冊(cè)表結(jié)構(gòu)
計(jì)算處理模塊提供影像處理的功能,支持單機(jī)和分布式處理兩種模式.算法表結(jié)構(gòu)中Is_MapReduce字段,決定該算法的處理模式.
單機(jī)處理模式跟傳統(tǒng)ENVI,IMAGINE等軟件計(jì)算處理方式相同,往往耗時(shí)較長(zhǎng).由于很多影像處理算法可以結(jié)合MapReduce進(jìn)行改進(jìn),例如K均值,ISODATA[9–11].只要實(shí)現(xiàn) Map 和 Reduce 兩個(gè)函數(shù),就可以采用分布式處理模式,如算法2.
算法2.改進(jìn)后的K均值算法1.在Main函數(shù)中,讀取初始n個(gè)中心位置,保存到Configuration對(duì)象中.2.重寫Map函數(shù),讀取遙感信息圖像,計(jì)算每個(gè)像素點(diǎn)到n個(gè)中心位置的歐式距離,距離最短的則為該像素點(diǎn)所屬的聚類中心,輸出<聚類中心id,對(duì)應(yīng)像素點(diǎn)>.3.Shuffle過程: 不同聚類中心,經(jīng)過哈希后,哈希值相同的,傳給同一個(gè)Reduce節(jié)點(diǎn).4.重寫Reduce函數(shù),每個(gè)聚類中心點(diǎn),根據(jù)對(duì)應(yīng)的所有像素點(diǎn),計(jì)算均值.得到新的聚類中心點(diǎn),輸出<聚類中心id,新的聚類中心id>.5.計(jì)算新的聚類中心和之前聚類中心的距離,如果小于設(shè)定閾值,輸出結(jié)果.否則,新的聚類中心id,寫入Configuration中,跳轉(zhuǎn)到步驟2.
基于上述算法,該模塊工作流程如下:
1) 計(jì)算模塊接收到算法包元信息,根據(jù) Is_Map Reduce值,若為真,開啟分布式處理模式.
2) 解析算法包信息,開啟多個(gè)Map任務(wù),產(chǎn)生的新的鍵值對(duì)寫入本地三級(jí)緩存系統(tǒng),進(jìn)行分區(qū).
3) 新的鍵值對(duì),按照分區(qū)序號(hào)通過Shuffle過程,發(fā)送給不同Reduce節(jié)點(diǎn).
4) 不同Reduce節(jié)點(diǎn),按照算法包實(shí)現(xiàn)的Reduce函數(shù),產(chǎn)生新的鍵值對(duì),寫入三級(jí)緩存系統(tǒng),輸出結(jié)果.
由6臺(tái)普通PC機(jī),千兆網(wǎng)卡,千兆交換機(jī)組成服務(wù)集群.一個(gè)作為NameNode主節(jié)點(diǎn)或三級(jí)緩存模塊的Client和Master,其它作為DataNode或三級(jí)緩存的salve節(jié)點(diǎn).其中主節(jié)點(diǎn)裝載MySQL數(shù)據(jù)庫(kù),版本為5.7.20.節(jié)點(diǎn)配置如表2.
表2 集群軟件及硬件配置
測(cè)試條件采用145張TIFF格式的影像數(shù)據(jù),單幅大小約為178 MB,總?cè)萘繛?5.81 GB.Hadoop配置文件hdfs-site.xml參數(shù)設(shè)定如下:
--塊大小128 M
--副本數(shù)量為3
先直接使用HDFS hadoop fs-get命令,進(jìn)行讀取測(cè)試.再測(cè)試加入三級(jí)緩存模塊后的讀取速度測(cè)試.每種測(cè)試方法反復(fù)進(jìn)行5次,記錄耗費(fèi)時(shí)間.測(cè)試結(jié)果如圖6所示.
圖6 影像讀取速度測(cè)試
根據(jù)測(cè)試數(shù)據(jù),計(jì)算出HDFS讀取影像耗費(fèi)時(shí)間平均為466.72 s,平均讀取速度為55.30 m/s.加入三級(jí)緩存模塊后,平均耗費(fèi)時(shí)間為200.06 s,平均讀取速度為129.01 m/s.實(shí)驗(yàn)結(jié)果表明,三級(jí)緩存模塊可以將影像讀取速度提升2倍以上,有效解決影像數(shù)據(jù)讀取緩慢的問題.
另外注意到,三級(jí)緩存模塊第一次讀取耗費(fèi)時(shí)間稍長(zhǎng),之后就趨于平穩(wěn).經(jīng)過分析,原因是首次讀取時(shí),很多數(shù)據(jù)塊可能位于底層次存儲(chǔ)結(jié)構(gòu)中.再次讀取時(shí),數(shù)據(jù)塊熱度值更新,在緩存隊(duì)列中的位置發(fā)生前移.
分別輸入178 MB、365 MB、712 MB、1424 MB的影像數(shù)據(jù),模擬不同數(shù)據(jù)量對(duì)聚類時(shí)間的影響.再使用單個(gè)節(jié)點(diǎn),模擬傳統(tǒng)單節(jié)點(diǎn)聚類處理過程.最后分別使用2個(gè),3個(gè),4個(gè),5個(gè)計(jì)算節(jié)點(diǎn),模擬不同集群性能對(duì)處理時(shí)間的影響.
算法包中Main函數(shù),調(diào)用JobConf中setNumReduce Task方法,將Reduce數(shù)量設(shè)置和計(jì)算節(jié)點(diǎn)數(shù)量相等.測(cè)試結(jié)果如圖7所示.
圖7 聚類處理時(shí)間測(cè)試
根據(jù)實(shí)驗(yàn)結(jié)果發(fā)現(xiàn),在數(shù)據(jù)量比較小的時(shí)候,隨著節(jié)點(diǎn)數(shù)量增加,時(shí)間曲線下降不明顯.尤其是當(dāng)數(shù)據(jù)規(guī)模只有178 MB情況下,兩個(gè)計(jì)算節(jié)點(diǎn)處理時(shí)間會(huì)稍許增加.這是因?yàn)殚_啟多節(jié)點(diǎn)進(jìn)行聚類處理,任務(wù)切割、網(wǎng)絡(luò)通信時(shí)間會(huì)增加.數(shù)據(jù)規(guī)模不大情況下,反而導(dǎo)致整體時(shí)間開銷增加.
隨著輸入數(shù)據(jù)量的增大,可以發(fā)現(xiàn)時(shí)間曲線下降效果較為顯著.當(dāng)達(dá)到1 GB數(shù)據(jù)規(guī)模時(shí),時(shí)間開銷較傳統(tǒng)單節(jié)點(diǎn)處理方式,可以減少40%以上.
本文根據(jù)陜西某測(cè)繪所遇到的影像存儲(chǔ)需求量大,讀寫速度慢,計(jì)算時(shí)間周期長(zhǎng),多用戶無(wú)法共享數(shù)據(jù)等問題.基于Hadoop開源框架和LFU算法,構(gòu)建了一套影像業(yè)務(wù)管理系統(tǒng),提供影像存儲(chǔ),算法注冊(cè),影像處理功能.實(shí)驗(yàn)結(jié)果證明,該系統(tǒng)有效解決了上述問題,其中三級(jí)緩存模塊顯著提升了整體系統(tǒng)的性能.
由于算法注冊(cè)模塊是通用模塊,同時(shí)支持基于單節(jié)點(diǎn)開發(fā)的算法包,以及基于MapReduce計(jì)算框架開發(fā)的算法包.之后工作,可以就ISODATA,Sobel邊緣檢測(cè)[12]等常見的遙感影像處理算法如何結(jié)合Map-Reduce框架,進(jìn)行算法包的開發(fā)研究.