周情濤, 何 軍, 胡昭華
(南京信息工程大學 電子與信息工程學院, 南京 210044)
·計算機技術應用·
基于GPU的Spark大數據技術在實驗室的開發應用
周情濤, 何 軍, 胡昭華
(南京信息工程大學 電子與信息工程學院, 南京 210044)

在大數據時代,兼顧大數據處理與高性能計算是目前對計算機系統的迫切需求。針對Spark大數據處理與基于GPU的高性能計算,分析了基于GPU的Spark技術。它主要通過構建CPU和GPU的異構并行,使計算機獲得強大的計算能力,并在實驗室環境下探討了Spark-GPU技術的實現,闡述了算法實現的技術流程。在此基礎上,通過仿真實驗評估了Spark和Spark-GPU技術的性能。實驗表明,Spark-GPU技術可以達到上百倍的加速比,這對圖像處理以及信息檢索等領域的發展都具有重要推動作用。
大數據處理; 異構計算; 圖形處理器
近年來,移動設備、無線傳感器等設備每時每刻都在產生數據,要處理的數據量非常大,而業務需求對數據處理的實時性、有效性又提出了更高要求,傳統的常規技術根本無法應付。大數據技術就是這個高科技時代的產物。大型數據分析經常需要將任務分發給若干臺機器同步執行,所以它往往與分布式計算互相聯系[1]。
目前分布式計算框架主要有Hadoop和Spark,新生的Spark是一個基于內存計算的開源集群計算系統,更適合于迭代的機器學習和數據挖掘算法,據述,Spark在內存中的計算速度可比Hadoop提升100倍[2]。然而當數據規模極其龐大時,數據處理速度會隨之變慢,與此同時分子動力學、數學建模、圖像處理等數據密集型應用對計算效率提出了更高的要求,顯然Spark不能滿足當前的實時性需求。 隨著GPU的發展和CUDA的成熟,GPU并行計算已成為極其熱門的領域。Spark和CUDA擁有天然的并行處理能力,如何在Spark平臺整合CPU和GPU計算資源也很快成為熱門話題。因此很多中外學者都在研究Spark-GPU技術,以充分利用GPU計算資源,提高計算效率[3]。
1.1 Spark技術
Apache Spark是當今熱門的大數據處理框架,它兼容任何Hadoop的文件存儲系統,可以使用Standalone、Hadoop YARN或Apache Mesos進行資源管理與作業調度,支持Scala,Java、Python和R 4種程序設計語言的編程接口。彈性分布數據集(RDD)是Spark的最核心概念,它表示已被分區、不可變的并能夠被并行操作的數據集合,而且要求可序列化[4]。Spark可以將特定的RDD緩存到內存中,這樣下一個操作可以直接讀取內存中的數據,節省了大量磁盤I/O操作[5]。RDD還具有容錯特性,用變換(Lineage)記錄粗顆粒度的特定數據的轉換(Transformation)和動作(Action)行為,當部分數據分區丟失時,通過Lineage獲取足夠的信息來重新運算和恢復丟失的數據分區。這種粗顆粒度的數據模型相比細顆粒度的數據模型帶來了性能的提升[6]。
1.2 CUDA架構
基于CPU與GPU混合并行計算系統已經逐漸成為國內外高性能計算領域的熱點研究方向,CUDA 是NVIDIA發明的基于NVIDIA GPU并行計算的架構,利用GPU的處理能力,可大幅提升計算性能[7-8]。它支持C、C++,以及 Fortran、Java、Python等多種語言開發。圖1為CUDA編程模式下處理數據的流程圖。

