本文針對海量數(shù)據(jù)處理過程中的處理速度、存儲空間、容錯性、訪問時間等方面存在的問題,通過對Google MapReduce編程模型的原理、執(zhí)行流程等進行分析研究,介紹5種主要的MapReduce實現(xiàn)框架:Hadoop MapReduce、Apache Spark、Phoenix、Disco、Mars,以期對MapReduce編程模型在行業(yè)內(nèi)的使用前景有一個較全面的認識。
MapReduce介紹
海量數(shù)據(jù)的處理對服務(wù)器CPU、I/O的吞吐都是嚴(yán)峻的考驗,傳統(tǒng)的技術(shù)架構(gòu)和僅靠單臺計算機基于串行的方式越來越不能適應(yīng)當(dāng)前海量數(shù)據(jù)處理的要求。只有將這些計算進行并行化處理,通過提取出處理過程中存在的可并行工作的分量,用分布式模型來實現(xiàn)這些并行分量的并行執(zhí)行過程。
MapReduce是由谷歌推出的一個編程模型,是一個能處理和生成超大規(guī)模數(shù)據(jù)集的算法模型,該架構(gòu)能夠在大量普通配置的計算機上實現(xiàn)并行化處理。
MapReduce編程模型結(jié)合用戶實現(xiàn)的Map和Reduce函數(shù)。用戶自定義的Map函數(shù)處理一個輸入的基于key/value pair的集合,輸出中間基于key/value pair的集合,MapReduce庫把中間所有具有相同key值的value值集合在一起后傳遞給Reduce函數(shù),用戶自定義的Reduce函數(shù)合并所有具有相同key值的value值,形成一個較小value值的集合。一般地,一個典型的MapReduce程序的執(zhí)行流程如圖1所示。
MapReduce執(zhí)行過程主要包括:
將輸入的海量數(shù)據(jù)切片分給不同的機器處理;
執(zhí)行Map任務(wù)的Worker將輸入數(shù)據(jù)解析成key/value pair,用戶定義的Map函數(shù)把輸入的key/value pair轉(zhuǎn)成中間形式的key/value pair;
按照key值對中間形式的key/value進行排序、聚合;
把不同的key值和相應(yīng)的value集分配給不同的機器,完成Reduce運算;
任務(wù)成功完成后,MapReduce的輸出存放在R個輸出文件中,一般情況下,這R個輸出文件不需要合并成一個文件,而是作為另外一個MapReduce的輸入,或者在另一個可處理多個分割文件的分布式應(yīng)用中使用。
MapReduce主要框架介紹
Hadoop MapReduce是一個在計算機集群上分布式處理海量數(shù)據(jù)集的軟件框架,包括一個JobTracker和一定數(shù)量的TaskTracker。用戶將MapReduce作業(yè)發(fā)送給Jobtracker所在集群的其他機器上分割工作,集群中其他機器執(zhí)行Tasktracker的Map或Reduce任務(wù)。
Spark是一個基于內(nèi)存計算的開源的集群計算系統(tǒng),目的是讓數(shù)據(jù)分析更加快速。Spark非常小巧玲瓏,由加州伯克利大學(xué)AMP實驗室的Matei為主的小團隊所開發(fā)。使用的語言是Scala,項目的核心core部分的代碼只有63個Scala文件,非常短小精悍。Spark 啟用了內(nèi)存分布數(shù)據(jù)集,除了能夠提供交互式查詢外,它還可以優(yōu)化迭代工作負載。
Phoenix作為斯坦福大學(xué)EE382a課程的一類項目,由斯坦福大學(xué)計算機系統(tǒng)實驗室開發(fā)。Phoenix對MapReduce的實現(xiàn)原則和最初由Google實現(xiàn)的MapReduce基本相同。不同的是,它在集群中以實現(xiàn)共享內(nèi)存系統(tǒng)為目的,共享內(nèi)存能最小化由任務(wù)派生和數(shù)據(jù)間的通信所造成的間接成本。Phoenix可編程多核芯片或共享內(nèi)存多核處理器(SMPs和ccNUMAs),用于數(shù)據(jù)密集型任務(wù)處理。
Disco是由Nokia研究中心開發(fā)的,基于MapReduce的分布式數(shù)據(jù)處理框架,核心部分由Erlang語言開發(fā),外部編程接口為Python語言。Disco是一個開放源代碼的大規(guī)模數(shù)據(jù)分析平臺,支持大數(shù)據(jù)集的并行計算,能運行在不可靠的集群計算機上。Disco可部署在集群和多核計算機上,還可部署在Amazon EC2 上。
Mars是香港科技大學(xué)與微軟、新浪合作開發(fā)的基于GPU的MapReduce框架。目前已經(jīng)包含字符串匹配、矩陣乘法、倒排索引、字詞統(tǒng)計、網(wǎng)頁訪問排名、網(wǎng)頁訪問計數(shù)、相似性評估和K均值等8項應(yīng)用,能夠在32位與64位的Linux平臺上運行。
針對5種框架的特點筆者進行了如下分類。
編程語言
Hadoop MapReduce: Hadoop采用Java開發(fā),所以能很好地支持Java語言編寫的MapReduce作業(yè),如果采用C/C++或其他語言編寫MapReduce作業(yè),需要用到Hadoop Streaming或Hadoop Pipes工具;
Spark:Spark 是在 Scala 語言中實現(xiàn)的,它將 Scala 用作其應(yīng)用程序框架。與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作本地集合對象一樣輕松地操作分布式數(shù)據(jù)集;
Phoenix:采用全C++編寫,總代碼量不超過1萬行,提供C和C++的應(yīng)用程序接口;
Disco:核心部分采用并發(fā)性能很高的Erlang語言開發(fā),其外部編程接口為易于編程的Python語言;
Mars:采用C++編寫,提供C、C++的應(yīng)用程序編程接口,支持最新的CUDA SDK。
構(gòu)建平臺
Hadoop MapReduce:需要首先架構(gòu)基于Hadoop的集群系統(tǒng),通過HDFS完成運算的數(shù)據(jù)存儲工作;
Spark:可以的單獨運行,也可以與Hadoop框架完整結(jié)合;
Phoenix:獨立運行,不需要提前部署集群,運行時系統(tǒng)的實現(xiàn)是建立在PThread之上的,也可方便地移植到其他共享內(nèi)存線程庫上;
Disco:整個Disco平臺由分布式存儲系統(tǒng)DDFS和MapReduce框架組成,DDFS與計算框架高度耦合,通過監(jiān)控各個節(jié)點上的磁盤使用情況進行負載均衡;
Mars:運行時為Map或Reduce任務(wù)初始化大量的GPU線程,并為每個線程自動分配少量的key/value對來運行任務(wù)。
功能特點
Hadoop MapReduce:計算能力非常強,適合超大數(shù)據(jù)集的應(yīng)用程序,但是由于系統(tǒng)開銷等原因,處理小規(guī)模數(shù)據(jù)的速度不一定比串行程序快,并且本身集群的穩(wěn)定性不高;
Spark:在保證容錯的前提下,用內(nèi)存來承載工作集,內(nèi)存的存取速度快于磁盤多個數(shù)量級,從而可以極大提升性能;
Phoenix:利用共享內(nèi)存緩沖區(qū)實現(xiàn)通信,從而避免了因數(shù)據(jù)復(fù)制產(chǎn)生的開銷,但Phoenix也存在不能自動執(zhí)行迭代計算、沒有高效的錯誤發(fā)現(xiàn)機制等不足;
Disco:由一個Master服務(wù)器和一系列Worker節(jié)點組成,Master和Worker之間采用基于輪詢的通信機制,通過HTTP的方式傳輸數(shù)據(jù)。輪詢的時間間隔不好確定,若時間間隔設(shè)置不當(dāng),會顯著降低程序的執(zhí)行性能;
Mars:由于GPU線程不支持運行時動態(tài)調(diào)度,所以給每個GPU線程分配的任務(wù)是固定的,若輸入數(shù)據(jù)劃分布均勻,將導(dǎo)致Map或Reduce階段的負載不均衡,使得整個系統(tǒng)性能急劇降低。同時由于GPU不支持運行時在設(shè)備內(nèi)存中分配空間,需要預(yù)先在設(shè)備內(nèi)存中分配好輸入數(shù)據(jù)和輸出數(shù)據(jù)的存放空間,但是Map和Reduce階段輸出數(shù)據(jù)大小是未知的,并且當(dāng)多個GPU線程同時向共享輸出區(qū)域中寫數(shù)據(jù)時,易造成寫沖突。
五類實現(xiàn)框架對海量文本數(shù)據(jù)的統(tǒng)計實驗
單詞計數(shù)(WordCount)是最簡單也是最能體現(xiàn)MapReduce思想的程序之一,可以稱為MapReduce版“Hello World”。單詞計數(shù)主要完成功能是:統(tǒng)計一系列文本文件中每個單詞出現(xiàn)的次數(shù)。
WordCount的實現(xiàn)步驟:
1、將文件拆分成splits,由于測試用的文件較小,所以每個文件為一個split,并將文件按行分割形成對,如圖2-1所示。這一步由MapReduce框架自動完成,其中偏移量(即key值)包括了回車所占的字符數(shù)(Windows和Linux環(huán)境會不同)。
2、將分割好的對交給用戶定義的map方法進行處理,生成新的對。
3、得到map方法輸出的對后,Mapper會將它們按照key值進行排序,并執(zhí)行Combine過程,將key至相同value值累加,得到Mapper的最終輸出結(jié)果。
4、Reducer先對從Mapper接收的數(shù)據(jù)進行排序,再交由用戶自定義的reduce方法進行處理,得到新的對,并作為WordCount的輸出結(jié)果。
本次實驗的硬件資源基于x86服務(wù)器1臺,配置內(nèi)存為32GB DDR3,E5 CPU/12核,GPU。實驗數(shù)據(jù)樣本為10M/50M/100M/500M/1000M的文本文件五個,我們使用Hadoop MapReduce、Spark、Phoenix、Disco、Mars等MapReduce框架分別運行文本分析程序,基于結(jié)果一致的前提下統(tǒng)計出運行時間、運行時CPU占有率、運行時內(nèi)存占有率等數(shù)據(jù),并采用這些數(shù)據(jù)繪制成柱狀圖。
Hadoop MapReduce的運行時間最長,原因是Hadoop生態(tài)環(huán)境包含內(nèi)容過多,所以每次任務(wù)啟動時首先需要加載所需資源包,然后緩慢地發(fā)起任務(wù),并且由于本身是用性能較差的Java語言編寫的,所以導(dǎo)致整體計算時間長、性能差。Phoenix由于采用匯編和C語言編寫,內(nèi)核很小,運行時所用資源很少,所以整個測試過程耗時也較少。Mars由于必須在GPU上運行,本身GPU由于價格因素,導(dǎo)致不太可能在實際應(yīng)用場景里推廣,所以Phoenix的性價比是最高的。需要時長從高到低分別是Hadoop MapReduce、Disco、Spark、Phoenix、Mars。
Hadoop MapReduce、Disco這兩個框架需要占用的CPU資源在1000M文本處理時基本到達最大飽和度(大于90%),Apache Spark的CPU使用率沒有完全伴隨著文本文件增大而大幅上漲,Phoenix和Mars基本控制在性價比較高的范圍內(nèi)。
Mars和Phoenix使用的內(nèi)存在數(shù)據(jù)量較小時是最少的,Apache Spark為隨著數(shù)據(jù)量增大而大幅增加,在數(shù)據(jù)量最大時它對內(nèi)存的消耗是最小的。Hadoop MapReduce和Disco都需要占用較多的內(nèi)存。
從上面的測試結(jié)果我們得出,如果用戶只需要處理海量的文本文件,不需要考慮存儲、二次數(shù)據(jù)挖掘等,采用Phoenix是最大性價比的選擇。如果應(yīng)用程序需要處理的數(shù)據(jù)量非常大,并且客戶希望計算出的數(shù)據(jù)可以被存儲和二次計算或數(shù)據(jù)挖掘,那Hadoop MapReduce較好,因為整個Hadoop生態(tài)圈龐大,支持很好。Apache Spark由于架構(gòu)層面設(shè)計不同,所以對于CPU、內(nèi)存的使用率一直保持較低狀態(tài),它未來可以用于海量視頻分析用途。
五類實現(xiàn)框架結(jié)合視頻人臉分析的實驗
安防行業(yè)的并行測試實驗大多是基于智能視頻分析技術(shù)基礎(chǔ)之上的。智能視頻分析技術(shù)是一種基于人工智能的識別模式。它綜合了各種高科技研究成果,主要借助智能視頻分析技術(shù)的處理方法,在結(jié)合一些硬件設(shè)施,對某些對象(比如人員、車輛等)進行研究和處理,形成一種核心算法。
在本次測試中,我們針對的是人臉特征抓取實驗,即通過對一段指定錄像分析,提取出錄像中所有出現(xiàn)的人臉圖片的過程。對錄像中出現(xiàn)的人臉圖片分析過程大致上可以分為三個階段:取流、解碼及分析、提取物發(fā)送。碼流分析提取服務(wù)即我們本次實驗所需要的三個階段。
主計算節(jié)點把錄像文件讀入到內(nèi)存中,將碼流分割為若干個子塊分發(fā)給從計算節(jié)點。由于我們采用的是MapReduce框架,所以程序會自動分為若干個線程執(zhí)行,每個線程對應(yīng)一個Map,每個Map都會執(zhí)行解碼、分析、結(jié)果輸出三個步驟。
我們在x86機器上進行了本次實驗,實驗數(shù)據(jù)是一個2.66GB大小的包含1092個人臉的錄像文件,錄像分辨率為1080P。我們通過分別采用不同的MapReduce框架來運行程序,對程序運行結(jié)果進行匹配,5個框架的運行結(jié)果完全一致,即抓取出1092個人臉圖片。我們對程序運行時間、運行過程中CPU使用率、運行過程中內(nèi)存使用率做了統(tǒng)計并生成柱狀圖供參考。本次實驗過程中所使用的人臉檢測算法是筆者公司圖像處理與智能分析部門自主研發(fā)的算法。
Mars和Phoenix框架處理錄像所需時間最短,運行智能分析程序時CPU使用率對于所有框架基本上都達到最大飽和度(90%以上)。由于所做的實驗是對碼流進行分析,碼流本身需要占用較大的內(nèi)存空間,解碼、分析等處理過程也許要占用內(nèi)存用于存放中間結(jié)果,所以內(nèi)存基本上也達到最大使用飽和度(90%以上)。綜上所述,CPU和內(nèi)存的使用率在本類實驗過程中不需要過多考慮,最主要的對比點是運行時間??紤]到Mars必須基于GPU運行,并且GPU的價格較高,所以Phoenix的性價比更高。Hadoop MapReduce雖然處理時間最長,但是它具有強大的生態(tài)環(huán)境,利于對處理結(jié)果數(shù)據(jù)進行保存和數(shù)據(jù)挖掘,所以對于大型公司來說它依然是很好的選擇。Apache Spark雖然在本次實驗中沒有太多亮點,但是從各類大數(shù)據(jù)學(xué)術(shù)會議上得到的反饋較好,它基于內(nèi)存方式的運算模式可以幫助處理海量數(shù)據(jù),未來一定可以在智能分析領(lǐng)域有很大的作為。
結(jié)語
現(xiàn)實世界很多實例都可用MapReduce編程模型來表示,MapReduce作為一個通用可擴展的、高容錯性的并行處理模型,可有效地處理海量數(shù)據(jù),不斷地從中分析挖掘出有價值的信息。MapReduce封裝了并行處理、負載均衡、容錯、數(shù)據(jù)本化等技術(shù)難點細節(jié)。通過本文的兩例測試用例可以證明MapReduce 適用于海量文本分析、海量視頻智能分析等安防行業(yè)密切相關(guān)的應(yīng)用場景,諸如行為分析、車牌識別、人臉抓拍、客流統(tǒng)計等智能化技術(shù)的應(yīng)用,尤其是對海量視頻執(zhí)行高并發(fā)處理,可以很好地在平安城市、智慧城市等大型安防項目中落地,為公安機關(guān)治安管理、案件偵破等提供有力的技術(shù)支持。