使用Kerberos将RStudio(但不是R)连接到Hive的问题
问题描述:
我试图将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是。有任何想法吗?
答
还有就是一个 Java系统属性必须为Kerberos身份验证设置在JDBC的工作,它的并不总是默认设置。
但是,您不能直接从R中设置该Java属性;你必须设置一个 环境变量 (无论是首发R,或与R的代码,但
现在,这可能不足以满足所有情况。也许你需要使用特定的Kerberos配置,因为你的Hadoop集群使用它自己的KDC。也许您不想使用默认Kerberos票证,而是使用存储在keytab文件中的密码进行身份验证,作为服务帐户。
也许你需要一些调试信息,因为,狗屎发生 (和安全库在默认情况相当隐秘,不把事情太容易为黑客,我想...)
一些无聊的东西第一,把事情放到上下文中,然后解决方案。
- 的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代码中,使用单个字符串,而不是数组。
你正在运行哪个操作系统?你用什么工具来生成票?你有没有修改env变量'KRB5CCNAME'? –
操作系统是Red Hat 6.5。使用kinit生成票证。当我运行Sys.getenv() –
时,变量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 –