李加慶,劉 燕
(中國電子科技集團(tuán)公司第二十八研究所,空中交通管理系統(tǒng)與技術(shù)國家重點(diǎn)實(shí)驗(yàn)室,南京,210007)
淺析R語言并行計(jì)算在大數(shù)據(jù)分析中的應(yīng)用
李加慶,劉 燕
(中國電子科技集團(tuán)公司第二十八研究所,空中交通管理系統(tǒng)與技術(shù)國家重點(diǎn)實(shí)驗(yàn)室,南京,210007)
介紹了當(dāng)今最流行的統(tǒng)計(jì)編程語言R語言,描述了R語言向量化計(jì)算思想以及其并行計(jì)算的軟件包的使用過程,探討了R語言在大數(shù)據(jù)分析中的應(yīng)用。
R語言;并行計(jì)算;大數(shù)據(jù);Hadoop
R是一種用于統(tǒng)計(jì)分析計(jì)算及圖形化展示的開源軟件,同時(shí)也是一種編程語言,它廣泛應(yīng)用于商業(yè)、工業(yè)、政府部門、醫(yī)藥和科研等眾多涉及數(shù)據(jù)分析的領(lǐng)域,隨著近幾年數(shù)據(jù)挖掘、大數(shù)據(jù)等概念不斷發(fā)展,R作為數(shù)據(jù)分析的利器也越來越多地被人關(guān)注。
R使用方式類似于MATLAB和Python,通常運(yùn)行于交互模式。在這種模式下,R執(zhí)行單條命令并顯示運(yùn)行結(jié)果。啟動(dòng)R顯示的是歡迎語和R提示符,就是最下方的>符號(hào),顯示內(nèi)容如下:
R version 3.1.0 (2014-04-10) -- "Spring Dance"
Copyright (C) 2014 The R Foundation for Statistical Computing
Platform: i386-w64-mingw32/i386 (32-bit)
...
Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.
>
這時(shí)顯示的窗口叫做R控制臺(tái),在R提示符后面輸入命令按回車即可執(zhí)行,如果有返回結(jié)果,將顯示在命令行下方。
向量化計(jì)算是一種特殊的并行計(jì)算的方式,相比于一般程序在同一時(shí)間只執(zhí)行一個(gè)操作的方式,它可以在同一時(shí)間執(zhí)行多次操作,通常是對(duì)不同的數(shù)據(jù)執(zhí)行同樣的一個(gè)或一批指令,或者說把指令應(yīng)用于一個(gè)數(shù)組/向量。
向量化計(jì)算廣泛應(yīng)用于R和Matlab這樣的現(xiàn)代科學(xué)計(jì)算軟件,Python的numpy軟件包中也是以向量化計(jì)算為基礎(chǔ)。在R語言的基本運(yùn)算中,向量類型是R語言的核心,R語言代碼或者R交互式會(huì)話中中幾乎很少不涉及向量。R語言的向量化運(yùn)算幾乎可以和底層語言的速度一較高下,并且向量化是天然的并行化方式,如果條件允許,R的向量化編程可以很方便的轉(zhuǎn)化為并行框架。
如果要對(duì)向量x中的每一個(gè)元素使用函數(shù)f()。在R中直接對(duì)x調(diào)用f()就能完成。這不僅簡化代碼,還能將代碼運(yùn)行效率顯著提高到數(shù)百倍甚至更多。應(yīng)用在向量上的函數(shù)實(shí)際上應(yīng)用在其每一個(gè)元素上。下面的例子中,最左邊的符號(hào)>是R提示符,符號(hào)<-是R中的賦值符號(hào),c表示“連接”(英文concatenate的簡寫),c(3,1,5)表示把3、1、5三個(gè)一元向量連接起來成為一個(gè)向量。因?yàn)樵赗中任何數(shù)字都是一元向量。
> u <- c(3,1,5)
> v <- c(2,3,7)
> u > v
[1] TRUE FALSE FALSE
最后一行顯示的是u>v命令的結(jié)果,可以看出在這里>函數(shù)分別運(yùn)用在u[1]和v[1],得到結(jié)構(gòu)TRUE,然后是u[2]和v[2],得到結(jié)果FALSE,以此類推。這里要說明的是,不同于C和Python等語言,R中向量索引從1開始。
利用向量化計(jì)算的思想,可以將一些復(fù)雜計(jì)算簡單化。R中比較常用的函數(shù)lapply(X,FUN,…)返回一個(gè)與X同樣長度的列表,其中每一個(gè)元素都是對(duì)X每一個(gè)元素調(diào)用FUN的結(jié)果。lapply函數(shù)運(yùn)用了向量化計(jì)算的思想,。lapply是隱式循環(huán)函數(shù),雖然其本身其實(shí)并不是向量化函數(shù),但該函數(shù)對(duì)R語言的并行計(jì)算起著很大的作用,或者說R的并行計(jì)算很多是lapply函數(shù)的多種并行化運(yùn)用。
R語言的很多強(qiáng)大功能都是由很多優(yōu)秀的軟件包實(shí)現(xiàn)的,關(guān)于并行計(jì)算有許多軟件包。從版本2.14.0開始,R就內(nèi)置了parallel包,強(qiáng)化了R的并行計(jì)算能力。parallel包整合了早期比較成熟的snow包(snow是Simple Network ofWorkstations的簡稱),以及后期針對(duì)Linux系統(tǒng)和Mac OS X系統(tǒng)上應(yīng)用的multicore包。parallel包可以很容易的在計(jì)算集群上實(shí)施并行計(jì)算,在多個(gè)CPU核心的單機(jī)上,也能發(fā)揮并行計(jì)算的功能。
parallel包的思路和lapply函數(shù)很相似,都是將輸入數(shù)據(jù)分割、計(jì)算、整合結(jié)果。只不過并行計(jì)算是用到了不同的cpu來運(yùn)算。這樣的計(jì)算模型可以使用如下方式來表述:
a、啟動(dòng)M個(gè)“工人”進(jìn)程(worker),并對(duì)每個(gè)工人進(jìn)程初始化;
b、向每個(gè)工人進(jìn)程分發(fā)任務(wù)所需數(shù)據(jù);
c、將任務(wù)粗略的分為M個(gè)大小相等的任務(wù)塊(chunks),并將這些任務(wù)塊發(fā)送到工人進(jìn)程(包含需要的R代碼);
d、等待所有的工人進(jìn)程完成計(jì)算任務(wù),獲取所有計(jì)算結(jié)果;
e、對(duì)于其他任務(wù)重復(fù)b-d;
f、關(guān)閉所有工人進(jìn)程。
在parallel包里,對(duì)應(yīng)上述計(jì)算模型由核心函數(shù)mclapply和parLapply實(shí)現(xiàn),這兩個(gè)函數(shù)都是對(duì)lapply函數(shù)的并行化應(yīng)用。下面舉例說明并行化函數(shù)的優(yōu)勢(shì)。
例子1,直接使用lapply函數(shù)對(duì)500萬個(gè)元素的向量進(jìn)行處理,由于數(shù)據(jù)集比較大,所以消耗時(shí)間比較長。
> fun <- function(x) (x)^2 + 1
> system.time(result <- lapply(1:5000000, fun))
user system elapsed 28.13 0.05 28.17
例子2,繼續(xù)使用上面的函數(shù)fun,我們來使用parallel包提供處理速度,以parLapply函數(shù)在Windows計(jì)算機(jī)上運(yùn)行為例,Linux系統(tǒng)中可以用mclapply函數(shù)得到類似結(jié)果。
> library(parallel)
> cl <- makeCluster(getOption("cl.cores",2)) #打開雙核
> system.time(result <- parLapply(cl,1:5000000, fun)) user system elapsed 4.16 0.18 22.71 > stopCluster(cl)
在這里,makeCluster打開CPU核心的數(shù)量由系統(tǒng)核心數(shù)目決定,一般由detectCores函數(shù)確定系統(tǒng)核心數(shù)目,對(duì)于Window系統(tǒng)下的Intel處理器,一般使用detectCores(logical = F)來獲得實(shí)際的物理核心數(shù)量。在并行處理數(shù)據(jù)時(shí),上面的例子其實(shí)將具有500萬個(gè)元素的數(shù)據(jù)集復(fù)制了2份,所以占用內(nèi)存會(huì)比較大。
21世紀(jì)人類進(jìn)入信息社會(huì),傳感器和社會(huì)網(wǎng)絡(luò)產(chǎn)生海量數(shù)據(jù),數(shù)據(jù)累積的量變引發(fā)質(zhì)變,越來越多的企業(yè)、行業(yè)和國家以數(shù)據(jù)為資源進(jìn)行知識(shí)和智力開發(fā),挖掘了數(shù)據(jù)內(nèi)在的階值,逐步形成了大數(shù)據(jù)的概念。由于R語言并行計(jì)算存在令人詬病的“吃內(nèi)存”弱點(diǎn),所以很多觀點(diǎn)認(rèn)為R語言處理不了大數(shù)據(jù)。這里先不論大數(shù)據(jù)究竟是GB級(jí)還是TB或PB級(jí)的,甚至說處理不了的數(shù)據(jù)集才叫大,R語言在處理TB級(jí)以上的數(shù)據(jù)集的確不是強(qiáng)項(xiàng),可以說效率很低。
R語言的優(yōu)勢(shì)在于其眾多優(yōu)秀的數(shù)據(jù)挖掘軟件包,以及諸多非常強(qiáng)大的繪圖軟件包,如ggplot2之類,深得各行業(yè)數(shù)據(jù)分析人士的青睞。近些年數(shù)據(jù)挖掘和大數(shù)據(jù)等概念的流行,R作為數(shù)據(jù)分析工具正逐漸被重視。借助于越來越多并行計(jì)算及大數(shù)據(jù)處理相關(guān)的R程序包,R可以結(jié)合并行計(jì)算框架Hadoop來做大數(shù)據(jù)處理。R語言的模型算法優(yōu)勢(shì)加上Hadoop處理大數(shù)據(jù)的優(yōu)勢(shì),這種結(jié)合正慢慢地成為數(shù)據(jù)挖掘技術(shù)的主流。下圖簡單地解釋了R+Hadoop做數(shù)據(jù)分析時(shí)大數(shù)據(jù)流轉(zhuǎn)的過程。
R語言是主要用于統(tǒng)計(jì)分析、繪圖的語言和操作環(huán)境。R是屬于GNU系統(tǒng)的一個(gè)自由、免費(fèi)、開源的軟件,它是一個(gè)用于統(tǒng)計(jì)計(jì)算和統(tǒng)計(jì)制圖的優(yōu)秀工具。R語言以軟件包的形式,實(shí)現(xiàn)各種統(tǒng)計(jì)、建模、分析功能。R語言也存在兩個(gè)缺點(diǎn):一是數(shù)據(jù)會(huì)被一次性讀入內(nèi)存進(jìn)行處理,在函數(shù)調(diào)用會(huì)多次拷貝,消耗內(nèi)存;二是單線程,除了個(gè)別的并行計(jì)算包,R的大多數(shù)包不會(huì)利用多個(gè)處理器提高計(jì)算速度。但是瑕不掩瑜,R語言正在各個(gè)行業(yè)數(shù)據(jù)分析領(lǐng)域發(fā)揮著它強(qiáng)大的分析能力。
[1] Norman Matloff. R語言編程藝術(shù)[M]. 機(jī)械工業(yè)出版社. 2013.
[2] Q.Ethan McCallum and Stephen Weston. Parallel R[M]. O’Reilly. 2012.
[3] R-core. Package ‘parallel’[M]. 2013.
[4] 張維明,唐九陽.大數(shù)據(jù)思維[J].指揮信息系統(tǒng)與技術(shù),2015.6(2):1-4
李加慶(1985.01-),男,工程師,主要從事雷達(dá)情報(bào)處理和飛行安全告警研究
劉燕(1980.11-),女,高級(jí)工程師,主要從事雷達(dá)情報(bào)處理和情報(bào)模擬仿真研究
The Application of Language R Parallel Computing in Big Data Analysis
Li Jiaqing,Liu Yan
(The 28th Research Institute of China Electronic Technology Group Corporation,State Key Laboratory of Air Traffic Management System and Technology,NanJing,210007)
This paper introduces the most popular statistical programming language R,describes the use of language R vector computing and its parallel computing software package,and discusses the application of language R in big data analysis.
Language R;parallel computing;big data;Hadoop