R是GNU的一個開源工具,具有S語言血統(tǒng),擅長統(tǒng)計計算和統(tǒng)計制圖。由Revolution Analytics發(fā)起的一個開源項目RHadoop將R語言與Hadoop結合在一起,很好發(fā)揮了R語言特長。廣大R語言愛好者借助強大工具RHadoop,可以在大數(shù)據(jù)領域大展拳腳,這對R語言程序員來說無疑是個喜訊。作者從一個程序員的角度對R語言和Hadoop做了一次詳細的講解。
以下為原文:
前言
寫過幾篇關于RHadoop的技術性文章,都是從統(tǒng)計的角度,介紹如何讓R語言利用Hadoop處理大數(shù)據(jù)。今天決定反過來,從計算機開發(fā)人員的角度,介紹如何讓Hadoop結合R語言,能做統(tǒng)計分析的事情。
目錄
R語言介紹
Hadoop介紹
為什么要讓Hadoop結合R語言?
如何讓Hadoop結合R語言?
R和Hadoop在實際中的案例
1. R語言介紹
起源
R語言,一種自由軟件編程語言與操作環(huán)境,主要用于統(tǒng)計分析、繪圖、數(shù)據(jù)挖掘。R本來是由來自新西蘭奧克蘭大學的Ross Ihaka和Robert Gentleman開發(fā)(也因此稱為R),現(xiàn)在由“R開發(fā)核心團隊”負責開發(fā)。R是基于S語言的一個GNU計劃項目,所以也可以當作S語言的一種實現(xiàn)。R的語法是來自Scheme。
跨平臺,許可證
R的源代碼可自由下載使用,GNU通用公共許可證,可在多種平臺下運行,包括UNIX,Linux,Windows和MacOS。R主要是以命令行操作為主,同時支持GUI的圖形用戶界面。
R的數(shù)字基因
R內建多種統(tǒng)計學及數(shù)字分析功能。因為S的血緣,R比其他統(tǒng)計學或數(shù)學專用的編程語言有更強的物件導向功能。
R的另一強項是繪圖功能,制圖具有印刷的素質,也可加入數(shù)學符號。
雖然R主要用于統(tǒng)計分析或者開發(fā)統(tǒng)計相關的軟體,但也有人用作矩陣計算。其分析速度可媲美GNU Octave甚至商業(yè)軟件MATLAB。
代碼庫
CRAN為Comprehensive R Archive Network的簡稱。它除了收藏了R的執(zhí)行檔下載版、源代碼和說明文件,也收錄了各種用戶撰寫的軟件包。全球有超過一百個CRAN鏡像站,上萬個第三方的軟件包。
R的行業(yè)應用
統(tǒng)計分析,應用數(shù)學,計量經(jīng)濟,金融分析,財經(jīng)分析,人文科學,數(shù)據(jù)挖掘,人工智能,生物信息學,生物制藥,全球地理科學,數(shù)據(jù)可視化。
商業(yè)競爭對手
SAS:(Statistical Analysis System)是SAS公司推出的一款用于數(shù)據(jù)分析和和決策支持的大型集成式模塊化軟件系統(tǒng)。
SPSS:(Statistical Product and Service Solutions)是IBM公司推出的一系列用于統(tǒng)計學分析運算、數(shù)據(jù)挖掘、預測分析和決策支持任務的軟件產(chǎn)品及相關服務的總稱。
Matlab:(MATrix LABoratory),是MathWorks公司出品的一款商業(yè)數(shù)學軟件。MATLAB是一種用于算法開發(fā)、數(shù)據(jù)可視化、數(shù)據(jù)分析以及數(shù)值計算的高級技術計算語言和交互式環(huán)境。
2. Hadoop介紹
Hadoop對于計算機的人,都是耳熟能說的技術了。
Hadoop是一個分布式系統(tǒng)基礎架構,由Apache基金會開發(fā)。用戶可以在不了解分布式底層細節(jié)的情況下,開發(fā)分布式程序。充分利用集群的威力高速運算和存儲。Hadoop實現(xiàn)了一個分布式文件系統(tǒng)(Hadoop Distributed File System),簡稱HDFS。HDFS有著高容錯性的特點,并且設計用來部署在低廉的(low-cost)硬件上。而且它提供高傳輸率(high throughput)來訪問應用程序的數(shù)據(jù),適合那些有著超大數(shù)據(jù)集(large data set)的應用程序。HDFS放寬了(relax)POSIX的要求(requirements)這樣可以流的形式訪問(streaming access)文件系統(tǒng)中的數(shù)據(jù)。
Hadoop的家族成員:Hive, HBase, Zookeeper, Avro, Pig, Ambari, Sqoop, Mahout, Chukwa
Hive: 是基于Hadoop的一個數(shù)據(jù)倉庫工具,可以將結構化的數(shù)據(jù)文件映射為一張數(shù)據(jù)庫表,通過類SQL語句快速實現(xiàn)簡單的MapReduce統(tǒng)計,不必開發(fā)專門的MapReduce應用,十分適合數(shù)據(jù)倉庫的統(tǒng)計分析。
Pig: 是一個基于Hadoop的大規(guī)模數(shù)據(jù)分析工具,它提供的SQL-LIKE語言叫Pig Latin,該語言的編譯器會把類SQL的數(shù)據(jù)分析請求轉換為一系列經(jīng)過優(yōu)化處理的MapReduce運算。
HBase: 是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統(tǒng),利用HBase技術可在廉價PC Server上搭建起大規(guī)模結構化存儲集群。
Sqoop: 是一個用來將Hadoop和關系型數(shù)據(jù)庫中的數(shù)據(jù)相互轉移的工具,可以將一個關系型數(shù)據(jù)庫(MySQL ,Oracle ,Postgres等)中的數(shù)據(jù)導進到Hadoop的HDFS中,也可以將HDFS的數(shù)據(jù)導進到關系型數(shù)據(jù)庫中。
Zookeeper:是一個為分布式應用所設計的分布的、開源的協(xié)調服務,它主要是用來解決分布式應用中經(jīng)常遇到的一些數(shù)據(jù)管理問題,簡化分布式應用協(xié)調及其管理的難度,提供高性能的分布式服務
Mahout:是基于Hadoop的機器學習和數(shù)據(jù)挖掘的一個分布式框架。Mahout用MapReduce實現(xiàn)了部分數(shù)據(jù)挖掘算法,解決了并行挖掘的問題。
Avro: 是一個數(shù)據(jù)序列化系統(tǒng),設計用于支持數(shù)據(jù)密集型,大批量數(shù)據(jù)交換的應用。Avro是新的數(shù)據(jù)序列化格式與傳輸工具,將逐步取代Hadoop原有的IPC機制
Ambari: 是一種基于Web的工具,支持Hadoop集群的供應、管理和監(jiān)控。
Chukwa: 是一個開源的用于監(jiān)控大型分布式系統(tǒng)的數(shù)據(jù)收集系統(tǒng),它可以將各種各樣類型的數(shù)據(jù)收集成適合 Hadoop 處理的文件保存在 HDFS 中供 Hadoop 進行各種 MapReduce 操作。
自2006年,Hadoop以MapReduce和HDFS獨立發(fā)展開始,到今年2013年不過7年時間,Hadoop的家族已經(jīng)孵化出多個Apache的頂級項目。特別是最近1-2年,發(fā)展速度越來越快,又融入了很多新技術(YARN, Hcatalog, Oozie, Cassandra),都有點讓我們都學不過來了。
3. 為什么要讓Hadoop結合R語言?
前面兩章,R語言介紹和Hadoop介紹,讓我們體會到了,兩種技術在各自領域的強大。很多開發(fā)人員在計算機的角度,都會提出下面2個問題。
問題1: Hadoop的家族如此之強大,為什么還要結合R語言?
問題2: Mahout同樣可以做數(shù)據(jù)挖掘和機器學習,和R語言的區(qū)別是什么?
下面我嘗試著做一個解答:
問題1: Hadoop的家族如此之強大,為什么還要結合R語言?
a. Hadoop家族的強大之處,在于對大數(shù)據(jù)的處理,讓原來的不可能(TB,PB數(shù)據(jù)量計算),成為了可能。
b. R語言的強大之處,在于統(tǒng)計分析,在沒有Hadoop之前,我們對于大數(shù)據(jù)的處理,要取樣本,假設檢驗,做回歸,長久以來R語言都是統(tǒng)計學家專屬的工具。
c. 從a和b兩點,我們可以看出,hadoop重點是全量數(shù)據(jù)分析,而R語言重點是樣本數(shù)據(jù)分析。 兩種技術放在一起,剛好是最長補短!
d. 模擬場景:對1PB的新聞網(wǎng)站訪問日志做分析,預測未來流量變化
d1:用R語言,通過分析少量數(shù)據(jù),對業(yè)務目標建回歸建模,并定義指標
d2:用Hadoop從海量日志數(shù)據(jù)中,提取指標數(shù)據(jù)
d3:用R語言模型,對指標數(shù)據(jù)進行測試和調優(yōu)
d4:用Hadoop分步式算法,重寫R語言的模型,部署上線
這個場景中,R和Hadoop分別都起著非常重要的作用。以計算機開發(fā)人員的思路,所有有事情都用Hadoop去做,沒有數(shù)據(jù)建模和證明,”預測的結果”一定是有問題的。以統(tǒng)計人員的思路,所有的事情都用R去做,以抽樣方式,得到的“預測的結果”也一定是有問題的。
所以讓二者結合,是產(chǎn)界業(yè)的必然的導向,也是產(chǎn)界業(yè)和學術界的交集,同時也為交叉學科的人才提供了無限廣闊的想象空間。
問題2: Mahout同樣可以做數(shù)據(jù)挖掘和機器學習,和R語言的區(qū)別是什么?
a. Mahout是基于Hadoop的數(shù)據(jù)挖掘和機器學習的算法框架,Mahout的重點同樣是解決大數(shù)據(jù)的計算的問題。
b. Mahout目前已支持的算法包括,協(xié)同過濾,推薦算法,聚類算法,分類算法,LDA, 樸素bayes,隨機森林。上面的算法中,大部分都是距離的算法,可以通過矩陣分解后,充分利用MapReduce的并行計算框架,高效地完成計算任務。
c. Mahout的空白點,還有很多的數(shù)據(jù)挖掘算法,很難實現(xiàn)MapReduce并行化。Mahout的現(xiàn)有模型,都是通用模型,直接用到的項目中,計算結果只會比隨機結果好一點點。Mahout二次開發(fā),要求有深厚的JAVA和Hadoop的技術基礎,最好兼有 “線性代數(shù)”,“概率統(tǒng)計”,“算法導論” 等的基礎知識。所以想玩轉Mahout真的不是一件容易的事情。
d. R語言同樣提供了Mahout支持的約大多數(shù)算法(除專有算法),并且還支持大量的Mahout不支持的算法,算法的增長速度比mahout快N倍。并且開發(fā)簡單,參數(shù)配置靈活,對小型數(shù)據(jù)集運算速度非常快。
雖然,Mahout同樣可以做數(shù)據(jù)挖掘和機器學習,但是和R語言的擅長領域并不重合。集百家之長,在適合的領域選擇合適的技術,才能真正地“保質保量”做軟件。
4. 如何讓Hadoop結合R語言?
從上一節(jié)我們看到,Hadoop和R語言是可以互補的,但所介紹的場景都是Hadoop和R語言的分別處理各自的數(shù)據(jù)。
一旦市場有需求,自然會有商家填補這個空白。
1). RHadoop
RHadoop是一款Hadoop和R語言的結合的產(chǎn)品,由RevolutionAnalytics公司開發(fā),并將代碼開源到github社區(qū)上面。RHadoop包含三個R包 (rmr,rhdfs,rhbase),分別是對應Hadoop系統(tǒng)架構中的,MapReduce, HDFS, HBase 三個部分。
2). RHive
RHive是一款通過R語言直接訪問Hive的工具包,是由NexR一個韓國公司研發(fā)的。
3). 重寫Mahout
用R語言重寫Mahout的實現(xiàn)也是一種結合的思路,我也做過相關的嘗試。
4).Hadoop調用R
上面說的都是R如何調用Hadoop,當然我們也可以反相操作,打通JAVA和R的連接通道,讓Hadoop調用R的函數(shù)。但是,這部分還沒有商家做出成形的產(chǎn)品。
5. R和Hadoop在實際中的案例
R和Hadoop的結合,技術門檻還是有點高的。對于一個人來說,不僅要掌握Linux, Java, Hadoop, R的技術,還要具備軟件開發(fā),算法,概率統(tǒng)計,線性代數(shù),數(shù)據(jù)可視化,行業(yè)背景的一些基本素質。
在公司部署這套環(huán)境,同樣需要多個部門,多種人才的的配合。Hadoop運維,Hadoop算法研發(fā),R語言建模,R語言MapReduce化,軟件開發(fā),測試等等。。。
所以,這樣的案例并不太多。
展位未來
對于R和Hadoop的結合,在近幾年,肯定會生成爆發(fā)式的增長的。但由于跨學科會造成技術壁壘,人才會遠遠跟不上市場的需求。
所以,肯定會有更多的大數(shù)據(jù)工具,被發(fā)明!機會就在我們的手中,也許明天你的創(chuàng)新,就是我們追逐的方向!!