在Cloudera Hadoop CDH上安裝R及RHadoop(rhdfs、rmr2、rhbase、RHive)


RHadoop是由Revolution Analytics發起的一個開源項目,它可以將統計語言R與Hadoop結合起來。目前該項目包括三個R packages,分別為支持用R來編寫MapReduce應用的rmr、用於R語言訪問HDFS的rhdfs以及用於R語言訪問HBASE的rhbase。

一、系統及所需軟件版本

服務器操作系統:CentOS 6.4  只下載DVD1即可,DVD2是選擇安裝的軟件包

下載地址:http://mirror.stanford.edu/yum/pub/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-bin-DVD1.iso

R語言版本:R-2.15.3 (本人安裝的時候,發現新版本存在各種不兼容的問題)

下載地址:http://ftp.ctex.org/mirrors/CRAN/src/base/R-2/R-2.15.3.tar.gz

Cloudera Hadoop CDH版本:4.3.0

JDK版本:1.6.0_31

使用Cloudera Manager 免費版的安裝包cloudera-manager-installer.bin,即可完成CDH和JDK的安裝,具體詳見CDH的安裝

下載地址:https://ccp.cloudera.com/display/SUPPORT/Cloudera+Manager+Free+Edition+Download

rJava(是java可以調用R)版本:rJava_0.9-5

下載地址:http://www.rforge.net/src/contrib/rJava_0.9-5.tar.gz 

RHadoop版本,為官方最新版本,具體如下:

下載地址:https://github.com/RevolutionAnalytics/RHadoop/wiki/Downloads

二、依賴安裝(R語言包、rJava包) 

在安裝之前需要在集群各個主機上逐個安裝R語言包、rJava包,然后再進行Rhadoop的安裝。具體安裝步驟如下:

1、安裝R語言包

在編譯R之前,需要通過yum安裝以下幾個程序:

yum install gcc-gfortran

否則報”configure: error: No F77 compiler found”錯誤

# yum install gcc gcc-c++

否則報”configure: error: C++ preprocessor “/lib/cpp” fails sanity check”錯誤

# yum install readline-devel

否則報”--with-readline=yes (default) and headers/libs are not available”錯誤

# yum install libXt-devel

否則報”configure: error: --with-x=yes (default) and X11 headers/libs are not available”錯誤

然后下載源代碼,編譯

# cd /home/admin
# wget http://cran.rstudio.com/src/base/R-2/R-2.15.3.tar.gz

# tar -zxvf R-2.15.3.tar.gz

# cd R-2.15.3

# ./configure --prefix=/usr --disable-nls --enable-R-shlib/** (后面兩個選項--disable-nls --enable-R-shlib是為RHive的安裝座准備,如果不安裝RHive可以省去)*/

# make

# make install

安裝完畢后查看,得到R的安裝路徑為/usr/lib64/R ,即后來要設置的R_HOME所在的目錄。

2、安裝rJava包:

版本:rJava_0.9-5.tar.gz

在聯網的情況下,可以進入R命令,安裝rJava包:

> install.packages("rJava")

如果待安裝機器不能上網,可以將源文件下載到本地,然后通過shell命令R CMD INSTALL ‘package_name’來安裝:

R CMD INSTALL "rJava_0.9-5.tar.gz"

本教程的包,大部分都是都是本地安裝的,只有Rserve等個別包。

然后設置Java、Hadoop、R、Hive等相關環境變量(如果在搭建Cloudera Hadoop集群時已經設置好,做一下檢查就OK)

下面是RHadoop及RHive安裝成功時/etc/profile中的環境變量配置情況

#Java environment
export JAVA_HOME=/usr/java/jdk1.6.0_31
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
#Hadoop environment set
export HADOOP_HOME=/opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hadoop
export HADOOP_CONF_DIR=/etc/hadoop/conf
export HADOOP_CMD=/usr/bin/hadoop
export HADOOP_STREAMING=/opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.3.0.jar
export JAVA_LIBRARY_PATH=/opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hadoop/lib/native

 
         

#Hive Home and RHive_data
export RHIVE_DATA=/usr/lib64/R/rhive/data
export HIVE_HOME=/opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hive

 
         

