五、 RHive的安装及测试

RHive依赖于Rserve,所有首先需要安装Rserve(在各个namenode上),接下来在所有节点上启动Rserve:

> sudo R
> install.packages("Rserve")
> q() > Rserve --RS-conf /usr/lib64/R/Rserv.conf  #启动Rserve> sudo netstat -nltp | grep Rserve    #查看Rserve服务端口号

通过netstate会发现Rserve启动后默认端口为6311。

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

> telnet bj1-241-centos169 6311   

RHive的安装无法直接通过R的install.packages("RHive")进行,在github上也无法直接从https://github.com/nexr/RHive/downloads下载编译好的tar.gz包,只能从github下载源码后自己编译。编译java源文件的过程需要用到ant,若机器上没有,首先安装ant:

> sudo yum install ant 

更改/etc/profile,设置环境变量HIVE_HOME和ANT_HOME,在测试机上,对应为:

HIVE_HOME=/opt/cloudera/parcels/CDH-5.1.3-1.cdh5.1.3.p0.12/lib/hive/

ANT_HOME=/usr/share/ant

以下步骤需要对RHive源代码进行一些更改,编译并打包成tar.gz文件后再安装RHive,若不关心修改源码的部分,本文最后会给出已编译好的文件以供下载。

进入$INS_TMP目录后,下载github上RHive项目源码,路径为~/$INS_TMP/RHive。由于测试机群上配置了Kerberos,而R语言通过RHive访问Hive的过程并不是直接通过JDBC接口访问,而是将在R语言中通过.j2r文件下的函数调用java程序,在java程序中加载JDBC驱动而访问hive。尽管当前用户拥有有效的Kerberos票据,在这样的机制下java程序却不能直接拥有Kerberos票据对应的权限。解决方案是在类com.nexr.rhive.hive.DatabaseConnection的代码 (java代码位于/RHive/RHive/inst/javasrc/src/目录下),在connect()方法里加上以下语句。

package com.nexr.rhive.hive;
class DatabaseConnection { @SuppressWarnings("deprecation")boolean connect() throws SQLException {//加上的语句,使 RHive调用的java程序能够拥有kerberos权限System.setProperty("javax.security.auth.useSubjectCredsOnly","false"); ...     //函数体其余语句return true;
}                 

Hive可访问jar包的路径下,因为测试集群上的 sentry限制了程序对Hive的add jar操作,所以这条语句在RHive执行不通过,我们需要将其注释后,手动将rhive_udf.jar添加到Hive可以搜索的目录下。然后修改/etc/profile文件文件,增加HADOOP_HOME环境变量:

HADOOP_HOME=/opt/cloudera/parcels/CDH-5.1.3-1.cdh5.1.3.p0.12/lib/hadoop/

回到~/$INS_TMP/RHive目录, 重新对RHive代码进行编译:

> sudo ant build
> sudo R CMD build RHive
> sudo R CMD INSTALL RHive_2.0-0.10.tar.gz

~/$INS_TMP/RHive目录下生成的RHive_2.0-0.10.tar.gz即为RHive安装包。

在正式使用RHive之前,还需要进行一些配置。RHive会将rhive_udf.jar复制到每台机器上对应的目录下,默认目录为/hive,可以通过/RHive/RHive/R/macro.R里的.DEFAULT_FS_HOME进行修改,这里我们修改为/user/rhive,注意修改后要进行重新编译。

在所有机器上都创建/user/rhive目录,并修改其属性,使所有用户对其都有读写权限。

> sudo mkdir -p /rhive/data
> sudo chmod 777 -R /rhive/data

由于刚才我们在RHive的R代码中注释了hiveClient$addJar(.FS_JAR_PATH())一行,现在每台机器上都存在/rhive/data目录,并且RHive在执行过程中会自动将rhive_udf.jar添加到该路径下,此时可更改hive_site.xml的配置,在hive.aux.jars.path加上路径/rhive/data/rhive_udf.jar以使hive能够找到rhive_udf.jar。在cloudera manager下,这步操作可以在hive对应的配置页更改, 地址是http://host:port/cmf/services/38/config的格式。

设置完毕后重启hive。以下用的是169机器上的hiveserver2。

测试代码见test_rHive.r,调用RHive的核心部分如下,

#请确保以下路径配置正确
Sys.setenv(JAVA_LIBRARY_PATH="/opt/cloudera/parcels/CDH-5.1.3-1.cdh5.1.3.p0.12/lib/hadoop/lib/native");
Sys.setenv(HADOOP_HOME="/opt/cloudera/parcels/CDH-5.1.3-1.cdh5.1.3.p0.12/lib/hadoop");
Sys.setenv(HIVE_HOME="/opt/cloudera/parcels/CDH-5.1.3-1.cdh5.1.3.p0.12/lib/hive/");
Sys.setenv(HADOOP_CONF="/etc/hadoop/conf");
Sys.setenv(DEFAULT_FS="/user/rhive");library(RHive)
rhive.init() #rhive.init(verbose = TRUE)
rhive.env()rhive.connect(host = "bj1-241-centos169", port = "10000",hiveServer2=TRUE, properties="hive.principal=hive/bj1-241-centos169@XXX.COM")
rhive.query('select count(*) from test')
rhive.close()
q()

  

  

可能出现的问题:

(1)执行rhive.connect()函数后抛出异常javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)],而用beeline进行连接,输入

