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的安裝無法直接通過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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于PHP语言的汉语转拼音的类
- 下一篇: 物联网工程-监控箱、配电箱内接线、出线及