#set R_HOME
export R_HOME=/usr/lib64/R
export CLASSPATH=.:/usr/lib64/R/library/rJava/jri
export LD_LIBRARY_PATH=/usr/lib64/R/library/rJava/jri
export PATH=$PATH:$R_HOME/bin
export RServe_HOME=/usr/lib64/R/library/RServe
#pkgconfig environment set
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig/

三、安裝RHadoop環境(rhdfs、rmr2、rhbase、RHive)

 1、安裝rhdfs包(僅安裝在namenode上):

R CMD INSTALL "rhdfs_1.0.5.tar.gz"

在/etc/profile中設置環境變量HADOOP_HOME、HADOOP_CON_DIR、HADOOP_CMD

export HADOOP_HOME=/opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hadoop
export HADOOP_CONF_DIR=/etc/hadoop/conf
export HADOOP_CMD=/usr/bin/hadoop

安裝后調用rhdfs,測試安裝:

> library("rhdfs")
Loading required package: rJava

HADOOP_CMD=/usr/bin/hadoop

Be sure to run hdfs.init()

當按要求輸入hdfs.init()后,如果出現:

> hdfs.init()
13
/06/27 09:29:49 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform… using builtin-java classes where applicable

需要在/etc/profile中設置環境變量JAVA_LIBRARY_PATH

export JAVA_LIBRARY_PATH=/opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hadoop/lib/native

如果設置后問題依然沒有解決,需要將native下面的libhadoop.so.0 libhadoop.so.1.0.0拷貝到 /usr/lib64下面

[root@master native]# pwd
/opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hadoop/lib/native
[root@master native]# cp libhadoop.so
libhadoop.so        libhadoop.so.1.0.0  
[root@master native]# cp libhadoop.so /usr/lib64
[root@master native]# cp libhadoop.so.1.0.0 /usr/lib64

就會得到解決。

2、安裝rmr2包(各個主機上都要安裝):

安裝rmr2包之前,需要安裝其依賴的7個包,他們分別是:

[root@master RHadoop-deps]# ls
digest_0.6.3.tar.gz    plyr_1.8.tar.gz     reshape2_1.2.2.tar.gz  stringr_0.6.2.tar.gz
functional_0.4.tar.gz  Rcpp_0.10.3.tar.gz  RJSONIO_1.0-3.tar.gz

執行安裝:

[root@master RHadoop-deps]#  R CMD INSTALL "digest_0.6.3.tar.gz"
[root@master RHadoop-deps]#  R CMD INSTALL "plyr_1.8.tar.gz"
[root@master RHadoop-deps]#  R CMD INSTALL "reshape2_1.2.2.tar.gz"
[root@master RHadoop-deps]#  R CMD INSTALL "stringr_0.6.2.tar.gz"
[root@master RHadoop-deps]#  R CMD INSTALL "functional_0.4.tar.gz"
[root@master RHadoop-deps]#  R CMD INSTALL "Rcpp_0.10.3.tar.gz"
[root@master RHadoop-deps]#  R CMD INSTALL "RJSONIO_1.0-3.tar.gz"
 

如果未安裝,或者7個包安裝不全,安裝程序會提示其所依賴的的包要安裝。

R CMD INSTALL "rmr2_2.2.0.tar.gz"

 需要在/etc/profile中設置環境變量HADOOP_STREAMING

export HADOOP_STREAMING=/opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.3.0.jar

安裝測試:

安裝好rhdfs和rmr2兩個包后,我們就可以使用R嘗試一些Hadoop的操作了。

首先,是基本的hdfs的文件操作。

查看hdfs文件目錄
hadoop的命令:hadoop fs -ls /user
R語言函數:hdfs.ls(”/user/“)

查看hadoop數據文件
hadoop的命令:hadoop fs -cat /user/hdfs/o_same_school/part-m-00000
R語言函數:hdfs.cat(”/user/hdfs/o_same_school/part-m-00000″)

接下來,我們執行一個rmr2算法的任務

普通的R語言程序:

> small.ints = 1:10
> sapply(small.ints, function(x) x^2)

MapReduce的R語言程序:

> library("rhdfs")
Loading required package: rJava

HADOOP_CMD=/usr/bin/hadoop

