基于Hadoop的海量圖片存儲處理系統研究

2019-05-25 00:05:00 電腦知識與技術 2019年10期

传奇霸业消费活动攻略 www.bicok.icu

程孝孝

摘要:隨著計算機視覺與人工智能技術的發展,網絡中的圖片及視頻資源越來越多,海量圖片的檢索及存儲就成為一個重要的現實問題。Hadoop提供的HDFS可以提供可靠的高并發訪問,MapReduce計算框架能夠并行進行圖片的處理,因此對于海量圖片的快速存儲和處理有巨大幫助。

關鍵詞:Hadoop;海量圖片;存儲優化;分布式處理

中圖分類號:TP393 文獻標識碼:A

文章編號:1009-3044(2019)10-0221-02

開放科學(資源服務)標識碼(OSID):

相對于文字而言,圖片資源是一種內容豐富、方便理解的工具,已經深入應用到日常生活的方方面面。隨著人工智能技術、計算機視覺技術在各個領域的應用和手機終端的普及,圖片數量也已級數級別迅猛增長。在圖片資源可以稱海量的情況下,如何從海量圖片中檢索出有用的數據、如何高速的實現圖片的存取就是一件有現實意義的研究。

Hadoop開源大數據平臺是一個可以處理海量數據的分布式并行計算框架,它提供的HDFS并行文件系統為海量圖片的實際存儲提供物理平臺,MapReduce計算框架可以對海量圖片進行并行處理,Hbase可以為海量圖片的存儲提供多格式的統一管理。

1 Hadoop技術

Hadoop是一個基于Java語言的分布式并行框架,包括多個組件,其中最核心的是[1]:(1)HDFS分布式文件系統??梢圓渴鷦詼嗵芻魃?,不僅可以通過組成集群的方式提高硬件資源的利用率,還能夠在線添加、刪除集群節點,或對分布式文件系統上存儲的資源進行各種操作。HDFS能夠保證存儲數據的安全性及可靠性,其高容錯性保證了即使在出現故障時,數據也能夠正常的存儲和傳輸。(2)MapReduce計算框架。MapReduce會把大任務分解為多個小任務,然后在每個小任務處理完畢后進行匯總。多個小任務是并行處理的,這種并發執行提高了存儲效率。(3)Hbase數據庫。存儲數據不是通過關系型數據庫實現,無須事先定義列的數目及類型,支持列的通道擴展;所有的列存儲的數據都是二進制的。

2 檢索算法及存儲優化

圖片的檢索和圖片的存儲息息相關,存儲圖片的目的是為了檢索并使用圖片,因此圖片的檢索算法對圖片的存儲至關重要。

傳統的圖片存儲一般都是通過Oracle等關系型數據庫完成,然而傳統的數據庫在使用時存在一定的不足[2]:(1)數據需要滿足表結構指定的類型,而且表結構通常是固定的,可擴展性不佳。(2)海量數據的存儲效率比較低,不適合海量圖片的高并發快速存取。正是基于這樣的原因,在處理海量圖片時,傳統的圖片檢索方式主要有兩種:基于文本特征的圖片檢索(TBIR)和基于內容的圖片檢索(CBIR)。

在數據量不太大時,存儲圖片時可以直接把每個圖片和存儲表的地址對應起來。然而,如果數據量比較大的時候,順序存儲表中的存儲空間會浪費很多。

哈希檢索算法是一種精準的檢索算法,它主要包括哈希存儲表以及哈希函數兩個組成部分。哈希存儲表是真正存儲圖片的存儲空間,哈希函數是一種映射關系,指定了按照某規律分布的圖片映射到不同的哈希存儲表內。通過哈希檢索算法檢索圖片時,需要的時間復雜度會大大降低,從而提高了檢索效率。

為了解決海量的圖片小文件的存儲問題,可以采取不同的優化方案。Hadoop內置兩種存儲圖片小文件的優化方案:SquenceFile以及MapFile。

Hadoop提供了存儲二進制文件的機制——SquenceFile。多個小的圖片文件可以組合為一個大的SquenceFile大文件,其結構如圖1所示:

由圖可以看出,SquenceFile文件由一系列鍵值對組成,其中Key處存放圖片文件名,Value處存放圖片文件的內容。對于存儲海量小的圖片文件來說,可以以這種Key/Value形式把若干圖片文件寫入到SquenceFile文件容器中。例如,假設有1000萬張大小為30K的圖片,則存放這些圖片文件使用的SquenceFile大概為300G。

在實際應用過程中,為了提高網絡帶寬的傳輸速率,可以壓縮SquenceFile大文件,同時也節省了磁盤空間。值得注意的是,雖然很多圖片小文件可以存儲到一個大的SquenceFile文件中,但是并沒有維護小圖片文件在SquenceFile文件中的索引關系,所以如果需要在SquenceFile大文件中檢索一個圖片文件,則需要遍歷整個SquenceFile文件,圖片檢索效率不太好。

