RHadoop和CDH整合实例(三)- RHive

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

> sudo yum install ant 

       更改/etc/profile,设置环境变量HIVE_HOMEANT_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目录后,下载githubRHive项目源码,路径为~/$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限制了程序对Hiveadd 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

      由于刚才我们在RHiveR代码中注释了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

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471274.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 2144. 打折购买糖果的最小开销(贪心)

文章目录1. 题目2. 解题1. 题目 一家商店正在打折销售糖果。每购买 两个 糖果,商店会 免费 送一个糖果。 免费送的糖果唯一的限制是:它的价格需要小于等于购买的两个糖果价格的 较小值 。 比方说,总共有 4 个糖果,价格分别为 1…

淘宝弹性布局方案lib-flexible实践

2个月前,写过一篇文章《从网易与淘宝的font-size思考前端设计稿与工作流》总结过一些移动web中有关手机适配的一些思路,当时也是因为工作的关系分析了下网易跟淘宝的移动页面,最后才有那篇文章的总结,可惜的是因为项目的关系&…

jQuery学习笔记系列(二)

day02 - jQuery 学习目标: 能够操作 jQuery 属性 能够操作 jQuery 元素 能够操作 jQuery 元素尺寸、位置 1.1. jQuery 属性操作 ​ jQuery 常用属性操作有三种:prop() / attr() / data() ; 1.1.1 元素固有属性值 prop() ​ 所谓元素固有属性就是元素本…

LeetCode 2145. 统计隐藏数组数目(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始且长度为 n 的整数数组 differences ,它表示一个长度为 n 1 的 隐藏 数组 相邻 元素之间的 差值 。 更正式的表述为:我们将隐藏数组记作 hidden ,那么 differences[i] hidden[i 1] -…

简单table分页

html <table id"pagingTable"><thead><tr><td>第一列</td><td>第二列</td><td>第三列</td><td>第四列</td><td>第五列</td></tr></thead><tbody><tr><td…

logisim实验——通过2个半加器实现1-bit全加器,通过4个一位全加器构成4-bit加法器(详解)

一、由异或门和与门所构成的半加器&#xff1a; 二、由两个半加器构成的1-bit全加器&#xff1a; 注意&#xff1a;下图中所使用的四个1-bit全加器&#xff08;也就是正方形区域&#xff09;都是经过了封装的&#xff0c;所以外观与上图中的1-bit全加器有所区别&#…

LeetCode 2146. 价格范围内最高排名的 K 样物品(BFS)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的二维整数数组 grid &#xff0c;它的大小为 m x n &#xff0c;表示一个商店中物品的分布图。数组中的整数含义为&#xff1a; 0 表示无法穿越的一堵墙。1 表示可以自由通过的一个空格子。所有其他正整数表示该格子内的…

一、操作系统——处理机(作业)调度算法:先来先服务算法FCFS、最短作业优先算法SJF(非抢占式)、 最短剩余时间优先算法SRTN(抢占式)、最高响应比优先算法HRRN

各种调度算法的学习思路&#xff1a; 调度算法的评价指标&#xff1a; 一、先来先服务算法&#xff08;FCFS&#xff09;&#xff1a;First Come First Serve 二、最短作业优先算法&#xff08;SJF非抢占式&#xff09;&#xff1a;Shortest Job First 三、最短剩余时间优先算法…

LeetCode 2147. 分隔长廊的方案数

文章目录1. 题目2. 解题1. 题目 在一个图书馆的长廊里&#xff0c;有一些座位和装饰植物排成一列。 给你一个下标从 0 开始&#xff0c;长度为 n 的字符串 corridor &#xff0c;它包含字母 ‘S’ 和 ‘P’ &#xff0c;其中每个 ‘S’ 表示一个座位&#xff0c;每个 ‘P’ 表…

二、操作系统——用信号量机制实现进程互斥、同步、前驱关系(详解)

一、什么是进程同步&#xff1f; 二、什么是进程互斥&#xff1f; 临界资源&#xff1a;一个时间段内只允许一个进程使用的资源 为了实现对临界资源的互斥访问&#xff0c;同时保证系统整体性能&#xff0c;需要遵循以下原则&#xff1a; 空闲让进。临界区空闲时&#xff…

firefox 插件 取消认证签名

Firebug Tab Mix plus :系统退出自动保存tab List。 tab mix options>Session>start/exit>when browse start>select "restore" option. zoom page 100%-downloadDownThemAll&#xff08;2016.5.26 record&#xff09; 未签名插件不能用了&#xff0c;比…

三、操作系统——生产者-消费者问题(两个同步一个互斥)

一、问题描述 信号量机制实现进程互斥的步骤&#xff1a; 设置初值为1的互斥信号量在访问临界区之间进行P操作在访问完临界区之后进行V操作 信号量机制实现进程同步的步骤&#xff1a; 设置初值为0的同步信号量在前操作之后对同步信号量执行V操作在后操作之前对同步信号量执…

LeetCode 2148. 元素计数

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff0c;统计并返回在 nums 中同时具有一个严格较小元素和一个严格较大元素的元素数目。 示例 1&#xff1a; 输入&#xff1a;nums [11,7,2,15] 输出&#xff1a;2 解释&#xff1a;元素 7 &#xff1a;严格较小元…

四、操作系统——读者写者问题(详解)

一、问题描述&#xff1a; 二、需要满足的条件&#xff1a; 写进程与写进程之间必须互斥的写入数据&#xff08;因为如果两个写进程同时对共享数据中的区域A中的数据进行写操作的话&#xff0c;会导致数据错误覆盖的问题&#xff09;写进程与读进程之间必须互斥的访问共享数据…

二级vb笔试题库__全国计算机等级考试,2012年9月全国计算机二级VB笔试标准预测试卷试题六...

二级VisualBasic语言程序设计标准预测试卷六一、选择题(每小题2分。共70分)下列各题A)、B)、 C)、 D)四个选项中&#xff0c;只有一个选项是正确的&#xff0c;请将正确选项涂写在答题卡相应位置 上&#xff0c;答在试卷上不得分。(1)下列叙述中正确的是A)所有形态的二叉树都只…

