本發(fā)明涉及遙感數(shù)據(jù)存儲(chǔ)技術(shù)領(lǐng)域,尤其是一種基于HDFS的遙感影像存儲(chǔ)方案。
背景技術(shù):
遙感影像是各種傳感器所獲信息的產(chǎn)物,是遙感探測(cè)目標(biāo)的信息載體。航天遙感技術(shù)經(jīng)過多年的發(fā)展,無論在光譜分辨率、空間分辨率、時(shí)間分辨率等方面都有了長(zhǎng)足的進(jìn)步。但與此同時(shí),遙感影像的數(shù)據(jù)規(guī)模陡然攀升,傳統(tǒng)的單機(jī)存儲(chǔ)系統(tǒng)已經(jīng)無法滿足需求:
1)單機(jī)存儲(chǔ)系統(tǒng)無法承載如此大規(guī)模的影像數(shù)據(jù),每天至少幾TB的數(shù)據(jù),單機(jī)硬盤會(huì)很快裝滿,這使得單機(jī)存儲(chǔ)系統(tǒng)不易擴(kuò)展的缺點(diǎn)暴露無遺;
2)更重要的是,單機(jī)存儲(chǔ)系統(tǒng)的可靠性不易保證,當(dāng)有硬盤出現(xiàn)故障時(shí),其中的數(shù)據(jù)也隨之丟失。
介于單機(jī)存儲(chǔ)無法滿足遙感影像大規(guī)模存儲(chǔ)的現(xiàn)實(shí)情況,本發(fā)明提出了基于遙感影像常用庫——GDAL與分布式文件系統(tǒng)——HDFS相結(jié)合的解決方案。
要實(shí)現(xiàn)本方案需要解決以下兩點(diǎn)問題:
1)原生GDAL庫不支持直接訪問在HDFS上存儲(chǔ)的影像;
2)GDAL要修改影像,需要對(duì)影像文件進(jìn)行隨機(jī)寫,但HDFS不支持隨機(jī)寫。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于克服現(xiàn)有技術(shù)中存在的不足,提供一種遙感影像云存儲(chǔ)方法,基于GDAL與HDFS解決了遙感影像單機(jī)存儲(chǔ)容量、可靠性不足的問題。本發(fā)明采用的技術(shù)方案是:
一種遙感影像云存儲(chǔ)方法,包括下述步驟:
步驟S1,拓展GDAL文件訪問接口,使GDAL能夠讀寫HDFS上的影像;
步驟S2,提供一套本地緩存機(jī)制,即建立本地緩存,用于實(shí)現(xiàn)GDAL需要隨機(jī)寫的需要。
進(jìn)一步地,步驟S1具體包括:
1)實(shí)現(xiàn)繼承自VSIFilesystemHandler用以訪問HDFS的文件系統(tǒng)訪問類,調(diào)用libhdfs提供的函數(shù),完成VSIFilesystemHandler中定義的文件系統(tǒng)訪問接口;
2)在VSIFileManager中注冊(cè),即在VSIFileManager維護(hù)的映射表中加入一個(gè)新的鍵值對(duì),新鍵值對(duì)的鍵為唯一標(biāo)識(shí)HDFS文件系統(tǒng)訪問句柄的字符串,鍵值為HDFS文件系統(tǒng)訪問句柄。
進(jìn)一步地,步驟S2具體包括:
對(duì)文件進(jìn)行分塊處理,每次從HDFS上按塊讀取存入本地緩存;所述本地緩存包括內(nèi)存緩存和本地文件緩存;
采用LRU策略來協(xié)調(diào)內(nèi)存緩存與本地文件緩存:
1)初始化內(nèi)存緩存,內(nèi)存緩存最多緩存N個(gè)文件塊;
2)初始化本地文件緩存,即創(chuàng)建一個(gè)本地文件;
3)在內(nèi)存緩存中維護(hù)一個(gè)LRU排序隊(duì)列,最近用過的文件塊排在LRU隊(duì)列的隊(duì)首,越久沒有用到的文件塊在隊(duì)列中排得越靠后;
4)當(dāng)內(nèi)存緩存已滿時(shí),從LRU排序隊(duì)列中進(jìn)行淘汰,將最久沒有使用過的文件塊寫入本地文件緩存,空出新的緩存載入新的文件塊。
具體地,本地緩存機(jī)制的讀文件塊過程,包括以下步驟:
步驟S101,判斷文件塊是否在本地緩存中,若是則進(jìn)行步驟S102,否則進(jìn)行步驟S104;
步驟S102,判斷文件塊在內(nèi)存緩存中還是在本地文件緩存中,若在本地文件緩存中進(jìn)行步驟S103,若在內(nèi)存緩存中進(jìn)行步驟S109;
步驟S103,向本地文件緩存讀取該文件塊;轉(zhuǎn)步驟S105;
步驟S104,向HDFS讀取該文件塊;
步驟S105,判斷內(nèi)存緩存是否有空的內(nèi)存緩存塊;若是轉(zhuǎn)步驟S107,若否進(jìn)行步驟S106;
步驟S106,將LRU隊(duì)列中最末尾的文件塊寫入本地文件緩存,空出一個(gè)內(nèi)存緩存塊;
步驟S107,向該空內(nèi)存緩存塊中載入讀取的文件塊數(shù)據(jù);
步驟S108,將經(jīng)過步驟S107后的該內(nèi)存緩存塊排到LRU隊(duì)列隊(duì)首;
步驟S109,返回該內(nèi)存緩存塊中的數(shù)據(jù)。
具體地,本地緩存機(jī)制的寫文件塊過程,包括以下步驟:
步驟S201,判斷是否要寫整個(gè)文件塊;若是則進(jìn)行步驟S209,若否則進(jìn)行步驟S202;
步驟S202,進(jìn)一步判斷文件塊是否在本地緩存中,若是則進(jìn)行步驟S204,若否則進(jìn)行步驟S203;
步驟S203,向HDFS讀取該文件塊;
步驟S204,進(jìn)一步判斷文件塊是否在內(nèi)存緩存中,若是則進(jìn)行步驟S211,若否則進(jìn)行步驟S205;
步驟S205,向本地文件緩存讀取該文件塊;
步驟S206,判斷內(nèi)存緩存是否有空的內(nèi)存緩存塊;若是轉(zhuǎn)步驟S208,若否進(jìn)行步驟S207;
步驟S207,將LRU隊(duì)列中最末尾的文件塊寫入本地文件緩存,空出一個(gè)內(nèi)存緩存塊;
步驟S208,向該空內(nèi)存緩存塊載入讀取的文件塊數(shù)據(jù);轉(zhuǎn)步驟S211;
步驟S209,判斷內(nèi)存緩存是否有空的內(nèi)存緩存塊;若是轉(zhuǎn)步驟S211,若否進(jìn)行步驟S210;
步驟S210,將LRU隊(duì)列中最末尾的文件塊寫入本地文件緩存,空出一個(gè)內(nèi)存緩存塊;
步驟S211,向步驟S209或S210中的空內(nèi)存緩存塊寫文件塊數(shù)據(jù);
步驟S212,將經(jīng)過步驟S211后的該內(nèi)存緩存塊排到LRU隊(duì)列隊(duì)首。
本發(fā)明的優(yōu)點(diǎn)在于:
1)本發(fā)明基于GDAL與HDFS解決了遙感影像單機(jī)存儲(chǔ)容量、可靠性不足的問題;
2)拓展了GDAL文件訪問接口,方便遙感影像在HDFS上的存取;
3)以本地緩存的方式實(shí)現(xiàn)了GDAL修改HDFS上影像文件的功能;
4)增加了本地緩存,在重復(fù)讀的情形下,提高了GDAL讀取HDFS影像文件的速度。
附圖說明
圖1為本發(fā)明的整體框架圖。
圖2為本發(fā)明的GDAL文件系統(tǒng)訪問句柄繼承關(guān)系圖。
圖3為本發(fā)明的GDAL文件訪問部分結(jié)構(gòu)示意圖。
圖4為本發(fā)明的讀文件塊流程圖。
圖5為本發(fā)明的寫文件塊流程圖。
具體實(shí)施方式
下面結(jié)合具體附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步說明。
如圖1所示,遙感影像云存儲(chǔ)方法,是一種基于遙感影像常用庫——GDAL與分布式文件系統(tǒng)——HDFS相結(jié)合的解決方案;圖1中的Cache是緩存;
本發(fā)明的目標(biāo)是:
(一)拓展GDAL文件訪問接口,使GDAL能夠讀寫HDFS上的影像;
(二)提供一套本地緩存機(jī)制,即建立本地緩存,用于解決GDAL需要隨機(jī)寫,而HDFS不支持的問題;同時(shí)盡可能提高命中,提高讀寫速度;所述本地緩存包括內(nèi)存緩存和本地文件緩存。
下面是本發(fā)明兩個(gè)主要部分的詳細(xì)描述;
(一)拓展GDAL文件訪問接口;
作為遙感影像數(shù)據(jù)常用的圖像處理庫,GDAL主要包括以下四部分:
1)抽象數(shù)據(jù)結(jié)構(gòu)。此部分定義了“GDAL影像”的屬性,以及針對(duì)“GDAL圖像”可以進(jìn)行的基本操作;
2)圖像格式解析器。GDAL打開圖像文件時(shí),通過此部分將不同格式的影像文件內(nèi)容轉(zhuǎn)換為內(nèi)存中的“GDAL影像”;
3)圖像處理算法。此部分包含了一些圖像處理算法,如幾何校正、RPC校正、坐標(biāo)投影變換等;
4)文件訪問部分。此部分定義了文件訪問接口,用于訪問不同“文件系統(tǒng)”上的“文件”。
要能操作HDFS上的文件,需要做的就是擴(kuò)展GDAL的文件訪問部分。GDAL文件訪問部分的代碼在GDAL源代碼的port目錄下。GDAL可以訪問的各個(gè)文件系統(tǒng)都以VSIFilesystemHandler為基類的,各個(gè)文件系統(tǒng)的句柄由一個(gè)叫VSIFileManager的類管理著,其內(nèi)部維護(hù)了一個(gè)以文件系統(tǒng)句柄唯一綁定的字符串(string)為鍵(key),文件系統(tǒng)句柄為鍵值(value)的映射表(map),這樣當(dāng)訪問不同的文件系統(tǒng)時(shí),可以根據(jù)不同的key值選取不同的文件系統(tǒng)句柄。VSIFilesystemHandler和VSIFileManager都是GDAL中的類(class);因此為完成本方案設(shè)計(jì)需要以下步驟:
1)實(shí)現(xiàn)繼承自VSIFilesystemHandler用以訪問HDFS的文件系統(tǒng)訪問類,調(diào)用libhdfs提供的函數(shù),完成VSIFilesystemHandler中定義的諸如文件系統(tǒng)打開、創(chuàng)建目錄等文件系統(tǒng)訪問接口;
2)在VSIFileManager中注冊(cè),即在VSIFileManager維護(hù)的映射表(map)中加入一個(gè)新的鍵值對(duì),新鍵值對(duì)的鍵為唯一標(biāo)識(shí)HDFS文件系統(tǒng)訪問句柄的字符串(string),鍵值(value)為HDFS文件系統(tǒng)訪問句柄。
GDAL文件系統(tǒng)訪問句柄繼承關(guān)系如圖2所示,
GDAL文件訪問部分結(jié)構(gòu)示意如圖3所示;
(二)本地緩存的實(shí)現(xiàn);
由于HDFS不支持隨機(jī)寫,因此已存入HFDS的文件不能直接的進(jìn)行修改。本發(fā)明的方案是,在本地建立緩存,只在本地緩存讀到或?qū)懙降膮^(qū)域,在關(guān)閉文件時(shí)先同步未讀到的區(qū)域,再寫HDFS文件。
這樣做有以下優(yōu)點(diǎn):
1)實(shí)現(xiàn)了GDAL直接修改HDFS中的影像文件;
2)在有重復(fù)讀的情況時(shí),減少了對(duì)HDFS的請(qǐng)求次數(shù),提高了文件讀取速度。
本發(fā)明對(duì)文件進(jìn)行分塊處理,每次從HDFS上按塊讀取存入本地緩存;本方案采取的是雙緩存機(jī)制,即內(nèi)存緩存和本地文件緩存協(xié)同構(gòu)成本地緩存的機(jī)制。
從讀寫速度上討論,內(nèi)存緩存速度快于本地磁盤緩存,本地磁盤緩存快于直接讀取HDFS文件,因此盡可能發(fā)揮內(nèi)存緩存的速度優(yōu)勢(shì)有利于優(yōu)化GDAL讀寫文件的速度。
本發(fā)明采用LRU策略來協(xié)調(diào)內(nèi)存緩存與本地文件緩存,使內(nèi)存緩存與本地文件緩存可以最大限度的滿足需求,具體實(shí)施步驟如下:
1)初始化內(nèi)存緩存,內(nèi)存緩存可以最多緩存N個(gè)文件塊;N≥1,是整數(shù);
2)初始化本地文件緩存,即創(chuàng)建一個(gè)本地文件;
3)在內(nèi)存緩存中維護(hù)一個(gè)LRU排序隊(duì)列,最近用過的文件塊排在LRU隊(duì)列的隊(duì)首,越久沒有用到的文件塊在隊(duì)列中排得越靠后;
4)當(dāng)內(nèi)存緩存已滿時(shí),從LRU排序隊(duì)列中進(jìn)行淘汰,將最久沒有使用過的文件塊寫入本地文件緩存,空出新的緩存載入新的文件塊。
具體地,
讀文件塊流程如圖4所示,包括:
步驟S101,判斷文件塊是否在本地緩存中,若是則進(jìn)行步驟S102,否則進(jìn)行步驟S104;
步驟S102,判斷文件塊在內(nèi)存緩存中還是在本地文件緩存中,若在本地文件緩存中進(jìn)行步驟S103,若在內(nèi)存緩存中進(jìn)行步驟S109;
步驟S103,向本地文件緩存讀取該文件塊;轉(zhuǎn)步驟S105;
步驟S104,向HDFS讀取該文件塊;
步驟S105,判斷內(nèi)存緩存是否有空的內(nèi)存緩存塊;若是轉(zhuǎn)步驟S107,若否進(jìn)行步驟S106;
步驟S106,將LRU隊(duì)列中最末尾的文件塊寫入本地文件緩存,空出一個(gè)內(nèi)存緩存塊;
步驟S107,向該空內(nèi)存緩存塊中載入讀取的文件塊數(shù)據(jù);
步驟S108,將經(jīng)過步驟S107后的該內(nèi)存緩存塊排到LRU隊(duì)列隊(duì)首;
步驟S109,返回該內(nèi)存緩存塊中的數(shù)據(jù)。
寫文件塊流程如圖5所示,包括:
步驟S201,判斷是否要寫整個(gè)文件塊;若是則進(jìn)行步驟S209,若否則進(jìn)行步驟S202;
步驟S202,進(jìn)一步判斷文件塊是否在本地緩存中,若是則進(jìn)行步驟S204,若否則進(jìn)行步驟S203;
步驟S203,向HDFS讀取該文件塊;然后轉(zhuǎn)步驟S206;
步驟S204,進(jìn)一步判斷文件塊是否在內(nèi)存緩存中,若是則進(jìn)行步驟S211,若否則進(jìn)行步驟S205;
步驟S205,向本地文件緩存讀取該文件塊;
步驟S206,判斷內(nèi)存緩存是否有空的內(nèi)存緩存塊;若是轉(zhuǎn)步驟S208,若否進(jìn)行步驟S207;
步驟S207,將LRU隊(duì)列中最末尾的文件塊寫入本地文件緩存,空出一個(gè)內(nèi)存緩存塊;
步驟S208,向該空內(nèi)存緩存塊載入讀取的文件塊數(shù)據(jù);轉(zhuǎn)步驟S211;
步驟S209,判斷內(nèi)存緩存是否有空的內(nèi)存緩存塊;若是轉(zhuǎn)步驟S211,若否進(jìn)行步驟S210;
步驟S210,將LRU隊(duì)列中最末尾的文件塊寫入本地文件緩存,空出一個(gè)內(nèi)存緩存塊;
步驟S211,向步驟S209或S210中的空內(nèi)存緩存塊寫文件塊數(shù)據(jù);
步驟S212,將經(jīng)過步驟S211后的該內(nèi)存緩存塊排到LRU隊(duì)列隊(duì)首。
向內(nèi)存緩存塊寫過程結(jié)束后,再將內(nèi)存緩存塊中的數(shù)據(jù)推入(保存進(jìn))HDFS中;
步驟S202~S208所起的作用是,當(dāng)要寫的不是一個(gè)完整的文件塊時(shí),先要把它在HDFS或本地文件緩存中找到,然后調(diào)出該文件塊,放入內(nèi)存緩存的LRU隊(duì)列的內(nèi)存緩存塊中,才可以對(duì)其進(jìn)行修改。
本發(fā)明涉及的一些術(shù)語解釋如下:
GDAL(Geospatial Data Abstraction Library)是一個(gè)在X/MIT許可協(xié)議下的開源柵格空間數(shù)據(jù)轉(zhuǎn)換庫。
HDFS:Hadoop分布式文件系統(tǒng)(HDFS)被設(shè)計(jì)成適合運(yùn)行在通用硬件(commodity hardware)上的分布式文件系統(tǒng)。
libhdfs是基于JNI的hdfs的C應(yīng)用接口,它提供了通過C接口訪問HDFS的功能。
LRU是Least Recently Used 近期最少使用算法。