可以把MapFile看做是帶索引的SequenceFile,Index部分存儲圖片文件的索引,Data部分存儲圖片文件。和SequenceFile類似的是,Data部分也是Key/Value的形式,key存放圖片文件的文件名,Value存放圖片文件。在需要訪問MapFile中的小圖片文件時,會先加載Index部分,從中獲取小圖片文件所在的位置,然后再訪問Data部分存儲的圖片內容。

3 圖片存儲系統設計

在對小圖片文件的存儲模式進行優化后,可以將存儲系統設計為業務層、服務層和存儲層三部分[3]:業務層負責完成圖片文件的業務處理,存儲層實現存儲功能,服務層為業務層或存儲層的讀取提供服務。

業務處理??槭迪侄醞計蕕拇?。圖片在上傳到存儲平臺前通常需要進行縮放、裁剪等操作?;贖adoop的海量圖片存儲系統可以使用MapReduce處理圖片,然后將處理后的圖片存儲到分布式HDFS上,從而減輕了各個工作節點的處理壓力。

圖片索引??楸4媼送計腦?。Hadoop系統中的元數據指的是保存到NameNode節點上的Block信息,然而在使用hadoop保存圖片數據時,每個圖片都有圖片名稱、上傳時間、圖片描述等信息,隨著存儲的圖片數量越來越多,這些信息的總量也會越來越大,當這些元數據達到G級別的時候就不再適合保存到NameNode中,此時可以考慮將其存儲到Hbase數據庫內。默認情況下HDFS單個Block是64M,如果圖片文件不大,則可以把多個圖片文件拼接到一個Block中,既提高了HDFS的利用效率,又使得維護更加簡單。

存儲??樵詼喔雋芻魃喜渴餒DFS文件系統,并對外提供可以實現對圖片操作的接口。通常情況下保存的圖片大小是不規則的,可以認為小于2M的圖片是小圖片,大于2M的圖片是大圖片,不同的圖片采取不同的存儲及檢索策略。小圖片可以直接安裝上面的存儲優化策略進行;大圖片則需要使用MapReduce任務拆分后進行多次并行存取。

在同時存儲的圖片數量很多時,可能需要進行緩存?;捍娣衲?櫚墓δ蓯槍乖旎捍媲?,并對圖片文件進行篩選過濾。傳統的用于構建緩存區的Memecache對于小文件是比較適合的,但如果存儲的是大圖片文件,則存儲效率會明顯降低。Redis可以克服Memecache的這一不足,會周期性地對圖片文件進行更新,或者追加寫入。另外,Redis支持大文件緩存,在緩存量比較大時還能高速運行。

4 圖片分布式處理設計

在進行圖片的分布式處理時,設計理念如下[4]:把合并后的圖片大文件存儲到HDFS文件系統中,此處的大文件包括Index部分和Data部分。處理海量圖片時,根據MapReduce計算框架的要求,Map階段先加載圖片的Index部分,根據Index對Data部分進行分割,并生成Split切片;各個數據節點處理完自己的切片后,生成一個個待處理的圖片小文件;把這些圖片小文件的內容作為Map程序的Value,圖片文件名的Hash值作為Map程序的Key。

Map程序取得輸入后,就可以對圖片進行處理,比如調用OpenCV進行二值化。Map程序處理后的結果會以鍵值對的形式傳遞給Reduce程序,并最終生成處理后的圖片。

MapReduce計算框架進行并行處理時,主要過程是先接收圖片文件作為輸入,并使用Map程序和Reduce程序進行轉換處理,最后輸出處理后的圖片文件。在這一過程中有兩個接口至關重要:InputFormat接口用于控制輸入文件,OutputFormat接口可以按照特定格式輸出文件。InputFormat接口包括createRecordReader()和getSplits()兩個方法,分別用于定義輸入分片、讀取分片,在并行處理海量圖片的時候尤為有用。OutputFormat接口包含getRecordWriter()和checkOutputSpecs()兩個方法,checkOutputSpecs()方法會確定每個并行任務的輸出路徑,getRecordWriter()方法會在Reduce階段輸出切片的Key/Value值。

5 總結

本文對基于Hadoop技術的海量圖片的存儲和處理進行研究。首先,介紹了Hadoop技術及其組成部分;接下來,在此基礎上闡述了對圖片的存儲至關重要的圖片檢索算法,以提高圖片的存儲效率;然后分別進行圖片的存儲設計和分布式處理設計。

參考文獻:

[1] 孫玉林, 王曉卉. 一種基于Hadoop的海量圖片檢索策略[J].電子技術與軟件工程,2016 (18) :89-89.

[2] 王梅,朱信忠,趙建民,等.基于Hadoop的海量圖像檢索系統[J].計算機技術與發展,2013 (1) :204-208.

[3] 李林. 基于hadoop的海量圖片存儲模型的分析和設計[D].杭州電子科技大學碩士畢業論文,2011.12.

[4] 張振猛. 基于Hadoop的海量文件存儲系統的分析與設計[D].北京工業大學,2015.

【通聯編輯:王力】

?