换下风格^_^

Cloudera Hadoop CDH上安装R及RHadoop(rhdfs/rmr2/rhbase/RHive)

Hadoop admin 3039℃ 0评论

前言:RHadoop是由Revolution Analytics发起的一个开源项目,它可以将统计语言R与Hadoop结合起来。目前该项目包括三个R packages,分别为支持用R来编写MapReduce应用的rmr、用于R语言访问HDFS的rhdfs以及用于R语言访问HBASE的rhbase。

一、系统及所需软件版本

服务器操作系统:CentOS 6.3

R语言版本:R-2.15.3 (先前使用过R-3的最新版,发现新版本存在各种不兼容的问题,因此选择了R-2的最新版)

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

Cloudera Hadoop CDH版本:4.4.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,可使用CRAN安装)版本:rJava_0.9-5

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

RHadoop版本,为官方最新版本,项目地址(https://github.com/RevolutionAnalytics),包含项目具体如下:

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

说明文档:https://github.com/RevolutionAnalytics/RHadoop/wiki

二、依赖安装(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”错误

然后下载源代码,编译

# 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

如果需要绘图,则还需要开启一些功能,使用下面配置:

./configure --prefix=/usr --disable-nls --enable-R-shlib --with-libpng --with-jpeglib --with-libtiff --with-x --with-cairo

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”

然后设置Java、Hadoop、R、Hive等相关环境变量(如果在搭建Cloudera Hadoop集群时已经设置好,做一下检查就OK)

下面是RHadoop及RHive安装成功时/etc/profile中的环境变量配置情况:

#java
export JAVA_HOME=/usr/java/default
export JAVA_BIN=/usr/java/default/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
#hadoop
export HADOOP_HOME=/usr/lib/hadoop
export HADOOP_CONF_DIR=/etc/hadoop/conf
export HADOOP_CMD=/usr/lib/hadoop/bin/hadoop
export HADOOP_STREAMING=/usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.4.0.jar
export HIVE_HOME=/usr/lib/hive
#R
export R_HOME=/usr/lib64/R
export JAVA_LIBRARY_PATH=/usr/lib/hadoop/lib/native
export CLASSPATH=$CLASSPATH:/usr/lib64/R/library/rJava/jri
export LD_LIBRARY_PATH=/usr/lib64/R/library/rJava/jri
export RServe_HOME=/usr/lib64/R/library/RServe
#pkgconfig environment set
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig/

export RHIVE_DATA=/usr/lib64/R/rhive/data
#path
export PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$MAVEN_HOME/bin:$PATH:$R_HOME/bin

三、安装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=/usr/lib/hadoop
export HADOOP_CONF_DIR=/etc/hadoop/conf
export HADOOP_CMD=/usr/lib/hadoop/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=/usr/lib/hadoop/lib/native

如果设置后问题依然没有解决,需要将native下面的libhadoop.so.0 及 libhadoop.so.1.0.0拷贝到 /usr/lib64下面

[root@master native]# pwd
/usr/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个包,他们分别是:
cat ../rmr2/DESCRIPTION

R (>= 2.6.0), Rcpp, RJSONIO (>= 0.8-2), bitops, digest,
functional, stringr, plyr, reshape2

执行安装:

install.packages("Rcpp", dependencies = TRUE)
install.packages("RJSONIO", dependencies = TRUE)
install.packages("bitops", dependencies = TRUE)
install.packages("digest", dependencies = TRUE)
install.packages("functional", dependencies = TRUE)
install.packages("stringr", dependencies = TRUE)
install.packages("plyr", dependencies = TRUE)
install.packages("reshape2", dependencies = TRUE)

如果未安装,或者8个包安装不全,安装程序会提示其所依赖的的包要安装。

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

需要在/etc/profile中设置环境变量HADOOP_STREAMING

export HADOOP_STREAMING=/usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-2.0.0-mr1-cdh4.4.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语言程序:

library("rmr2")
library("rhdfs")
hdfs.init()
small.ints=to.dfs(1:10)
res=mapreduce(input = small.ints, map = function(k, v) cbind(v, v^2))
from.dfs(res)

执行过程:


> library("rmr2")
Loading required package: Rcpp
Loading required package: RJSONIO
Loading required package: bitops
Loading required package: digest
Loading required package: functional
Loading required package: stringr
Loading required package: plyr
Loading required package: reshape2
> library("rhdfs")
Loading required package: rJava

HADOOP_CMD=/usr/lib/hadoop/bin/hadoop

Be sure to run hdfs.init()
> hdfs.init()
> small.ints=to.dfs(1:10)
13/09/30 11:42:43 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
13/09/30 11:42:43 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
> res=mapreduce(input = small.ints, map = function(k, v) cbind(v, v^2))
packageJobJar: [/tmp/RtmpOV0vj6/rmr-local-env253562351cd3, /tmp/RtmpOV0vj6/rmr-global-env25356701098e, /tmp/RtmpOV0vj6/rmr-streaming-map25356d83cf63, /tmp/hadoop-hadoop/hadoop-unjar3945665247206297796/] [] /tmp/streamjob2340060324614773679.jar tmpDir=null
13/09/30 11:42:46 INFO mapreduce.JobSubmissionFiles: Permissions on staging directory hdfs://Master.Hadoop:8020/tmp/hadoop-mapred/mapred/staging/hadoop/.staging are incorrect: rwxrwxrwt. Fixing permissions to correct value rwx------
13/09/30 11:42:46 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
13/09/30 11:42:46 INFO mapred.FileInputFormat: Total input paths to process : 1
13/09/30 11:42:47 INFO streaming.StreamJob: getLocalDirs(): [/data/disk01/mapred/local, /data/disk01/mapred/local]
13/09/30 11:42:47 INFO streaming.StreamJob: Running job: job_201309241632_0048
13/09/30 11:42:47 INFO streaming.StreamJob: To kill this job, run:
13/09/30 11:42:47 INFO streaming.StreamJob: /usr/lib/hadoop/bin/hadoop job -Dmapred.job.tracker=Master.Hadoop:8021 -kill job_201309241632_0048
13/09/30 11:42:47 INFO streaming.StreamJob: Tracking URL: http://Master.Hadoop:50030/jobdetails.jsp?jobid=job_201309241632_0048
13/09/30 11:42:48 INFO streaming.StreamJob: map 0% reduce 0%
13/09/30 11:42:56 INFO streaming.StreamJob: map 50% reduce 0%
13/09/30 11:42:57 INFO streaming.StreamJob: map 100% reduce 0%
13/09/30 11:42:59 INFO streaming.StreamJob: map 100% reduce 100%
13/09/30 11:42:59 INFO streaming.StreamJob: Job complete: job_201309241632_0048
13/09/30 11:42:59 INFO streaming.StreamJob: Output: /tmp/RtmpOV0vj6/file2535591e2739
> from.dfs(res)

执行结果在Output: /tmp/RtmpOV0vj6/file2535591e2739文件中,当读取数据时,出现下面异常:


> from.dfs(res)
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.

/usr/lib/hadoop-hdfs/bin/hdfs: line 24: /usr/lib/hadoop-hdfs/bin/../libexec/hdfs-config.sh: No such file or directory
/usr/lib/hadoop-hdfs/bin/hdfs: line 140: cygpath: command not found
/usr/lib/hadoop-hdfs/bin/hdfs: line 172: exec: : not found
Exception in thread "main" java.io.FileNotFoundException: Path is not a file: /tmp/RtmpOV0vj6/file2535591e2739/_logs
 at org.apache.hadoop.hdfs.server.namenode.INodeFile.valueOf(INodeFile.java:42)
 at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocationsUpdateTimes(FSNamesystem.java:1341)
 at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocationsInt(FSNamesystem.java:1293)
 at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocations(FSNamesystem.java:1269)
 at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocations(FSNamesystem.java:1242)
 at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getBlockLocations(NameNodeRpcServer.java:413)
 at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getBlockLocations(ClientNamenodeProtocolServerSideTranslatorPB.java:172)
 at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:44938)
 at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:453)
 at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1002)
 at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1751)
 at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1747)
 at java.security.AccessController.doPrivileged(Native Method)
 at javax.security.auth.Subject.doAs(Subject.java:396)
 at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
 at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1745)

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
 at org.apache.hadoop.ipc.RemoteException.instantiateException(RemoteException.java:90)
 at org.apache.hadoop.ipc.RemoteException.unwrapRemoteException(RemoteException.java:57)
 at org.apache.hadoop.hdfs.DFSClient.callGetBlockLocations(DFSClient.java:972)
 at org.apache.hadoop.hdfs.DFSClient.getLocatedBlocks(DFSClient.java:960)
 at org.apache.hadoop.hdfs.DFSInputStream.fetchLocatedBlocksAndGetLastBlockLength(DFSInputStream.java:238)
 at org.apache.hadoop.hdfs.DFSInputStream.openInfo(DFSInputStream.java:205)
 at org.apache.hadoop.hdfs.DFSInputStream.<init>(DFSInputStream.java:198)
 at org.apache.hadoop.hdfs.DFSClient.open(DFSClient.java:1117)
 at org.apache.hadoop.hdfs.DistributedFileSystem.open(DistributedFileSystem.java:249)
 at org.apache.hadoop.hdfs.DistributedFileSystem.open(DistributedFileSystem.java:82)
 at org.apache.hadoop.fs.FileSystem.open(FileSystem.java:746)
 at org.apache.hadoop.streaming.AutoInputFormat.getRecordReader(AutoInputFormat.java:56)
 at org.apache.hadoop.streaming.DumpTypedBytes.dumpTypedBytes(DumpTypedBytes.java:102)
 at org.apache.hadoop.streaming.DumpTypedBytes.run(DumpTypedBytes.java:83)
 at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
 at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84)
 at org.apache.hadoop.streaming.HadoopStreaming.main(HadoopStreaming.java:41)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.apache.hadoop.util.RunJar.main(RunJar.java:208)
