程孝孝
摘要:隨著計(jì)算機(jī)視覺(jué)與人工智能技術(shù)的發(fā)展,網(wǎng)絡(luò)中的圖片及視頻資源越來(lái)越多,海量圖片的檢索及存儲(chǔ)就成為一個(gè)重要的現(xiàn)實(shí)問(wèn)題。Hadoop提供的HDFS可以提供可靠的高并發(fā)訪問(wèn),MapReduce計(jì)算框架能夠并行進(jìn)行圖片的處理,因此對(duì)于海量圖片的快速存儲(chǔ)和處理有巨大幫助。
關(guān)鍵詞:Hadoop;海量圖片;存儲(chǔ)優(yōu)化;分布式處理
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2019)10-0221-02
開放科學(xué)(資源服務(wù))標(biāo)識(shí)碼(OSID):
相對(duì)于文字而言,圖片資源是一種內(nèi)容豐富、方便理解的工具,已經(jīng)深入應(yīng)用到日常生活的方方面面。隨著人工智能技術(shù)、計(jì)算機(jī)視覺(jué)技術(shù)在各個(gè)領(lǐng)域的應(yīng)用和手機(jī)終端的普及,圖片數(shù)量也已級(jí)數(shù)級(jí)別迅猛增長(zhǎng)。在圖片資源可以稱海量的情況下,如何從海量圖片中檢索出有用的數(shù)據(jù)、如何高速的實(shí)現(xiàn)圖片的存取就是一件有現(xiàn)實(shí)意義的研究。
Hadoop開源大數(shù)據(jù)平臺(tái)是一個(gè)可以處理海量數(shù)據(jù)的分布式并行計(jì)算框架,它提供的HDFS并行文件系統(tǒng)為海量圖片的實(shí)際存儲(chǔ)提供物理平臺(tái),MapReduce計(jì)算框架可以對(duì)海量圖片進(jìn)行并行處理,Hbase可以為海量圖片的存儲(chǔ)提供多格式的統(tǒng)一管理。
1 Hadoop技術(shù)
Hadoop是一個(gè)基于Java語(yǔ)言的分布式并行框架,包括多個(gè)組件,其中最核心的是[1]:(1)HDFS分布式文件系統(tǒng)。可以部署在多臺(tái)廉價(jià)機(jī)器上,不僅可以通過(guò)組成集群的方式提高硬件資源的利用率,還能夠在線添加、刪除集群節(jié)點(diǎn),或?qū)Ψ植际轿募到y(tǒng)上存儲(chǔ)的資源進(jìn)行各種操作。HDFS能夠保證存儲(chǔ)數(shù)據(jù)的安全性及可靠性,其高容錯(cuò)性保證了即使在出現(xiàn)故障時(shí),數(shù)據(jù)也能夠正常的存儲(chǔ)和傳輸。(2)MapReduce計(jì)算框架。MapReduce會(huì)把大任務(wù)分解為多個(gè)小任務(wù),然后在每個(gè)小任務(wù)處理完畢后進(jìn)行匯總。多個(gè)小任務(wù)是并行處理的,這種并發(fā)執(zhí)行提高了存儲(chǔ)效率。(3)Hbase數(shù)據(jù)庫(kù)。存儲(chǔ)數(shù)據(jù)不是通過(guò)關(guān)系型數(shù)據(jù)庫(kù)實(shí)現(xiàn),無(wú)須事先定義列的數(shù)目及類型,支持列的通道擴(kuò)展;所有的列存儲(chǔ)的數(shù)據(jù)都是二進(jìn)制的。
2 檢索算法及存儲(chǔ)優(yōu)化
圖片的檢索和圖片的存儲(chǔ)息息相關(guān),存儲(chǔ)圖片的目的是為了檢索并使用圖片,因此圖片的檢索算法對(duì)圖片的存儲(chǔ)至關(guān)重要。
傳統(tǒng)的圖片存儲(chǔ)一般都是通過(guò)Oracle等關(guān)系型數(shù)據(jù)庫(kù)完成,然而傳統(tǒng)的數(shù)據(jù)庫(kù)在使用時(shí)存在一定的不足[2]:(1)數(shù)據(jù)需要滿足表結(jié)構(gòu)指定的類型,而且表結(jié)構(gòu)通常是固定的,可擴(kuò)展性不佳。(2)海量數(shù)據(jù)的存儲(chǔ)效率比較低,不適合海量圖片的高并發(fā)快速存取。正是基于這樣的原因,在處理海量圖片時(shí),傳統(tǒng)的圖片檢索方式主要有兩種:基于文本特征的圖片檢索(TBIR)和基于內(nèi)容的圖片檢索(CBIR)。
在數(shù)據(jù)量不太大時(shí),存儲(chǔ)圖片時(shí)可以直接把每個(gè)圖片和存儲(chǔ)表的地址對(duì)應(yīng)起來(lái)。然而,如果數(shù)據(jù)量比較大的時(shí)候,順序存儲(chǔ)表中的存儲(chǔ)空間會(huì)浪費(fèi)很多。
哈希檢索算法是一種精準(zhǔn)的檢索算法,它主要包括哈希存儲(chǔ)表以及哈希函數(shù)兩個(gè)組成部分。哈希存儲(chǔ)表是真正存儲(chǔ)圖片的存儲(chǔ)空間,哈希函數(shù)是一種映射關(guān)系,指定了按照某規(guī)律分布的圖片映射到不同的哈希存儲(chǔ)表內(nèi)。通過(guò)哈希檢索算法檢索圖片時(shí),需要的時(shí)間復(fù)雜度會(huì)大大降低,從而提高了檢索效率。
為了解決海量的圖片小文件的存儲(chǔ)問(wèn)題,可以采取不同的優(yōu)化方案。Hadoop內(nèi)置兩種存儲(chǔ)圖片小文件的優(yōu)化方案:SquenceFile以及MapFile。
Hadoop提供了存儲(chǔ)二進(jìn)制文件的機(jī)制——SquenceFile。多個(gè)小的圖片文件可以組合為一個(gè)大的SquenceFile大文件,其結(jié)構(gòu)如圖1所示:
由圖可以看出,SquenceFile文件由一系列鍵值對(duì)組成,其中Key處存放圖片文件名,Value處存放圖片文件的內(nèi)容。對(duì)于存儲(chǔ)海量小的圖片文件來(lái)說(shuō),可以以這種Key/Value形式把若干圖片文件寫入到SquenceFile文件容器中。例如,假設(shè)有1000萬(wàn)張大小為30K的圖片,則存放這些圖片文件使用的SquenceFile大概為300G。
在實(shí)際應(yīng)用過(guò)程中,為了提高網(wǎng)絡(luò)帶寬的傳輸速率,可以壓縮SquenceFile大文件,同時(shí)也節(jié)省了磁盤空間。值得注意的是,雖然很多圖片小文件可以存儲(chǔ)到一個(gè)大的SquenceFile文件中,但是并沒(méi)有維護(hù)小圖片文件在SquenceFile文件中的索引關(guān)系,所以如果需要在SquenceFile大文件中檢索一個(gè)圖片文件,則需要遍歷整個(gè)SquenceFile文件,圖片檢索效率不太好。
可以把MapFile看做是帶索引的SequenceFile,Index部分存儲(chǔ)圖片文件的索引,Data部分存儲(chǔ)圖片文件。和SequenceFile類似的是,Data部分也是Key/Value的形式,key存放圖片文件的文件名,Value存放圖片文件。在需要訪問(wèn)MapFile中的小圖片文件時(shí),會(huì)先加載Index部分,從中獲取小圖片文件所在的位置,然后再訪問(wèn)Data部分存儲(chǔ)的圖片內(nèi)容。
3 圖片存儲(chǔ)系統(tǒng)設(shè)計(jì)
在對(duì)小圖片文件的存儲(chǔ)模式進(jìn)行優(yōu)化后,可以將存儲(chǔ)系統(tǒng)設(shè)計(jì)為業(yè)務(wù)層、服務(wù)層和存儲(chǔ)層三部分[3]:業(yè)務(wù)層負(fù)責(zé)完成圖片文件的業(yè)務(wù)處理,存儲(chǔ)層實(shí)現(xiàn)存儲(chǔ)功能,服務(wù)層為業(yè)務(wù)層或存儲(chǔ)層的讀取提供服務(wù)。
業(yè)務(wù)處理模塊實(shí)現(xiàn)對(duì)圖片數(shù)據(jù)的處理。圖片在上傳到存儲(chǔ)平臺(tái)前通常需要進(jìn)行縮放、裁剪等操作?;贖adoop的海量圖片存儲(chǔ)系統(tǒng)可以使用MapReduce處理圖片,然后將處理后的圖片存儲(chǔ)到分布式HDFS上,從而減輕了各個(gè)工作節(jié)點(diǎn)的處理壓力。
圖片索引模塊保存了圖片的元數(shù)據(jù)。Hadoop系統(tǒng)中的元數(shù)據(jù)指的是保存到NameNode節(jié)點(diǎn)上的Block信息,然而在使用hadoop保存圖片數(shù)據(jù)時(shí),每個(gè)圖片都有圖片名稱、上傳時(shí)間、圖片描述等信息,隨著存儲(chǔ)的圖片數(shù)量越來(lái)越多,這些信息的總量也會(huì)越來(lái)越大,當(dāng)這些元數(shù)據(jù)達(dá)到G級(jí)別的時(shí)候就不再適合保存到NameNode中,此時(shí)可以考慮將其存儲(chǔ)到Hbase數(shù)據(jù)庫(kù)內(nèi)。默認(rèn)情況下HDFS單個(gè)Block是64M,如果圖片文件不大,則可以把多個(gè)圖片文件拼接到一個(gè)Block中,既提高了HDFS的利用效率,又使得維護(hù)更加簡(jiǎn)單。
存儲(chǔ)模塊在多個(gè)廉價(jià)機(jī)器上部署HDFS文件系統(tǒng),并對(duì)外提供可以實(shí)現(xiàn)對(duì)圖片操作的接口。通常情況下保存的圖片大小是不規(guī)則的,可以認(rèn)為小于2M的圖片是小圖片,大于2M的圖片是大圖片,不同的圖片采取不同的存儲(chǔ)及檢索策略。小圖片可以直接安裝上面的存儲(chǔ)優(yōu)化策略進(jìn)行;大圖片則需要使用MapReduce任務(wù)拆分后進(jìn)行多次并行存取。
在同時(shí)存儲(chǔ)的圖片數(shù)量很多時(shí),可能需要進(jìn)行緩存。緩存服務(wù)模塊的功能是構(gòu)造緩存區(qū),并對(duì)圖片文件進(jìn)行篩選過(guò)濾。傳統(tǒng)的用于構(gòu)建緩存區(qū)的Memecache對(duì)于小文件是比較適合的,但如果存儲(chǔ)的是大圖片文件,則存儲(chǔ)效率會(huì)明顯降低。Redis可以克服Memecache的這一不足,會(huì)周期性地對(duì)圖片文件進(jìn)行更新,或者追加寫入。另外,Redis支持大文件緩存,在緩存量比較大時(shí)還能高速運(yùn)行。
4 圖片分布式處理設(shè)計(jì)
在進(jìn)行圖片的分布式處理時(shí),設(shè)計(jì)理念如下[4]:把合并后的圖片大文件存儲(chǔ)到HDFS文件系統(tǒng)中,此處的大文件包括Index部分和Data部分。處理海量圖片時(shí),根據(jù)MapReduce計(jì)算框架的要求,Map階段先加載圖片的Index部分,根據(jù)Index對(duì)Data部分進(jìn)行分割,并生成Split切片;各個(gè)數(shù)據(jù)節(jié)點(diǎn)處理完自己的切片后,生成一個(gè)個(gè)待處理的圖片小文件;把這些圖片小文件的內(nèi)容作為Map程序的Value,圖片文件名的Hash值作為Map程序的Key。
Map程序取得輸入后,就可以對(duì)圖片進(jìn)行處理,比如調(diào)用OpenCV進(jìn)行二值化。Map程序處理后的結(jié)果會(huì)以鍵值對(duì)的形式傳遞給Reduce程序,并最終生成處理后的圖片。
MapReduce計(jì)算框架進(jìn)行并行處理時(shí),主要過(guò)程是先接收?qǐng)D片文件作為輸入,并使用Map程序和Reduce程序進(jìn)行轉(zhuǎn)換處理,最后輸出處理后的圖片文件。在這一過(guò)程中有兩個(gè)接口至關(guān)重要:InputFormat接口用于控制輸入文件,OutputFormat接口可以按照特定格式輸出文件。InputFormat接口包括createRecordReader()和getSplits()兩個(gè)方法,分別用于定義輸入分片、讀取分片,在并行處理海量圖片的時(shí)候尤為有用。OutputFormat接口包含getRecordWriter()和checkOutputSpecs()兩個(gè)方法,checkOutputSpecs()方法會(huì)確定每個(gè)并行任務(wù)的輸出路徑,getRecordWriter()方法會(huì)在Reduce階段輸出切片的Key/Value值。
5 總結(jié)
本文對(duì)基于Hadoop技術(shù)的海量圖片的存儲(chǔ)和處理進(jìn)行研究。首先,介紹了Hadoop技術(shù)及其組成部分;接下來(lái),在此基礎(chǔ)上闡述了對(duì)圖片的存儲(chǔ)至關(guān)重要的圖片檢索算法,以提高圖片的存儲(chǔ)效率;然后分別進(jìn)行圖片的存儲(chǔ)設(shè)計(jì)和分布式處理設(shè)計(jì)。
參考文獻(xiàn):
[1] 孫玉林, 王曉卉. 一種基于Hadoop的海量圖片檢索策略[J].電子技術(shù)與軟件工程,2016 (18) :89-89.
[2] 王梅,朱信忠,趙建民,等.基于Hadoop的海量圖像檢索系統(tǒng)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2013 (1) :204-208.
[3] 李林. 基于hadoop的海量圖片存儲(chǔ)模型的分析和設(shè)計(jì)[D].杭州電子科技大學(xué)碩士畢業(yè)論文,2011.12.
[4] 張振猛. 基于Hadoop的海量文件存儲(chǔ)系統(tǒng)的分析與設(shè)計(jì)[D].北京工業(yè)大學(xué),2015.
【通聯(lián)編輯:王力】