2017-05-04 148 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代碼中,使用單個字符串,而不是數組。