我正在尝试将RStudio连接到具有Kerberos身份验证的Hive。如果我在从命令行调用的R脚本中运行以下代码,它可以工作。
library("DBI")
library("rJava")
library("RJDBC")
cp = c("/u01/cloudera/parcels/CDH/lib/hive/lib/hive-jdbc.jar"
, "/u01/cloudera/parcels/CDH/lib/hadoop/hadoop-common.jar"
, "/u01/cloudera/parcels/CDH/lib/hive/lib/libthrift-0.9.2.jar"
, "/u01/cloudera/parcels/CDH/lib/hive/lib/hive-service.jar"
, "/u01/cloudera/parcels/CDH/lib/hive/lib/httpclient-4.2.5.jar"
, "/u01/cloudera/parcels/CDH/lib/hive/lib/httpcore-4.2.5.jar"
, "/u01/cloudera/parcels/CDH/lib/hive/lib/hive-jdbc-standalone.jar")
.jinit(classpath=cp)
drv <- JDBC("org.apache.hive.jdbc.HiveDriver" , "hive-jdbc.jar" )
conn <- dbConnect(drv , "jdbc:hive2://XXXX:10000/default;principal=hive/XXXX@XXXXX";auth-kerberos)
如果我在RStudio中运行完全相同的脚本,我会收到错误:
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
如果我在RStudio中运行系统('klist'),它会显示我有一张有效的票证。似乎RStudio无法识别票证,但R是。有什么想法吗?
答案 0 :(得分:3)
首先是一些无聊的东西,把事情放到上下文中,然后是解决方案。
.jinit
不支持AFAIK,您必须求助于解决方法<小时/> 必须为Kerberos身份验证设置一个 Java系统属性才能在JDBC中工作,并且默认情况下并不总是设置它。
.jinit
之前)
选项1: 来自Linux shell脚本,然后再启动R ...
export JAVA_TOOL_OPTIONS="-Djavax.security.auth.useSubjectCredsOnly=false"
来自R代码的 选项2: ...
Sys.setenv(JAVA_TOOL_OPTIONS="-Djavax.security.auth.useSubjectCredsOnly=false")
.jinit(...)
有关使用Kerberos的Hive / Impala JDBC的高级Java配置的详细信息,请参阅that post。
设置环境变量时要小心:模拟Java命令行,即-Dsome.key=value -Dsome.other.key=blahblah
;在shell脚本中,使用引号(因为分隔空间);在R代码中,使用单个字符串,没有数组。