在Hadoop集群上運行R程序--安裝RHadoop
RHadoop是由Revolution Analytics發起的一個開源項目,它可以將統計語言R與Hadoop結合起來。目前該項目包括三個R packages,分別為支持用R來編寫MapReduce應用的rmr、用于R語言訪問HDFS的rhdfs以及用于R語言訪問HBASE的 rhbase。
下載網址為https://github.com/RevolutionAnalytics/RHadoop/wiki/Downloads。
說明:下面的記錄是在安裝成功后的總結,中間的過程描述及解決方法可能并不精確(用紅色進行了標記),僅供參考。服務器操作系統為centos 5.6。
一、軟件版本
R 2.13.1、Hadoop集群(CDH3)、JDK1.6。
二、安裝節點
其中rhbase和rhdfs在Hadoop集群的namenode上安裝即可,而rmr則需要在集群上的每一個節點上安裝。
三、安裝
由于網絡限制,只能先將源文件下載到本地,然后通過shell命令R CMD INSTALL ‘package_name’來安裝。
a)
首先安裝rhdfs。該包依賴于包
rJava。所以還需要先下載rJava的源代碼并安裝。
R CMD INSTALL ‘rJava_0.9-3.tar.gz’
R CMD INSTALL ‘rhdfs_1.0.1.tar.gz’
在執行安裝rJava時,可能會失敗,提示錯誤信息“checking whether JNI programs can be compiled...
configure: error: Cannot compile a simple JNI program. See
config.log for details.”,這可能是由于jdk的版本問題造成的,建議安裝jdk1.6。
b)
安裝rmr。該包依賴于包RJSONIO、
itertools
、digest,而包itertools
又依賴于iterators。
R CMD INSTALL ‘iterators_1.0.5.tar.gz’
R CMD INSTALL ‘itertools_0.1-1.tar.gz’
R CMD INSTALL ‘RJSONIO_0.96-0.tar.gz’
R CMD INSTALL ‘digest_0.5.1.tar.gz’
R CMD INSTALL ‘rmr_1.1.tar.gz’
c)
安裝rhbase(參見https://github.com/RevolutionAnalytics/RHadoop/wiki/rhbase)。在安裝rhbase之前,還需要安裝Thrift庫,建議安裝Thrift 0.6.1版本,下載網址為http://thrift.apache.org/。詳細的安裝步驟如下:
i.
在centos系統下輸入shell命令sudo yum install automake libtool
flex bison pkgconfig gcc-c++ boost-devel libevent-devel lib-devel
python-devel ruby-devel,安裝一些Thrift相關的工具或庫。由于網絡連接的問題,在嘗試的時候并不能完全安裝,個人覺得也沒有必要完全安裝,只需保證g++ 3.3.5以上版本、boost 1.33.1以上版本即可。
ii.
解壓并安裝Thrift。
tar -zvxf thrift-0.6.1.tar.gz
cd thrift-0.6.1
./configure --with-boost=/usr/include/boost JAVAC=/usr/jdk1.6/bin/javac
make make
install
其中—with-boost及JAVAC的值根據服務器的實際情況進行修改(不確定javac的設置是不是必須的)。
iii.
設置環境變量PKG_CONFIG_PATH。
在/etc/profile中輸入
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig/(并通過命令souce
/etc/profile命令使得環境變量生效)。之后輸入shell命令pkg-config --cflags
thrift驗證pkg-config路徑是否設置正確,返回結果若為-I/usr/local/include/thrift則表示成功。
iv.
復制library文件。
cp
/usr/local/lib/libthrift.so.0 /usr/lib
v.
安裝rhbase。
R CMD INSTALL
'rhbase_1.0.1.tar.gz'
四、驗證并測試
在R命令行中輸入library(rmr)、library(rhdfs)、library(rhbase),載入成功即表示安裝成功
測試用例:利用mapreduce實現和函數sapply相同的功能。
普通R代碼
groups = rbinom(32, n = 50, prob = 0.4) tapply(groups, groups, length)
利用mapreduce實現的R代碼:
groups =
to.dfs(groups)(為保證相同的數據,仍然利用了之前的groups)
from.dfs(mapreduce(input = groups, map = function(k,v)
keyval(v, NULL), reduce = function(k,vv) keyval(k,
length(vv))))
五、更多參考網址:
https://github.com/RevolutionAnalytics/RHadoop/wiki/Tutorial
https://github.com/RevolutionAnalytics/RHadoop/wiki/Writing-composable-mapreduce-jobs
https://github.com/RevolutionAnalytics/RHadoop/wiki/Efficient-rmr-techniques