圖1 CUDA架構工作流程
CUDA將CPU作為主機(Host),負責邏輯性較強的計算任務,將GPU作為設備(Device),負責高度線程化的并行處理任務。程序是由設備端的內核函數(Kernel)并行步驟和主機端的串行處理步驟組成,內核函數以網格(Grid)形式執行,網格由若干線程塊(Block)組成,線程塊由若干線程(Thread)組成。NVCC編譯器可將程序分成在 GPU 上執行的部分及在CPU 上執行的部分,并對適當的程序進行編譯動作。
1.3 Spark-GPU技術現狀
近年來,隨著Spark技術的迅速普及,很多學者都在努力整合Spark云平臺上的CPU和GPU資源,并取得了許多突出的成果,cuSpark、 SparkCL是兩個代表性的Spark-GPU項目,都實現了將GPU嵌入到Spark,在一定程度上實現了CPU和GPU的混合并行計算[9-10]。
cuSpark是一項CUDA和Spark相結合的技術。它抽象出管線(Pipeline),類似于Spark中的RDD,數據可分片,并可以存儲在主機內存或顯卡內存中。管線同樣有轉換和動作兩種操作,轉換包含Map(func),Map(func)等函數,動作包含Reduce(func),ReduceByKey(func),Materialize(dest)等函數。轉換屬于延長操作(lazy manner),在調用動作之前,只記錄操作行為,不做任何計算。遇到動作操作時,則先計算轉換部分,再計算動作部分。cuSpark項目主要驗證了兩種實驗,一種數據量較小,可以完全放在顯存中;一種數據量較大,顯存相對較小,但可以被主存容納,實驗表明前者比后者執行速度快百倍以上。
與cuSpark不同,SparkCL則是將JavaCL與Spark結合[11]。JavaCL就是Java版本的OpenCL庫。它使用了OpenCL,而沒有使用CUDA,意味著可以在非NVIDIA顯卡上運行代碼。Aparapi由AMD Java實驗室開發,2011年開放源代碼,利用它可以編譯Java代碼到OpenCL,在GPU上運行。在這個項目中,如果試圖設置內核運行在GPU,而GPU無法使用,則會切換運行在CPU上??梢酝ㄟ^運行示例程序,測試加速的效果,結果表明,用GPU獲得了10~100倍左右的加速比。
以上現狀分析表明,現階段的Spark-GPU技術主要是將現有的GPU加速技術引入到Spark平臺,本文則是將PyCUDA技術融進Spark,通過導入PyCUDA必要函數庫的方式,在Spark平臺調用GPU資源,因此二者融合配置較為有效、簡便。
Spark-GPU技術可借助于GPU的并行能力提高運算性能,而這需要構建有效的CPU和GPU異構并行系統,保證分布式并行算法在系統上的穩定運行。下面詳細分析Spark融合GPU的技術,并力圖使系統達到最高計算效率,在此基礎上著重探討Kmeans聚類算法在Spark-GPU技術上的實現。
2.1 Spark云平臺上混合GPU和CPU的技術流程
Spark由主節點(Master)和從節點或稱工作機(Workers)組成。Spark程序稱為驅動程序,驅動程序定義了對每個RDD的轉換和動作。 將待處理數據上傳到分布式存儲系統HDFS,把應用程序提交到集群,通過CPU調控,將數據分片并發送到從節點。從節點收到對RDD的操作后,根據數據分片信息進行本地化數據操作。Spark提交應用程序的過程如圖2所示。

圖2 Spark提交應用程序過程
Spark應用可分成任務調度和任務執行兩部分,其中SparkContext為程序運行的總入口,由應用程序啟動,可通過資源調度模塊與執行器(Executor)通信。DAGScheduler作業調度模塊可以把作業劃分成若干階段(stage),然后把階段轉化為相應的任務集(TaskSets),并交給TaskScheduler任務調度模塊,任務調度模塊主要負責具體啟動任務以及監控和匯報任務運行情況。將任務(task)提交給執行器運行完之后,可以將結果返回給主程序或寫入外部系統。
這里的每臺工作機分別實現了CPU和GPU的異構并行計算[12],CPU控制程序的串行邏輯部分,GPU控制并行計算部分,計算過程中可能需要顯存與內存頻繁的數據交換,將計算結果先保存到顯存,再由顯存送回內存,再開始接下來的串行操作,或者等待下一次內核函數的調用[13]。GPU融入Spark技術流程圖如圖3所示。

