劉炳均,戴云松
(1.中山大學(xué)軟件學(xué)院,廣東廣州510006;2.廣州耘趣網(wǎng)絡(luò)科技有限公司,廣東廣州510000)
在當(dāng)今時代,電視網(wǎng)、電信網(wǎng)和互聯(lián)網(wǎng)的融合要求視頻數(shù)據(jù)可以同時在電視、手機和網(wǎng)絡(luò)進行播放。但是,由于不同平臺的網(wǎng)絡(luò)帶寬狀況、終端播放設(shè)備、用戶需求千差萬別,視頻的編碼格式、分辨率、幀率也各不相同。因此,需要對視頻進行轉(zhuǎn)換編碼。但是,當(dāng)前的視頻轉(zhuǎn)碼存在兩個問題,一是計算量巨大,視頻數(shù)據(jù)存在著海量化的趨勢;二是實時性難以保證,用戶不能在可容忍的時間內(nèi)得到轉(zhuǎn)碼結(jié)果。
當(dāng)前,對于大規(guī)模的視頻轉(zhuǎn)碼,主流的解決方案有單機服務(wù)器轉(zhuǎn)碼和分布式服務(wù)器轉(zhuǎn)碼。然而,單機服務(wù)器轉(zhuǎn)碼計算能力有限,分布式視頻轉(zhuǎn)碼實現(xiàn)復(fù)雜,都不容易實現(xiàn)。筆者提出利用Hadoop搭建一個分布式轉(zhuǎn)碼系統(tǒng),結(jié)合超算平臺的強計算能力和多核多線程的特點以及MIC架構(gòu)的并行處理優(yōu)勢進行大規(guī)模的轉(zhuǎn)碼任務(wù),有效解決了上述問題。
廣州超級計算中心的業(yè)務(wù)主機為天河二號,是當(dāng)前世界最快的超級計算機。超算平臺主要有3個特點:一是計算能力強,天河二號由16 000個節(jié)點組成,單個節(jié)點有3.431 Tflops運算能力,16 000 個節(jié)點總計可達54.9 Pflops性能;二是多核多線程,每個節(jié)點有2個CPU處理器和3個MIC協(xié)處理器,并支持多線程編程;三是存儲容量大,每個運算節(jié)點有64 Gbyte主存,而每個MIC協(xié)處理器板載8 Gbyte內(nèi)存,因此每個節(jié)點共有88 Gbyte內(nèi)存,總計16 000個節(jié)點一共有1.404 Pbyte內(nèi)存,而外部存儲器容量方面更是高達12.4 Pbyte。
天河二號使用的MIC協(xié)處理器是Intel公司推出的基于集成眾核(Many Integrated Core,MIC)架構(gòu)的至強融核系列的一個產(chǎn)品。該產(chǎn)品雙精度性能達到每秒一萬億次以上,并且支持并行編程模型。對于采用傳統(tǒng)CPU平臺很難實現(xiàn)性能進一步提升的部分應(yīng)用,例如并行視頻轉(zhuǎn)碼,使用MIC協(xié)處理器是一個很好的選擇[1]。
Hadoop是一個實現(xiàn)了MapReduce模式的開源分布式計算框架。通過Hadoop,程序員可以方便快捷地開發(fā)分布式程序,利用計算機群的強處理能力和高存儲空間對海量數(shù)據(jù)進行分布式處理。Hadoop的核心設(shè)計還包括一個分布式文件系統(tǒng)(HDFS)及分布式數(shù)據(jù)庫(HBase)[2]。圖1是Hadoop的組成示意圖。
MapReduce是Google提出的一種軟件編程模型,其作用是幫助用戶開發(fā)處理大規(guī)模數(shù)據(jù)集的應(yīng)用程序。MapReduce的主要思想是將海量數(shù)據(jù)處理問題劃分為Map(映射)階段和Reduce(化簡)階段。當(dāng)發(fā)起一個作業(yè)時,MapReduce模型會把輸入的大數(shù)據(jù)集分割成若干個數(shù)據(jù)塊,在Map階段分發(fā)到多個Map任務(wù)中并行處理,得到處理后的數(shù)據(jù)塊,然后進入Reduce階段,Reduce任務(wù)將所有結(jié)果合并成最終結(jié)果,并存儲在文件系統(tǒng)上[2],如圖2所示。
圖1 Hadoop的組成示意圖
圖2 MapReduce模型作業(yè)流程圖
HDFS是一個分布式文件系統(tǒng)。HDFS集群采用master-slave結(jié)構(gòu),由一個NameNode節(jié)點和多個DataNode節(jié)點組成。NameNode節(jié)點是主服務(wù)器,負責(zé)管理文件命名空間和調(diào)節(jié)客戶端訪問文件系統(tǒng)。DataNode負責(zé)提供實際的存儲服務(wù)。當(dāng)一個文件提交到HDFS中時,HDFS會將該文件分割成一個或者多個塊,并存儲在若干個Data-Node節(jié)點中,每個塊都有多個副本,分別存儲在不同的DataNode上。同時,NameNode節(jié)點記錄塊與DataNode之間的映射關(guān)系。當(dāng)需要對文件進行讀寫時,客戶端從NameNode獲取文件的元數(shù)據(jù)(Metadata),得到所有文件塊的存儲位置,再從相應(yīng)的DataNode直接進行讀寫操作。具體如圖3所示。
HBase建立在HDFS之上,提供高可靠性、高性能、列存儲、可伸縮、實時讀寫的數(shù)據(jù)庫系統(tǒng),適合用來存儲非結(jié)構(gòu)化和半結(jié)構(gòu)化的松散數(shù)據(jù),例如視頻數(shù)據(jù)。它可以橫向擴展,通過不斷增加廉價的商用服務(wù)器,來增加計算和存儲能力。
圖3 HDFS體系架構(gòu)圖
FFmpeg是開源免費跨平臺的視頻和音頻流方案,它的主要功能有視頻采集功能、視頻格式轉(zhuǎn)換、視頻抓圖、給視頻加水印等。FFmpeg包含了3個重要組件,分別是libavcodec,libavformat和 ffmpeg命令行工具。其中,ffmpeg命令行工具是一個可執(zhí)行的文件,輸入需要的參數(shù),就能完成相應(yīng)的媒體處理操作。例如將.mpg轉(zhuǎn)成.avi:
ffmpeg - i video_origine.mpg video_finale.avi
由于超算平臺由眾多的節(jié)點組成,每個節(jié)點均可獨立工作,多個節(jié)點可協(xié)同工作,相當(dāng)于傳統(tǒng)分布式系統(tǒng)中的集群。本解決方案是以節(jié)點為單位搭建基于超算平臺的視頻轉(zhuǎn)碼系統(tǒng)。
本系統(tǒng)主要由任務(wù)控制節(jié)點、視頻分割節(jié)點、Hadoop節(jié)點組構(gòu)成,其中Hadoop節(jié)點組的核心部分是HDFS模塊和MapReduce模塊。任務(wù)控制節(jié)點負責(zé)接收客戶端的任務(wù)請求,配置任務(wù)信息,監(jiān)控任務(wù)進度,控制其他節(jié)點處理任務(wù)和返回任務(wù)結(jié)果。視頻分割節(jié)點負責(zé)將一個視頻分割成若干個視頻塊。Hadoop節(jié)點組的HDFS模塊負責(zé)視頻塊的存儲,MapReduce模塊完成視頻轉(zhuǎn)碼工作和視頻塊合并工作。系統(tǒng)整體架構(gòu)如圖4所示。
圖4 系統(tǒng)整體架構(gòu)圖
各流程詳細說明如下:
1)客戶端發(fā)起一個轉(zhuǎn)碼請求,任務(wù)控制節(jié)點接受用戶上傳的視頻,處理用戶輸入的任務(wù)配置信息,分析視頻數(shù)據(jù)并生成任務(wù)對象,開始轉(zhuǎn)碼作業(yè)。
2)任務(wù)控制節(jié)點將視頻傳輸給視頻分割節(jié)點,并通知該節(jié)點將視頻分割成若干個視頻塊。
3)視頻分割節(jié)點將分割結(jié)果存儲在Hadoop節(jié)點組的HDFS中。
4)視頻分割節(jié)點通知任務(wù)控制節(jié)點分割作業(yè)完成,并返回分割后各個視頻塊的信息,例如大小和存儲位置等。
5)任務(wù)控制節(jié)點根據(jù)任務(wù)對象的信息(任務(wù)要求時間、視頻大小、轉(zhuǎn)碼要求等)構(gòu)建合適的MapReduce作業(yè)框架,
6)MapReduce模塊完成對視頻塊的轉(zhuǎn)碼任務(wù)和合并任務(wù),并把目標視頻存儲在HDFS中。
7)MapReduce模塊返回任務(wù)完成信息和目標視頻的存儲信息。
8)任務(wù)控制節(jié)點返回任務(wù)完成信息到客戶端,并提供目標視頻的存儲位置。
9)用戶從HDFS模塊下載目標視頻,轉(zhuǎn)碼請求完成。
當(dāng)客戶端發(fā)起一個轉(zhuǎn)碼請求時,任務(wù)控制節(jié)點分析上傳的源視頻和用戶配置的任務(wù)需求,對當(dāng)前轉(zhuǎn)碼任務(wù)進行建模,生成一個n維的任務(wù)特征向量T,其中T=[t0,t1,t2,…,tn-1],每一維都描述了轉(zhuǎn)碼任務(wù)的某一屬性,例如任務(wù)狀態(tài)、視頻名稱、視頻時長、視頻大小、視頻源與目的編碼方式、視頻源與目的比特率、任務(wù)限時、目標視頻大小限制、視頻塊與HDFS的映射表等,并將其加入隊列TaskQueue中。
任務(wù)控制節(jié)點每次取出位于TaskQueue隊頭的向量對象T,并根據(jù)T中的信息,生成相應(yīng)的指令信號I,例如進入下一執(zhí)行階段或者重做當(dāng)前階段等,最后將T和I傳輸?shù)较乱还?jié)點,如此循環(huán),直到TaskQueue為空。
在Hadoop系統(tǒng)中,存儲在HDFS的文件是由一個或者多個數(shù)據(jù)塊組成,而且由于MapReduce框架的Map任務(wù)通常是并發(fā)執(zhí)行,所以需要對視頻數(shù)據(jù)進行分割。但是,視頻數(shù)據(jù)是非結(jié)構(gòu)化數(shù)據(jù),視頻中幀與幀存在著關(guān)聯(lián)性,簡單的物理劃分會導(dǎo)致視頻數(shù)據(jù)信息受損。
所以在該節(jié)點中,需要使用專門的媒體處理工具來實現(xiàn)視頻分割的功能,例如FFmpeg,mencoder等。在實現(xiàn)時,可以在視頻分割節(jié)點集成多種視頻分割工具。
視頻分割節(jié)點接受任務(wù)控制節(jié)點傳遞過來的任務(wù)對象T和指令信號I,從T中提取視頻信息并分析,動態(tài)選取最合適的工具,最后生成一個個互相獨立的視頻塊并存儲在HDFS的各個DataNode中等待轉(zhuǎn)碼處理,同時更新任務(wù)對象T,并傳輸回任務(wù)控制節(jié)點,加入隊列TaskQueue中等待下一步處理。
MapReduce模塊接受任務(wù)控制節(jié)點傳遞來的任務(wù)對象T和指令信號I,然后根據(jù)T中信息,獲取視頻塊的存儲位置,即DataNode編號,開始轉(zhuǎn)碼作業(yè)。
作業(yè)分為兩個階段:Map階段和Reduce階段。Map階段負責(zé)視頻塊的轉(zhuǎn)碼,在這個階段,多個Map任務(wù)并行執(zhí)行。每個Map任務(wù)都運行在存儲其要處理的視頻塊的DataNode上,這樣避免了節(jié)點間的文件傳輸。Map任務(wù)結(jié)束后,轉(zhuǎn)碼結(jié)果不上傳到HDFS中,而是保留在本地節(jié)點。所有的Map任務(wù)完成后,開啟Reduce階段,在這個階段,Reduce任務(wù)只有一個,它會訪問所有執(zhí)行Map任務(wù)的節(jié)點,取得各個視頻塊的轉(zhuǎn)碼結(jié)果,然后按順序合并成目標視頻,最后上傳至HDFS中,同時,更新并傳輸對象T到任務(wù)控制節(jié)點。
2.3.1 移植FFmpeg到MIC(Map階段)
視頻轉(zhuǎn)碼工作是發(fā)生在MapReduce框架的Map階段。
由于Hadoop是基于Java,在Map任務(wù)中使用FFmpeg需要Java提供的Runtime類,運行該類中的 exec(String cmdArray[])方法就可以調(diào)用FFmpeg命令行工具這個可執(zhí)行文件。只需將可執(zhí)行文件放置在Hadoop框架可以訪問到的位置。
在本方案中,執(zhí)行轉(zhuǎn)碼任務(wù)的是FFmpeg,F(xiàn)Fmpeg是開源的,這意味著可以修改其源代碼,重新編譯出一個適合運行在MIC卡上的FFmpeg可執(zhí)行文件。MIC并沒有單獨的編程語言,MIC編程是對C/C++/Fortran語言進行擴展,加入編譯指令或指導(dǎo)指令,使用最簡單的方法讓現(xiàn)有的程序在盡量不做改動的情況下,能夠利用MIC的計算資源,其中最基本的關(guān)鍵字是offload。其作用是:在offload作用范圍內(nèi)(即最靠近offload語句下面的第一個代碼段)的程序代碼,是要在MIC卡上運行[3]。一個最簡單的例子如下:
該代碼中的for循環(huán)將在MIC卡上運行。
MIC芯片通常有數(shù)十個精簡的x86核心,提供高度并行的計算能力。所以,在移植FFmpeg時,可以對其進行并行化,進一步加速其轉(zhuǎn)碼速度。本方案使用的手段是OpenMP。OpenMP是一種API,用于編寫可移植的多線程應(yīng)用程序,它能夠為編寫多線程應(yīng)用程序提供一種簡單的方法,而無需程序員進行復(fù)雜的線程創(chuàng)建、同步、負載均衡和銷毀工作。OpenMP采用引語的方式對程序進行并行化,其中最常用的方法是對循環(huán)進行并行化[4]。上面例子使用OpenMP并行化后如下:
通過使用MIC編程與OpenMP,將原來運行在CPU上的FFmpeg程序移植到MIC卡,充分發(fā)揮MIC架構(gòu)的浮點運算能力和高度并行能力,從而加速視頻轉(zhuǎn)碼的效率。
2.3.2 任務(wù)并行化(Reduce階段)
視頻合并工作是發(fā)生在MapReduce框架的Reduce階段。在這個階段,Reduce任務(wù)在所有Map任務(wù)完成后啟動,讀取所有轉(zhuǎn)碼后的視頻塊,并按照其編號的順序,合并視頻。傳統(tǒng)的解決方案一般會以串行的方式完成這個工作,而且由于受運行節(jié)點的主存容量限制,合并過程中產(chǎn)生的中間結(jié)果需要存放在硬盤上,I/O開銷較大。
針對這種情況,本方案利用超算節(jié)點多核多線程的特性,將視頻合并工作以并行的方式進行,同時合并多個視頻塊。而且,利用超算節(jié)點高主存的特性,對主存利用率設(shè)置一個閾值,低于該閾值時,保留中間結(jié)果在主存,當(dāng)主存不足時,才將中間結(jié)果寫入硬盤,最大限度地減少I/O操作的開銷。
在本系統(tǒng)中,使用HDFS模塊的情況分為兩種:一是上傳本地文件到HDFS,例如保存視頻分割后的視頻塊和轉(zhuǎn)碼合并后的目標視頻;二是從HDFS下載文件到本地系統(tǒng),例如Map任務(wù)下載視頻塊和客戶端下載目標視頻。
這兩種情況的實現(xiàn)需要使用Hadoop抽象文件系統(tǒng)的 copyToLocalFile()和 copyFromLocalFile()。copyTo-LocalFile()的功能是從分布式文件系統(tǒng)拷貝文件到本地,copyFromLocalFile()的功能是從本地拷貝數(shù)據(jù)到分布式文件系統(tǒng)。
當(dāng)前視頻數(shù)據(jù)存在著海量化、多平臺化、多編碼標準化的趨勢,傳統(tǒng)的視頻轉(zhuǎn)碼方案已經(jīng)滿足不了日益增長的用戶需求。所以,本文提出一種基于超算平臺和Hadoop的視頻并行轉(zhuǎn)碼方案??偟膩碚f,方案有兩個重點:一是基于Hadoop框架優(yōu)秀的并行任務(wù)處理能力,高擴展性和高容錯性,使用MapReduce思想搭建一個并行轉(zhuǎn)碼系統(tǒng),完成對視頻的分割、轉(zhuǎn)碼和合并。二是結(jié)合超算平臺的優(yōu)勢,采用特殊的技術(shù)實現(xiàn)方法來提高系統(tǒng)并行轉(zhuǎn)碼的能力,例如移植FFmpeg到MIC卡。
當(dāng)然,本方案還有許多需要改進之處。例如,需要進一步研究,提出更多可行的方法來提高轉(zhuǎn)碼系統(tǒng)的性能。FFmpeg能夠處理大多數(shù)視頻格式,但不是所有,需要添加對特定格式的支持。在MIC卡上并行處理視頻數(shù)據(jù)時要考慮視頻數(shù)據(jù)的關(guān)聯(lián)性,HDFS中視頻塊大小設(shè)置對并行度的影響等。
總之,本文希望通過提出一種基于超算平臺的海量視頻轉(zhuǎn)碼解決方案來滿足目前的轉(zhuǎn)碼需求。同時,通過本文在方案中對超算平臺的分析和應(yīng)用,為其他大規(guī)模數(shù)據(jù)處理應(yīng)用提供新的思路、新的選擇。
[1]英特爾至強融核協(xié)處理器開發(fā)人員快速入門指南[EB/OL].[2013-12-22].http://software.intel.com/zh-cn/articles/intel-xeon- phicoprocessor-developers-quick-start-guide#admin.
[2]楊帆,沈奇威.分布式系統(tǒng)Hadoop平臺的視頻轉(zhuǎn)碼[J].計算機系統(tǒng)應(yīng)用,2011,20(11):80-85.
[3] DEAN J,GHEMAWAT S.MapReduce:simplified data processing on large clusters[J].Communications of the ACM-50th anniversary issue,2008,51(1):107-113.
[4]王恩東,張清,沈鉑,等.MIC高性能計算編程指南[M].北京:中國水利水電出版社,2012.