Caused by: org.apache.hadoop.ipc.RemoteException(java.io.FileNotFoundException): Path is not a file: /tmp/RtmpOV0vj6/file2535591e2739/_logs
 at org.apache.hadoop.hdfs.server.namenode.INodeFile.valueOf(INodeFile.java:42)
 at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocationsUpdateTimes(FSNamesystem.java:1341)
 at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocationsInt(FSNamesystem.java:1293)
 at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocations(FSNamesystem.java:1269)
 at org.apache.hadoop.hdfs.server.namenode.FSNamesystem.getBlockLocations(FSNamesystem.java:1242)
 at org.apache.hadoop.hdfs.server.namenode.NameNodeRpcServer.getBlockLocations(NameNodeRpcServer.java:413)
 at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolServerSideTranslatorPB.getBlockLocations(ClientNamenodeProtocolServerSideTranslatorPB.java:172)
 at org.apache.hadoop.hdfs.protocol.proto.ClientNamenodeProtocolProtos$ClientNamenodeProtocol$2.callBlockingMethod(ClientNamenodeProtocolProtos.java:44938)
 at org.apache.hadoop.ipc.ProtobufRpcEngine$Server$ProtoBufRpcInvoker.call(ProtobufRpcEngine.java:453)
 at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:1002)
 at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1751)
 at org.apache.hadoop.ipc.Server$Handler$1.run(Server.java:1747)
 at java.security.AccessController.doPrivileged(Native Method)
 at javax.security.auth.Subject.doAs(Subject.java:396)
 at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408)
 at org.apache.hadoop.ipc.Server$Handler.run(Server.java:1745)