Be sure to run hdfs.init()
> hdfs.init()
> library("rmr2")
Loading required package: Rcpp
Loading required package: RJSONIO
Loading required package: digest
Loading required package: functional
Loading required package: stringr
Loading required package: plyr
Loading required package: reshape2
> small.ints = to.dfs(1:10)
13/06/17 16:11:47 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
13/06/17 16:11:47 INFO compress.CodecPool: Got brand-new compressor [.deflate]
Warning message:
In to.dfs(1:10) : Converting to.dfs argument to keyval with a NULL key
> mapreduce(input = small.ints, map = function(k, v) cbind(v, v^2))
packageJobJar: [/tmp/RtmprBZ3GE/rmr-local-env6c60369aa6c8, /tmp/RtmprBZ3GE/rmr-global-env6c6044b000b9, /tmp/RtmprBZ3GE/rmr-streaming-map6c6045e81c18, /tmp/hadoop-root/hadoop-unjar8586629798067220662/] [] /tmp/streamjob4620216971843644952.jar tmpDir=null
13/06/17 16:12:07 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
13/06/17 16:12:08 INFO mapred.FileInputFormat: Total input paths to process : 1
13/06/17 16:12:09 INFO streaming.StreamJob: getLocalDirs(): [/tmp/hadoop-root/mapred/local]
13/06/17 16:12:09 INFO streaming.StreamJob: Running job: job_201306162142_0003
13/06/17 16:12:09 INFO streaming.StreamJob: To kill this job, run:
13/06/17 16:12:09 INFO streaming.StreamJob: /opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=master:8021 -kill job_201306162142_0003
13/06/17 16:12:09 INFO streaming.StreamJob: Tracking URL: http://master:50030/jobdetails.jsp?jobid=job_201306162142_0003
13/06/17 16:12:10 INFO streaming.StreamJob:  map 0%  reduce 0%
13/06/17 16:12:17 INFO streaming.StreamJob:  map 50%  reduce 0%
13/06/17 16:12:18 INFO streaming.StreamJob:  map 100%  reduce 0%
13/06/17 16:12:19 INFO streaming.StreamJob:  map 100%  reduce 100%
13/06/17 16:12:19 INFO streaming.StreamJob: Job complete: job_201306162142_0003
13/06/17 16:12:19 INFO streaming.StreamJob: Output: /tmp/RtmprBZ3GE/file6c6079b8d37f
function () 
{
    fname
}
<environment: 0x3b0b508>
> from.dfs("/tmp/RtmprBZ3GE/file6c6079b8d37f")
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

$key
NULL

$val
       v    
 [1,]  1   1
 [2,]  2   4
 [3,]  3   9
 [4,]  4  16
 [5,]  5  25
 [6,]  6  36
 [7,]  7  49
 [8,]  8  64
 [9,]  9  81
[10,] 10 100

> 

因為MapReduce只能訪問HDFS文件系統,先要用to.dfs把數據存儲到HDFS文件系統里。MapReduce的運算結果再用from.dfs函數從HDFS文件系統中取出。

rmr2 WordCount實例:

> input<- '/user/hdfs/sample'
> wordcount = function(input, output = NULL, pattern = " "){

  wc.map = function(., lines) {
            keyval(unlist( strsplit( x = lines,split = pattern)),1)
    }

    wc.reduce =function(word, counts ) {
            keyval(word, sum(counts))
    }         

    mapreduce(input = input ,output = output, input.format = "text",
        map = wc.map, reduce = wc.reduce,combine = T)
}

> wordcount(input)
……………………………………………………………………
> from.dfs("/tmp/RtmprbZ3GE/file7ba96e6aa4a6")

在HDFS中放入了數據文件/user/hdfs/sample。寫WordCount的MapReduce函數,執行wordcount函數,最后用from.dfs從HDFS中取得結果。