圖3 GPU融入Spark技術流程
具體執行某項任務時,可以將一個階段分成Map和Reduce兩個操作步驟,每啟動一次MapReduce,則為一次迭代,直到完成迭代的步數或者滿足設定的閾值則終止迭代操作,以下為一個MapReduce階段的詳細描述:
(1) Map操作。根據計算資源可利用情況向工作機分配任務,工作機接收到程序指令和任務分配信息,由CPU控制內存讀取分配到的待處理數據,并開始執行程序串行部分。當程序執行到內核函數,CPU將操作指令傳送給GPU,數據從內存轉移到顯存,并對每個數據分配給相應的線程,并獲取線程索引,同時可計算數據索引,以線程為單位,對數據進行函數操作。一般情況下,根據不同的作業情況會執行特定的函數任務,將計算后結果保存到顯存,然后轉移到內存,等待CPU的調用。
(2) Reduce操作。將GPU設備上計算的結果以特定的形式轉化為RDD或者物化為文件,作為Reduce操作的輸入,工作機按照一定的規則對數據進行運算,大多數情況下,數據都是以(key,value)的形式存在,因此主要是按key值對value進行操作,返回的結果聯和其他特定類型的數據可作為Map操作的輸入。有時候也根據Reduce結果的返回情況判斷收斂與否。
實際上,雖然每個節點實現了CPU和GPU的異構并行,但由于集群異構化較復雜,在最大化集群計算能力的過程中也會遇到諸多問題:① 開發程序并應用到集群規模具有一定困難,尤其是應用到集群的CPU和GPU異構并行系統。② 通常情況下,CPU和芯片集數據傳輸速率在10~20 Gb/s之間,而GPU顯存和內存間的數據交換速率在1~10 Gb/s之間,GPU提供了更快計算能力的同時,內存和顯存間的數據傳輸速度也帶來了性能瓶頸。③ 如何根據集群資源動態分配任務的問題,由于集群中的機器配置不一定均衡,主要包括CPU核數、有無顯卡、顯卡型號以及內顯存大小等差異,故仍需要設計出一種策略,使得在任務分配時達到負載均衡。
2.2 Kmeans在Spark-GPU技術上的實現
Kmeans算法是比較典型的無監督聚類算法,廣泛應用在數據挖掘、信息檢索、市場營銷等方面。其主要目標是最小化所有向量到其類簇中心的距離平方和。在Spark-GPU上實現的Kmeans算法是由CPU和GPU協同工作,工作流程如圖4所示。

圖4 Spark-GPU的Kmeans實現
Spark從HDFS文件系統讀取待聚類的數據源,數據以塊(block)的形式分布在集群機器硬盤,被程序解析成指定的向量格式后,根據集群資源情況將數據自動分片并分發給從節點,然后在CPU上初始化聚類中心,當程序執行到內核函數,將數據交給GPU,GPU計算出每個數據對象的類索引信息,將運算結果返回給CPU,再由CPU更新聚類中心,并判斷收斂條件以決定程序是否終止,最終可以得出聚類中心的詳細情況。具體地,可以將其分為Map和Reduce兩個操作步驟。
(1) Map操作。輸入為解析成數組形式的待聚類數據以及初始(或者上一次迭代)的類簇中心,形如(array),每一數組代表一個樣本,調用內核函數時將所有數據由CPU內存傳遞給GPU顯存,在GPU上計算樣本到類簇中心的距離,內核函數輸入為數據和類簇中心,將數據歸屬到擁有最小距離的簇類別,輸出為(clusterID,array),使其轉換為形如(clusterID,(array,1))的RDD,并返回CPU。
(2) Reduce操作。輸入為形如(clusterID,(array,1))的數據列表,將數據中含有相同簇的(array,1)部分累加,得到一個形如(clusterID,(arraysum,arraynum))的RDD,通過元素arraysum與arraynum的求商計算可以得到新的類簇中心,輸出形式為(clusterID,clustercenter)。
一個MapReduce階段結束后,就可得到樣本以及它的類簇歸屬信息的描述文件,以及類簇中心的描述文件,其中clusterID為類簇編號,clustercenter代表類簇中心。每啟動一次MapReduce任務就執行一次迭代操作,一直迭代到目標函數收斂或者一個特定的步數。
在實驗室的局域網中挑選閑置的3臺計算機,均配置有支持CUDA的顯卡,并且裝有Ubuntu14.04 64位的操作系統。如果有更多的機器滿足要求,可以有選擇地擴展Hadoop和Spark集群。3臺機器配置情況如表1所示。