!connect jdbc:hive2://192.168.241.169:10000/default;principal=hive/bj1-241-centos169@XXX.COM

连接正常,可能原因是kerberos对RHive调用的java程序没有授权,详细的 异常信息打印如下:

更改DatabaseConnection类下的connecr()函数即可, 即加上语句

System.setProperty("javax.security.auth.useSubjectCredsOnly","false"); 

(2)RHive执行connect()成功,但出现异java.sql.SQLException: Insufficient privileges to execute ADD, 图例如下(原始的RHive代码在出现这个问题时没有打印栈信息, 为了演示方便我手动加上了栈信息的打印):

出现这个问题的可能原因是sentry限制了对hive的add jar操作,将 rhive.R中的connect()函数进行修改,注释hiveClient$addJar后手动添加rhive_udf.jar路径,即可解决。

转载于:https://www.cnblogs.com/cassie-huang/p/5065288.html

RHadoop和CDH整合实例(三)- RHive相关推荐

  1. 【小项目】SSM 整合实例

    SSM 整合实例 文章目录 SSM 整合实例 一.系统架构 二.数据库 三.后端 1.创建包结构 2.pom.xml 3.Car.java 4.CarDao 接口 5.CarMapper.xml 6. ...

  2. Spring、Mybatis、Spring MVC整合实例

    Spring.Mybatis.Spring MVC整合实例笔记 源码地址:https://gitee.com/name168/SSM_Demo 1.Maven web项目创建(IDEA) 2.SSM整 ...

  3. Hadoop之mapreduce 实例三

    Hadoop之mapreduce 实例三 转载于:https://www.cnblogs.com/chaoren399/archive/2013/01/04/2844503.html

  4. SSM 框架 Maven项目整合实例

    2019独角兽企业重金招聘Python工程师标准>>> SSM 框架 Maven项目整合实例1: 转载学习:https://blog.csdn.net/Peng_Hong_fu/ar ...

  5. React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例三、四

    转载地址 React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例三.四 项目初始化 git clone https://github.com/durban89/we ...

  6. java spring hiberate_Spring+SpringMVC+Hibernate整合实例讲解

    使用Maven构建项目,用pom.xml引入相应jar,配置以下文件 创建spring.xml: xmlns="http://www.springframework.org/schema/b ...

  7. C语言库函数大全及应用实例三

    [编程资料]C语言库函数大全及应用实例三 函数名: ecvt 功 能: 把一个浮点数转换为字符串 用 法: char ecvt(double value, int ndigit, int *decpt ...

  8. 实例三十六:精确除法计算(*)

    实例三十六:精确除法计算 问题描述: 使用数组精确计算 M/N(0<M<N<100)的值.如果 M/N 是无限循环小数,则计算输出它的第一个循环节,并输出循环节的起止位置. The ...

  9. 咸鱼ZTMS实例—三轴加速传感器

    咸鱼ZTMS实例-三轴加速传感器 MMA7660FC 加速度传感器基本使用 MMA7660FC MMA7660FC可在六个方向定制垂直水平座向 集成了众多智能的运动功能,如方向.震动和敲击检测集成了众 ...

最新文章

  1. iOS架构设计-URL缓存(上)
  2. Vmware VsPhere下的VM如何安装Hyper-v服务
  3. 【C++】引用与变量
  4. jQuery的选择器
  5. 地壳中元素含量排名记忆口诀_【中考化学】初中化学记忆性知识点03-生活中的化学-生活常识...
  6. 字符串转换到double数组
  7. IIS和tomcat共用80端口
  8. mysql setautocommit_MySql 中的setAutoCommit方法
  9. Scala 基础 —— String(StringOps)、tuple、Range
  10. 淮阴工学院计算机系在哪个校区,2021年淮阴工学院有几个校区,大一新生在哪个校区...
  11. Win32中GDI+应用(一)
  12. 使用hexo搭建github个人博客网站
  13. 88. cdata , dtd
  14. fluent并行 linux_[转载]windows系统下启动linux主机群的fluent并行操作
  15. 首都师范 博弈论 3 4 2反复剔除严格劣策略
  16. Nmap局域网主机存活发现
  17. 一个计算器的C语言实现
  18. node安装后的设置(node_global和node_cache)
  19. 1.已知长方形的长和宽,求长方形的周长和面积。
  20. 离散数学 (II) 习题 3

热门文章

  1. Windows 运行... 可执行的命令
  2. 运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(一)
  3. 几种C#程序读取MAC地址的方法
  4. 参加第三届信息化创新克拉玛依国际学术论坛
  5. 用来做 favicon 的站点
  6. 维修点滴:键盘进杂物
  7. [导入]Gemini翻譯為中文時的注意事項
  8. 哔哩哔哩修改视频速度
  9. 同步/异步阻塞/非阻塞
  10. html图片分四面切割播,CSS3切割轮播图