at org.apache.hadoop.ipc.Client.call(Client.java:1237)
 at org.apache.hadoop.ipc.ProtobufRpcEngine$Invoker.invoke(ProtobufRpcEngine.java:202)
 at $Proxy9.getBlockLocations(Unknown Source)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:164)
 at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:83)
 at $Proxy9.getBlockLocations(Unknown Source)
 at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getBlockLocations(ClientNamenodeProtocolTranslatorPB.java:155)
 at org.apache.hadoop.hdfs.DFSClient.callGetBlockLocations(DFSClient.java:970)
 ... 19 more
$key
NULL

$val
NULL

注:原因是生成数据的文件目录下的_logs目录的问题。删除_logs可以读取数据。(好想下划线开头的文件会被忽略,但是这里不知道为啥不管用了。)

结果如下:

$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

3、安装rhbase包(仅安装在namenode上):

安装rhbase-1.2.0(参见https://github.com/RevolutionAnalytics/RHadoop/wiki/rhbase)。在安装rhbase之前,还需要安装Thrift库,建议安装版本与rhbase构建及测试选用的版本相同,在rhbase的wiki页面可以看到:

rhbase-1.2.0使用的是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.2.0.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

注意:启动的时候有可能报如下异常:./Rserve: error while loading shared libraries: libR.so: cannot open shared object file: No such file or directory。解决办法可以参考这篇文章error while loading shared libraries的解決方法

在master节点上telnet(如果未安装,通过shell命令yum install telnet安装)所有slave节点:

telnet slave1 6311

显示Rsrv013QAP1则表示连接成功。

2、RHive包的安装:

RHive文档:https://github.com/nexr/RHive

下载地址:https://github.com/nexr/RHive/archive/master.zip

Hive及hive-server2:  RHive需要Hive及Hive-server2的支持,安装使用见《Hive相关安装详解

安装RHive,并在master和所有slave节点上创建rhive的data目录,并赋予读写权限(最好将$R_HOME赋予777权限)

[root@master admin]# R CMD INSTALL ./RHive/ (注意,RHIVE应该是RHIVE项目里面的那个文件夹)
[root@master admin]# cd $R_HOME
[root@master R]# mkdir -p rhive/data
[root@master R]# chmod 777 -R rhive/data

由于在github上没有找到tar.gz包,所以使用源码安装方式

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简单应用

载入RHive包,令连接Hive,获取数据:

library(RHive)
rhive.connect(host = 'host_ip')
rhive.query('select * from emp limit 1000')
class(d)
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版本以上才能执行。

免责说明:本人是参考众多网文和自己亲身测试做的总结。在此尤其要感谢这篇文章在Cloudera Hadoop CDH上安装R及RHadoop(rhdfs、rmr2、rhbase、RHive)

转载请注明:极豆技术博客 » Cloudera Hadoop CDH上安装R及RHadoop(rhdfs/rmr2/rhbase/RHive)

喜欢 (1)
捐助本站极豆博客全站无广告。如果您觉得本博客的内容对您小有帮助,可以对我小额赞助,您的赞助将用于维持博客运营。

极豆博客

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(3)个小伙伴在吐槽
  1. 您好: 我终于在网上找到用CDH版本的hadoop连接R的文章了,并且按照您的配置成功连接,能够在R下执行hadoop的简单命令,比如ls,但是在做运算的时候就出现了错误,任务失败或被KILL,您能帮我看看是哪出的问题吗?能不能给我一下联系方式我把错误日志给您发过去看一下,非常感谢!
    李玉铭2014-07-10 15:24 回复
    • QQ:1074056040
      admin2014-08-18 10:23 回复
  2. 请问,我在自己的系统中搜索libR.so,发现存在于R_HOME/lib/R/lib文件夹中,那么我在/etc/ld.so.conf是如何修改,是修改为下面的样子吗? include /etc/ld.so.conf.d/*conf include /usr/local/R-2.15.3/lib/R/lib
    liukai2015-11-05 21:47 回复