表1 實驗器材配置
由于環境配置較繁瑣,故詳細配置流程在筆者博客上描述*.http://blog.csdn.net/zhouqingtaostudy/article/details/50916836。下面僅介紹其主要步驟。
選擇在Spark云平臺上使用PyCUDA技術開發GPU,這項基于Python開發語言的技術不但可以使用CUDA并行計算接口,而且由于許多庫函數的加入,使得編程比基于C的CUDA更加方便[14]。而使用PyCUDA也需要配置好CUDA開發環境。因此,首先需要驗證集群中的PC機有相應的支持CUDA的GPU、Linux系統版本以及gcc編譯器,另外,系統中的內核頭文件和開發包也需要與系統內核版本保持一致。本實驗選擇最新的CUDA-7.5進行配置。當CUDA安裝成功,才可以安裝PyCUDA開發環境,選擇pycuda-2015.1.3版本。PyCUDA依賴于 Boost C++ 庫,numpy庫以及其他必要的庫,條件滿足后修改配置文件并編譯安裝。配置好GPU開發環境就可以使用GPU資源執行并行計算。
安裝Spark有幾種不同的方式,可以在計算機上將Spark作為一個獨立的框架安裝,或者從供應商處獲取一個Spark虛擬機鏡像直接使用,或者使用在云端環境安裝并配置好的Spark。本文選擇最新發布的Spark 1.6.0,把Spark作為一個獨立的框架安裝并啟動[15]。為了讓Spark能夠在本機正常工作,需要安裝Java開發工具包。為了能使用HDFS分布式文件系統,需要安裝Hadoop軟件。根據Hadoop版本,在Spark網站上下載特定版本的Spark安裝包,根據實際資源修改配置文件。待全部安裝成功,可通過自帶程序示例驗證安裝[16]。
4.1 實驗流程
實驗中以Spark云平臺上的Kmeans算法實現作為對比,評估Spark-GPU技術的性能,Spark和PyCUDA都可以使用Python語言開發,因此選擇Python編寫應用程序[17]。為了增加實驗結果的可信度,準備了3組數據集,數據集的大小依次為41.9、209.7、419.4 Mb,分別在Spark和Spark-GPU上實現Kmeans聚類。首先在master節點啟動Hadoop和Spark集群,然后將3個數據集上傳到HDFS分布式文件系統,并修改程序中相關數據的路徑,使其對應HDFS上的特定文件夾,將應用程序以及相應的聚類參數分別提交到集群中,如果環境配置和應用程序都正確,那么集群將開始計算。
4.2 結果分析
集群計算結束后,收集聚類的時間信息,為了使獲得的時間數據更準確、更可視化,獲取程序開始和結束時刻的時間戳,其差值作為實驗運行時間,并修改程序使聚類中心和聚類時間顯示在終端窗口,為增加實驗結果的可信度,分別對3組數據集多次實驗求平均值,時間統計結果如表2所示。
結果表明,Spark-GPU執行Kmeans的速度遠快于Spark,究其原因:Spark云平臺中的計算任務完全依靠CPU,而Spark-GPU項目中,集群中每個節點都實現了CPU與GPU的異構并行。CPU負責更新聚類中心,判斷收斂條件,以及一些邏輯性任務,而距離計算等具有高度并行化的任務,則交給適合并行計算的GPU來完成。GPU含有成百上千的核心,雖然計算能力有限,但是在并行計算能力方面,比CPU更加強大,而Kmeans的距離計算部分任務比較簡單,而且可分片執行,具有并行化處理的天然基礎,若用CPU處理顯然會耗費相當長的時間,但是若用GPU來協助計算,則會大幅提升運算速度。綜上因素使得Spark-GPU獲得了極高的效率。
本文提出了GPU嵌入Spark云平臺的構想,并構建了含有GPU開發環境的Spark云平臺計算框架,在搭建Spark云平臺的基礎上,努力通過CPU和GPU的異步運算,最大化提升集群計算性能,通過無監督的Kmeans聚類實驗,驗證了本文構建的基于GPU開發環境的Spark計算框架,有效的提高了聚類的效率,這對圖像檢索、數據挖掘等領域有著極其深刻的意義,本框架對其他數據密集型或者計算密集型的任務,也明顯會有加速的效果,還有待進一步的實現與驗證。
在未來的工作中,仍需要了解并行計算的運行機制,將更多適合并行計算的新算法加以改進,使得在本文的框架中加以實現和優化,從而更加高效率的完成計算任務。
[1] 王 珊, 王會舉, 覃雄派, 等. 架構大數據: 挑戰, 現狀與展望[J]. 計算機學報, 2011, 34(10): 1741-1752.
[2] 唐振坤. 基于 Spark 的機器學習平臺設計與實現[D]. 廈門:廈門大學, 2014.
[3] Yang X, Wallom D, Waddington S,etal. Cloud computing in e-Science: research challenges and opportunities[J]. The Journal of Supercomputing, 2014, 70(1): 408-464.
[4] Zaharia M, Chowdhury M, Das T,etal. Resilient distributed datasets: A fault-tolerant abstraction for in-memory cluster computing[C]//Proceedings of the 9th USENIX conference on Networked Systems Design and Implementation. USENIX Association, 2012: 2-2.
[5] Ma Z, Hong K, Gu L. VOLUME: Enable large-scale in-memory computation on commodity clusters[C]//Cloud Computing Technology and Science (CloudCom), 2013 IEEE 5th International Conference on. IEEE, 2013, 1: 56-63.
[6] Dean J, Ghemawat S. MapReduce: simplified data processing on large clusters[J]. Communications of the ACM, 2008, 51(1): 107-113.
[7] Spiechowicz J, Kostur M, Machura L. GPU accelerated Monte Carlo simulation of Brownian motors dynamics with CUDA[J]. Computer Physics Communications, 2014, 191(1):140-149.
[8] Zhang H, Garcia J. GPU Acceleration of a cloud resolving model using CUDA[J]. Procedia Computer Science, 2012, 9(11):1030-1038.
[9] 曾青華, 袁家斌. 基于MapReduce和GPU雙重并行計算的云計算模型[J]. 計算機與數字工程, 2013, 41(3):333-336.
[10] Boubela R N, Kalcher K, Huf W,etal. Big data approaches for the analysis of large-scale fMRI data using apache spark and GPU processing: A demonstration on resting-state fMRI data from the human connectome project[J]. Frontiers in neuroscience, 2014, 9: 492-492.
[11] Segal O, Colangelo P, Nasiri N,etal. SparkCL: A unified programming framework for accelerators on heterogeneous clusters[J]. arXiv preprint arXiv:1505.01120, 2015.
[12] Stuart J A, Owens J D. Multi-GPU MapReduce on GPU clusters[C]//Parallel & Distributed Processing Symposium (IPDPS), 2011 IEEE International. IEEE, 2011: 1068-1079.
[13] Zhang J, You S, Gruenwald L. Large-scale spatial data processing on GPUs and GPU-accelerated clusters[J]. SIGSPATIAL Special, 2015, 6(3): 27-34.
[14] Kl?ckner A, Pinto N, Lee Y,etal. PyCUDA: GPU run-time code generation for high-performance computing[J]. Parallel Computing, 2009, 38(3):157-174.
[15] 付 偉, 嚴 博, 吳曉平. 云計算實驗平臺建設關鍵技術研究[J]. 實驗室研究與探索, 2013, 32(11):78-81.
[16] 薛志云, 何 軍, 張丹陽, 等. Hadoop 和 Spark 在實驗室中部署與性能評估[J]. 實驗室研究與探索, 2015, 34(11):77-81.
[17] 李佳佳, 胡新明, 吳百鋒. 基于異構 GPU 集群的并行分布式編程解決方案[J]. 計算機應用與軟件, 2014, 31(9):28-31.
Department and Application of the GPU-based Spark Big Data Technology in Laboratory
ZHOUQing-tao,HEJun,HUZhao-hua
(School of Electronic and Information Engineering,Nanjing University of Information Science and Technology, Nanjing 210044, China)
In the era of big data, both big data processing and high performance computing are of the urgent needs of a computer system. Specific to Spark big data processing and high performance computing based on GPU, this paper analyzes the Spark technology based on GPU proposed by industry. It is mainly by constructing heterogeneous parallel of CPU and GPU, making computer to obtain a powerful computing capability. Then we discuss the implementation of the Spark-GPU technology in laboratory environment, and expound the technical process of algorithm realization in detail. On this basis, we assess the performance of the Spark and Spark - GPU technology through simulation experiment. Results show Spark-GPU technology can achieve hundredfold speedup, hence, it can play an important role in promoting the development of image processing and information retrieval and other areas.
big data processing; heterogeneous computing; graphics processing unit
2016-03-28
國家自然科學基金(NSFC61203273),江蘇省自然科學基金(BK20141004)
周情濤(1990-),男,山東臨沂人,碩士生,研究方向為大數據機器學習。
E-mail: 14751701086@163.com
何 軍(1978-),男,河南鄭州人,博士,副教授,研究方向為大數據機器學習,計算機視覺等。
E-mail: jhe@nuist.edu.cn
TP 302.1
A
1006-7167(2017)01-0112-05