LeetCode 2149. 按符号重排数组(双指针)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums &#xff0c;数组长度为 偶数 &#xff0c;由数目相等的正整数和负整数组成。 你需要 重排 nums 中的元素&#xff0c;使修改后的数组满足下述条件&#xff1a; 任意 连续 的两个整数 符号相反对于符号…

五、操作系统——内存相关基础知识 和 进程运行的基本原理(详解)

一、概述 二、什么是内存&#xff1f;有何作用&#xff1f; 内存是用于存放数据的硬件。程序在执行之前&#xff0c;需要先放到内存中才能被CPU处理。 平时&#xff0c;我们各种各样的软件都是存储在外存&#xff08;辅存&#xff09;里。电脑的话&#xff0c;一般是存储在硬盘…

LeetCode 2150. 找出数组中的所有孤独数字(哈希)

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums 。如果数字 x 在数组中仅出现 一次 &#xff0c;且没有 相邻 数字&#xff08;即&#xff0c;x 1 和 x - 1&#xff09;出现在数组中&#xff0c;则认为数字 x 是 孤独数字 。 返回 nums 中的 所有 孤独数字。你可以按…

六、操作系统——内存管理的概念(空间的分配与回收、空间的扩充、地址转换、存储保护)

一、概述 二、操作系统作为系统资源的管理者&#xff0c;当然也需要对内存进行管理&#xff0c;要管些什么呢&#xff1f; 1. 内存空间的分配与回收 连续分配&#xff1a;指为用户进程分配的必须是一个连续的内存空间。 1. 单一连续分配 在单一连续分配方式中&#xff0c;内…

计算机软件无形资产机械工具,考前秘籍,无形资产的定义及确认

原标题&#xff1a;考前秘籍&#xff0c;无形资产的定义及确认考查导向&#xff1a;每年考3分左右&#xff1b;比较简单&#xff0c;重要程度一般&#xff1b;建议与“固定资产”一章一起类比学习&#xff0c;效果更佳&#xff0c;效率更高。近三年主要考点&#xff1a;(1)无形…