3、安裝rhbase包(僅安裝在namenode上):

 安裝rhbase-1.1.1(參見https://github.com/RevolutionAnalytics/RHadoop/wiki/rhbase)。在安裝rhbase之前,還需要安裝Thrift庫,建議安裝版本與rhbase構建及測試選用的版本相同,在rhbase的wiki頁面可以看到:

rhbase-1.1.1使用的是Thrift 0.8.0版本,下載網址為 http://archive.apache.org/dist/thrift/0.8.0/thrift-0.8.0.tar.gz

其詳細的安裝步驟如下:

a、在centos系統下輸入shell命令

sudo yum install automake libtool flex bison pkgconfig gcc-c++ boost-devel libevent-devel lib-devel python-devel ruby-devel

安裝一些Thrift相關的工具或庫。有的時候,還需要安裝openssl-devel(在Ubuntu下為libssl-dev),不然會提示libcrypto.so找不到

yum install openssl-devel

b、解壓安裝Thrift

[root@master admin]# cd thrift-0.8.0
[root@master thrift-0.8.0]# ./configure --with-boost=/usr/include/boost JAVAC=/usr/java/jdk1.6.0_31/bin/javac
[root@master thrift-0.8.0]# make
[root@master thrift-0.8.0]# make install 

在/etc/profile中設置環境變量PKG_CONFIG_PATH:

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig/

驗證設置的正確性,在shell下輸入pkg-config --cflags thrift如結果如下所示:

[root@master thrift-0.8.0]# pkg-config --cflags thrift
-I/usr/local/include/thrift 

則說明配置成功。

c、復制library文件到/usr/lib下面(x64位的下面還要復制到/usr/lib64下面,或者僅僅復制到/usr/lib64下面)

cp /usr/local/lib/libthrift.so.0 /usr/lib  

有時候僅復制這個還是有問題的,還需要復制libthrift-0.8.0.so 

cp /usr/local/lib/libthrift-0.8.0.so /usr/lib 

最好把libthrift相關的都復制進去,如 libthrift.so.0、libthrift.so.0.0.0等。(x64位的下面還要復制到/usr/lib64下面,或者僅僅復制到/usr/lib64下面) 

d、安裝rhbase

R CMD INSTALL "rhbase_1.1.1.tar.gz"

如果安裝的過程中,如果發現libRblas.so、libRlapack.so、libR.so等找不到,需要從$R_HOME/lib將這些library拷貝到/usr/lib64目錄下:

[root@slave1 ~]# cp /usr/lib64/R/lib/libRblas.so /usr/lib64/
[root@slave1 ~]# cp /usr/lib64/R/lib/libRlapack.so /usr/lib64/
[root@slave1 ~]# cp /usr/lib64/R/lib/libR.so /usr/lib64/

最終問題可以解決,完成rhbase的安裝。

4、安裝RHive(各個主機上都要安裝):

RHive是一種通過Hive高性能查詢來擴展R計算能力的包。它可以在R環境中非常容易的調用HQL, 也允許在Hive中使用R的對象和函數。理論上數據處理量可以無限擴展的Hive平台,搭配上數據挖掘的利器R環境, 堪稱是一個完美的大數據分析挖掘的工作環境。

1、Rserve包的安裝:

       RHive依賴於Rserve,因此在安裝R的要按照本文R的安裝方式,即附帶后面兩個選項(--disable-nls --enable-R-shlib)

  enable-R-shlib是將R作為動態鏈接庫進行安裝,這樣像Rserve依賴於R動態庫的包就可以安裝了,但缺點會有20%左右的性能下降。

     Rserve使用的的是在線安裝方式:

install.packages("Rserve")

$R_HOME的目錄下創建Rserv.conf文件,寫入“remote enable''保存並退出。通過scp -r 命令將Master節點上安裝好的Rserve包,以及Rserv.conf文件拷貝到所有slave節點下。當然在節點不多的情況下也可以分別安裝Rserve包、創建Rserv.conf。

scp -r /usr/lib64/R/library/Rserve slave1:/usr/lib64/R/library/
scp -r /usr/lib64/R/Rserv.conf slave3:/usr/lib64/R/

在所有節點啟動Rserve

Rserve --RS-conf /usr/lib64/R/Rserv.conf

在master節點上telnet(如果未安裝,通過shell命令yum install telnet安裝)所有slave節點:

telnet slave1 6311

顯示Rsrv013QAP1則表示連接成功。

2、RHive包的安裝:

安裝RHive_0.0-7.tar.gz,並在master和所有slave節點上創建rhive的data目錄,並賦予讀寫權限(最好將$R_HOME賦予777權限)

[root@master admin]# R CMD INSTALL RHive_0.0-7.tar.gz
[root@master admin]# cd $R_HOME
[root@master R]# mkdir -p rhive/data
[root@master R]# chmod 777 -R rhive/data

master和slave中的/etc/profile中配置環境變量RHIVE_DATA=/usr/lib64/R/rhive/data

export RHIVE_DATA=/usr/lib64/R/rhive/data

通過scp命令將master節點上安裝的RHive包拷貝到所有的slave節點下:

scp -r /usr/lib64/R/library/RHive slave1:/usr/lib64/R/library/

查看hdfs文件下的jar是否有讀寫權限

hadoop fs -ls /rhive/lib

安裝rhive后,hdfs的根目錄並沒有rhive及其子目錄lib,這就需要自己建立,並將/usr/lib64/R/library/RHive/java下的rhive_udf.jar復制到該目錄

hadoop fs -put /usr/lib64/R/library/RHive/java/rhive_udf.jar /rhive/lib

否則在測試rhive.connect()的時候會報沒有/rhive/lib/rhive_udf.jar目錄或文件的錯誤。
最后,在hive客戶端啟(master、各slave均可)動hive遠程服務(rhive是通過thrift連接hiveserver的,需要要啟動后台thrift服務):

nohup hive --service hiveserver  &

3、RHive的使用及測試:

1、RHive API

從HIVE中獲得表信息的函數,比如

  • rhive.list.tables:獲得表名列表,支持pattern參數(正則表達式),類似於HIVE的show table
  • rhive.desc.table:表的描述,HIVE中的desc table
  • rhive.exist.table:

2、測試

> library("RHive")
Loading required package: Rserve
This is RHive 0.0-7. For overview type ?.RHive?.
HIVE_HOME=/opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hive
[1] "there is no slaves file of HADOOP. so you should pass hosts argument when you call rhive.connect()."
call rhive.init() because HIVE_HOME is set.
Warning message:
In file(file, "rt") :
  cannot open file '/etc/hadoop/conf/slaves': No such file or directory
> rhive.connect()
13/06/17 20:32:33 WARN conf.Configuration: fs.default.name is deprecated. Instead, use fs.defaultFS
13/06/17 20:32:33 WARN conf.Configuration: fs.default.name is deprecated. Instead, use fs.defaultFS
> 

表明安裝成功,只是conf下面的slaves沒有配置,在/etc/hadoop/conf中新建slaves文件,並寫入各個slave的名稱即可解決該警告。

RHive的運行環境如下:

> rhive.env()
Hive Home Directory : /opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hive
Hadoop Home Directory : /opt/cloudera/parcels/CDH-4.3.0-1.cdh4.3.0.p0.22/lib/hadoop
Hadoop Conf Directory : /etc/hadoop/conf
No RServe
Connected HiveServer : 127.0.0.1:10000
Connected HDFS : hdfs://master:8020
> 

3、RHive簡單應用

載入RHive包,令連接Hive,獲取數據:

> library(RHive)
> rhive.connect(host = 'host_ip')
> d <- rhive.query('select * from emp limit 1000')
> class(d)
> m <- rhive.block.sample(data_sku, percent = 0.0001, seed = 0)
> rhive.close()

一般在系統中已經配置了host,因此可以直接rhive.connect()進行連接,記得最后要有rhive.close()操作。 通過HIVE查詢語句,將HIVE中的目標數據加載至R環境下,返回的 d 是一個dataframe。

實際上,rhive.query的實際用途有很多,一般HIVE操作都可以使用,比如變更scheme等操作:

> rhive.query('use scheme1')
> rhive.query('show tables')
> rhive.query('drop table emp')

但需要注意的是,數據量較大的情況需要使用rhive.big.query,並設置memlimit參數。

將R中的對象通過構建表的方式存儲到HIVE中需要使用

> rhive.write.table(dat, tablename = 'usertable', sep = ',')

而后使用join等HIVE語句獲得相關建模數據。其實寫到這兒,有需求的看官就應該明白了,這幾項 RHive 的功能就足夠 折騰些有趣的事情了。

  • 注1:其他關於在HIVE中調用R函數,暫時還沒有應用,未來更新。
  • 注2:rhive.block.sample這個函數需要在HIVE 0.8版本以上才能執行。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM