張浩 孫淑霞
(成都理工大學(xué)信息科學(xué)與技術(shù)學(xué)院, 四川 成都 610059)
隨著網(wǎng)絡(luò)技術(shù)的發(fā)展,網(wǎng)絡(luò)可提供的服務(wù)越來越多。視頻業(yè)務(wù)作為一種典型的網(wǎng)絡(luò)服務(wù),具有極大的發(fā)展?jié)摿褪袌?chǎng)規(guī)模。與其它業(yè)務(wù)比較而言,視頻業(yè)務(wù)有自身特點(diǎn):視頻處理過程對(duì)計(jì)算能力要求高;視頻的編碼、解碼、實(shí)時(shí)視頻處理等技術(shù),涉及到大量的空域頻域的變換,在時(shí)效性較強(qiáng)的視頻業(yè)務(wù)中,對(duì)計(jì)算能力構(gòu)成很大挑戰(zhàn)。Hadoop是一個(gè)開源的云計(jì)算框架,它是一個(gè)適合處理海量數(shù)據(jù)的并行編程系統(tǒng),可以根據(jù)輸入數(shù)據(jù)分布等信息自動(dòng)創(chuàng)建多個(gè)并行子任務(wù),并將子任務(wù)調(diào)度到合適的集群節(jié)點(diǎn)上并行執(zhí)行。所以此模型能夠很好地適用于多個(gè)視頻文件同時(shí)轉(zhuǎn)碼。MapReduce是Hadoop系統(tǒng)的一個(gè)核心模塊,它使得程序員不必關(guān)心節(jié)點(diǎn)失效、任務(wù)失效及任務(wù)之間的數(shù)據(jù)等問題,而只需按照MapReduce編程規(guī)范定義好map函數(shù)、reduce函數(shù)以及一些數(shù)據(jù)格式信息,即可完成分布式數(shù)據(jù)處理問題。
談到Hadoop不得不提到云計(jì)算,云計(jì)算是網(wǎng)格計(jì)算、分布式計(jì)算、并行計(jì)算、效應(yīng)計(jì)算、網(wǎng)絡(luò)存儲(chǔ)、虛擬化、負(fù)載均衡等傳統(tǒng)計(jì)算機(jī)技術(shù)和網(wǎng)絡(luò)技術(shù)發(fā)展融合的產(chǎn)物。云計(jì)算的基本思想是通過構(gòu)建大規(guī)模的基于集群系統(tǒng)的數(shù)據(jù)中心,將集群中的資源以虛擬化的形式向用戶提供資源池。總之,云計(jì)算是在分布式計(jì)算的技術(shù)基礎(chǔ)上的更高層次的“集中式”計(jì)算處理模式,Hadoop是由Apache開源組織的一個(gè)分布式計(jì)算框架,可以在大量廉價(jià)的硬件設(shè)備組成的集群上運(yùn)行應(yīng)用程序,為應(yīng)用程序提供了一組穩(wěn)定可靠的接口,旨在構(gòu)建一個(gè)有高可靠性和良好擴(kuò)展性的分布式系統(tǒng),它是現(xiàn)在實(shí)現(xiàn)云計(jì)算的主要可選方式之一。Hadoop主要包括Hadoop分布式文件系統(tǒng)和計(jì)算模型MapReduce兩個(gè)部分。
HDFS有著高容錯(cuò)性(fault-tolerent)的特點(diǎn),設(shè)計(jì)用來部署在低廉的(low-cost)硬件上。它提供高傳輸率(high throughput)來訪問應(yīng)用程序的數(shù)據(jù),適合那些有著超大數(shù)據(jù)集(large data set)的應(yīng)用程序。HDFS采用Master/Slave架構(gòu),一個(gè)HDFS集群由一個(gè)NameNode節(jié)點(diǎn)和一組DataNode節(jié)點(diǎn)組成;NameNode管理文件系統(tǒng)的元數(shù)據(jù),而DataNode存儲(chǔ)了實(shí)際的數(shù)據(jù)。
MapReduce是由Google提出的云計(jì)算核心計(jì)算模型,提供了比多線程編程更上一層的接口,屏蔽了許多細(xì)節(jié)性問題,降低了開發(fā)者的入門門檻,提高了開發(fā)分布式程序的效率。MapReduce是一個(gè)用于大數(shù)據(jù)量計(jì)算的編程模型,同時(shí)也是一種高效的任務(wù)調(diào)度模型。在MapReduce計(jì)算模型中,需要用戶提供兩個(gè)關(guān)鍵函數(shù),map函數(shù)和reduce函數(shù),即映射和規(guī)約兩個(gè)主要過程。MapReduce框架運(yùn)行于HDFS文件系上面,這兩個(gè)函數(shù)對(duì)一組鍵值對(duì)(key/value)進(jìn)行操作,得出另一組鍵值對(duì):(input)
通過上面關(guān)于云計(jì)算和Hadoop相關(guān)知識(shí)的介紹,結(jié)合大批量、多用戶視頻轉(zhuǎn)碼對(duì)計(jì)算資源的需求,實(shí)現(xiàn)基于Hadoop云計(jì)算平臺(tái)的視頻轉(zhuǎn)碼。本項(xiàng)目視頻處理類的實(shí)現(xiàn)是基于音視頻轉(zhuǎn)換軟件ffmpeg,通過MapReduce中map函數(shù)封裝ffmpeg轉(zhuǎn)碼功能,當(dāng)大量視頻轉(zhuǎn)碼任務(wù)提交到集群時(shí),系統(tǒng)自動(dòng)把任務(wù)隨機(jī)分配到集群節(jié)點(diǎn)上,利用集群系統(tǒng)計(jì)算能力和已有視頻轉(zhuǎn)碼開源軟件實(shí)現(xiàn)多視頻同時(shí)在線轉(zhuǎn)碼。關(guān)于視頻轉(zhuǎn)碼相關(guān)技術(shù)如碼率轉(zhuǎn)換、空間分辨率轉(zhuǎn)換、時(shí)間分辨率轉(zhuǎn)換、語法轉(zhuǎn)換、容錯(cuò)視頻轉(zhuǎn)碼等都交給已有的轉(zhuǎn)碼軟件來實(shí)現(xiàn)。關(guān)于Hadoop集群的搭建可以通過網(wǎng)絡(luò)、書籍找到大量相關(guān)資料,關(guān)于具體map函數(shù)、reduce函數(shù)以及key、value對(duì)的劃分等細(xì)節(jié)問題這里也不做詳細(xì)解釋,只給出了視頻轉(zhuǎn)碼的開發(fā)框架。
在本設(shè)計(jì)中,使用Java提供的Runtime類進(jìn)行本地轉(zhuǎn)碼功能代碼的調(diào)用。這樣做的好處是:不論本地視頻處理功能是由什么編程語言實(shí)現(xiàn)的,只要最終的形式是可執(zhí)行文件,都可以被MapReduce框架調(diào)用。Runtime類可以取得Java虛擬機(jī)的運(yùn)行時(shí)環(huán)境,這個(gè)類有一個(gè)非常有用的方法exec(String cmdArray[])用于調(diào)用本地可執(zhí)行文件。此方法的參數(shù)是要被調(diào)用的可執(zhí)行文件的命令行字符串?dāng)?shù)組。該字符串?dāng)?shù)組的值取決于視頻處理功能的具體實(shí)現(xiàn)。
Hadoop系統(tǒng)包括分布式文件系統(tǒng)HDFS、并行計(jì)算框架MapReduce、作業(yè)隊(duì)列管理模塊。HDFS用于存儲(chǔ)本地上傳的視頻文件,MapReduce框架用于完成視頻轉(zhuǎn)碼功能,作業(yè)隊(duì)列管理模塊用于接收本地提交的任務(wù)信息,分析任務(wù),將任務(wù)分割給云節(jié)點(diǎn)的計(jì)算單元,最后將視頻轉(zhuǎn)碼后的信息寫入數(shù)據(jù)庫。
視頻轉(zhuǎn)碼框架如圖1所示:
圖1 視頻轉(zhuǎn)碼系統(tǒng)整體架構(gòu)
Hadoop系統(tǒng)中的視頻作業(yè)控制模塊主要由5個(gè)模塊組成。各個(gè)模塊的功能如下:
(1)子作業(yè)流創(chuàng)建模塊:一個(gè)視頻處理作業(yè)可以劃分為多個(gè)MapReduce子作業(yè),根據(jù)視頻開發(fā)用戶提供的信息生成一系列的MapReduce作業(yè)流,包括視頻作業(yè)子作業(yè)的個(gè)數(shù)和各個(gè)子作業(yè)之間的依賴關(guān)系。
(2)視頻作業(yè)信息模塊:此模塊用于維護(hù)一個(gè)視頻作業(yè)完成狀態(tài)信息和各個(gè)子作業(yè)的完成進(jìn)度信息以及各個(gè)子作業(yè)的文件輸出位置等信息。子作業(yè)提交模塊根據(jù)此模塊和子作業(yè)創(chuàng)建模塊提供的信息決定哪個(gè)時(shí)間提交子作業(yè)流中的一個(gè)MapReduce子作業(yè)。
(3)子作業(yè)提交模塊:此模塊對(duì)視頻作業(yè)信息模塊中的子作業(yè)信息進(jìn)行監(jiān)控,一旦滿足作業(yè)提交的要求,從子作業(yè)流創(chuàng)建模塊中取出一個(gè)子作業(yè),提交到Hadoop中執(zhí)行。
(4)子作業(yè)監(jiān)控模塊:此模塊負(fù)責(zé)向Hadoop系統(tǒng)獲取各個(gè)子作業(yè)完成的狀態(tài)信息,并負(fù)責(zé)更新視頻作業(yè)信息的完成狀態(tài)。
(5)作業(yè)清理模塊:此模塊用于一個(gè)視頻作業(yè)完成后,清理完成視頻作業(yè)的過程中HDFS上的臨時(shí)文件,并將視頻作業(yè)的完成狀態(tài)存入數(shù)據(jù)庫中。
圖2 視頻處理流程圖
視頻處理流程如圖2所示流程詳細(xì)過程如下:
(1)用戶將需要處理的視頻上傳到HDFS上;
(2)將視頻的處理信息和所要用到的處理函數(shù)傳遞到視頻處理框架中;
(3)子作業(yè)創(chuàng)建模塊創(chuàng)建一個(gè)子作業(yè)流和一個(gè)視頻作業(yè)信息模塊;
(4)子作業(yè)提交模塊根據(jù)各個(gè)子作業(yè)流的依賴關(guān)系和各個(gè)子作業(yè)的完成狀態(tài)向Hadoop系統(tǒng)提交MapReduce子作業(yè);
(5)Hadoop框架執(zhí)行MapReduce子作業(yè),將各個(gè)子作業(yè)的結(jié)果寫入到HDFS中;
(6)子作業(yè)監(jiān)控模塊從Hadoop系統(tǒng)中獲取各個(gè)子作業(yè)的完成狀態(tài)并更新視頻作業(yè)信息模塊;
(7)整個(gè)視頻作業(yè)完成后,作業(yè)清理模塊負(fù)責(zé)清理HDFS上中間子作業(yè)輸出的臨時(shí)文件并更新視頻作業(yè)信息模塊。
集群使用兩個(gè)節(jié)點(diǎn)作為轉(zhuǎn)碼工作節(jié)點(diǎn),測(cè)試數(shù)據(jù)大小為700M,分布式文件系統(tǒng)塊大小為64M。測(cè)試結(jié)果如表1所示。
表1 集群轉(zhuǎn)碼性能
從表1可以看出:
(1)集群轉(zhuǎn)碼的時(shí)間平均時(shí)間約為單機(jī)轉(zhuǎn)碼所用時(shí)間的1/2,這個(gè)結(jié)果與期望的結(jié)果一致。這說明了將視頻轉(zhuǎn)碼移植到Hadoop平臺(tái)上可以提高轉(zhuǎn)碼效率。
(2)當(dāng)視頻文件分片遠(yuǎn)遠(yuǎn)小于文件系統(tǒng)分片的大小的時(shí)候,集群的轉(zhuǎn)碼性能會(huì)惡化。這表明Hadoop系統(tǒng)適合處理大數(shù)據(jù)量的應(yīng)用。
本文主要論述了在Hadoop平臺(tái)上視頻轉(zhuǎn)碼的設(shè)計(jì)與實(shí)現(xiàn)。隨著視頻數(shù)據(jù)量的急劇增長,傳統(tǒng)的集中式視頻轉(zhuǎn)碼系統(tǒng)存在存儲(chǔ)能力和數(shù)據(jù)處理能力不足、存儲(chǔ)能力和處理能力不可擴(kuò)展的缺點(diǎn)。Hadoop系統(tǒng)的并行任務(wù)分配、任務(wù)本地化、可擴(kuò)展性和高容錯(cuò)性使得Hadoop系統(tǒng)在數(shù)據(jù)密集型任務(wù)處理方面有著優(yōu)秀的表現(xiàn)。視頻處理任務(wù)是一種數(shù)據(jù)密集型任務(wù),將視頻轉(zhuǎn)碼任務(wù)移植到Hadoop系統(tǒng)中可以充分利用現(xiàn)有的計(jì)算資源,使得視頻轉(zhuǎn)碼效率得到提高。
[1]Chuck Lan.Hadoop INACTION[M],Manning Publications,2011.
[2]Hadoop 官 方 文 檔 .http://Hadoop.apache.org/common/docs/toturial.htm[EB/OL].
[3]K.Breitman,M.Endler,R.Pereira,M.Azambuja.."When TV Dies,Will It Go to the Cloud?".IEEEComputer Society,2010:81~83.
[4]FFMpeg.http://ffmpeg.org[EB/OL],2011.
[5]Koetter R.Converting video formats with FFmpeg.Linux Journal archive,2006.