2017-05-04 149 views
0

我试图将RStudio连接到具有Kerberos身份验证的Hive。如果我在命令行调用的R脚本中运行以下代码,它将起作用。使用Kerberos将RStudio(但不是R)连接到Hive的问题

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/[email protected]";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)] 

如果我运行系统(“klist的”)在RStudio,就说明我有一个有效的车票。看来RStudio不能识别票,但R是。有任何想法吗?

+0

你正在运行哪个操作系统?你用什么工具来生成票?你有没有修改env变量'KRB5CCNAME'? –

+0

操作系统是Red Hat 6.5。使用kinit生成票证。当我运行Sys.getenv() –

+0

时,变量KRB5CCNAME未设置/存在尝试强制某些Java系统属性,'.jinit'无法处理,使用env变量,例如。 'export JAVA_TOOL_OPTIONS =“ - Djavax.security.auth.useSubjectCredsOnly = false -Dsun.security.krb5.debug = true”'>>对于可能有所作为的道具,参见参考资料。我的答案https://stackoverflow.com/questions/42477466/error-when-connect-to-impala-with-jdbc-under-kerberos-authrication/42506620 –

回答

3

一些无聊的东西第一,把事情放到上下文中,然后解决方案。

  • 的Kerberos:它是由自然(觉得密码学网络复杂,即使不考虑微软有自己的实施和扩展
  • 的Java和Kerberos:它更复杂(仅部分支持, Java版本中的微妙变化等)
  • Hadoop和Java和Kerberos:它很复杂和丑陋(如果你真的想失去理智,请阅读GitBook“Hadoop和Kerberos,疯狂之门”),它在Windows比较糟糕。缺少必需的Hadoop“本机库”的官方版本
  • Hive和JDBC以及Kerberos:好消息是您不需要Hadoop“丑陋”部分除非您在Windows上使用Apache JDBC驱动程序(提示:弃用它并选择Cloudera JDBC驱动程序!);坏消息是您可能需要原始JAAS配置和特定的Java系统属性
  • R和Java/JDBC:除了有时您想要将特定的Java系统属性传递给JVM--它们在启动时或者在运行时 - 但.jinit不支持AFAIK,你必须采取一种变通方法


还有就是一个 Java系统属性必须为Kerberos身份验证设置在JDBC的工作,它的并不总是默认设置。
但是,您不能直接从R中设置该Java属性;你必须设置一个 环境变量 (无论是首发R,或与R的代码,但.jinit前前)

选项1:从Linux shell脚本,开始在R之前...

export JAVA_TOOL_OPTIONS="-Djavax.security.auth.useSubjectCredsOnly‌​=false" 

选项2:从你的R代码里面...

Sys.setenv(JAVA_TOOL_OPTIONS="-Djavax.security.auth.useSubjectCredsOnly‌​=false") 
.jinit(...) 


现在,这可能不足以满足所有情况。也许你需要使用特定的Kerberos配置,因为你的Hadoop集群使用它自己的KDC。也许您不想使用默认Kerberos票证,而是使用存储在keytab文件中的密码进行身份验证,作为服务帐户。
也许你需要一些调试信息,因为,狗屎发生 (和安全库在默认情况相当隐秘,不把事情太容易为黑客,我想...)

请参考that post有关Hive/Impala JDBC与Kerberos的高级Java配置的更多信息。

设置环境变量时要小心:模拟Java命令行,即-Dsome.key=value -Dsome.other.key=blahblah;在shell脚本中,使用引号(由于分隔空间);在R代码中,使用单个字符串,而不是数组。