使用Kerberos

时间:2017-05-04 09:20:39

标签: r jdbc hive rstudio kerberos

我正在尝试将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是。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

  • Kerberos:它本质上是复杂的(认为加密网络,即使不考虑微软有自己的实现和扩展
  • Java和Kerberos:它更复杂(只有部分支持,Java版本的细微变化等)
  • Hadoop和Java以及Kerberos:它是复杂而丑陋的(阅读GitBook&#34; Hadoop和Kerberos,超越门的疯狂&#34;如果你真的想失去理智)< / em>并且它在Windows cf上更糟糕缺乏正式构建所需的Hadoop&#34;本地库和#34;
  • Hive和JDBC以及Kerberos:好消息是你不需要Hadoop&#34;丑陋&#34;部分除非您在Windows 上使用Apache JDBC驱动程序(提示:抛弃它并选择Cloudera JDBC驱动程序!);坏消息是您可能需要原始JAAS配置和特定Java系统属性
  • R和Java / JDBC:它运行良好,除了有时您想要将特定的Java系统属性传递给JVM - 无论是在发布时还是在运行时 - 但.jinit不支持AFAIK,您必须求助于解决方法

<小时/> 必须为Kerberos身份验证设置一个 Java系统属性才能在JDBC中工作,并且默认情况下并不总是设置它。
但是您无法直接从R设置该Java属性;您必须设置环境变量 (在启动R之前,或从R代码开始,但在.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配置,因为您的Hadoop集群使用自己的KDC。也许您不想使用默认的Kerberos票证,而是使用密钥表文件中存储的密码作为服务帐户进行身份验证。
也许你需要一些调试信息,因为,好吧,狗屎发生(默认情况下安全库是非常隐秘的,不要让黑客太容易了,我想......)

有关使用Kerberos的Hive / Impala JDBC的高级Java配置的详细信息,请参阅that post

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