2017-05-04 11 views
0

Kerberos認証を持つRiveとHiveを接続しようとしています。私がコマンドラインから呼び出されたRスクリプトで以下を実行すると、それは動作します。Kerberosを使用したRStudio(ただしRを除く)とKerberosとの接続に関する問題

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でまったく同じスクリプトを実行すると、私はエラーを取得する:私はRStudioシステム(「klistを」)を実行した場合

javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)] 

、それは私が有効なチケットを持って示しています。 RStudioはチケットを識別することができませんが、Rはそうです。何か案は?

+0

実行中のOSはどれですか?チケットを生成するためにどのツールを使用しましたか? env変数 'KRB5CCNAME'を試しましたか? –

+0

OSはRed Hat 6.5です。チケットを生成するためにkinitを使用しました。変数KRB5CCNAMEは設定されていません。Sys.getenv()を実行するときに存在します。 –

+0

'.jinit'が扱うことができない、いくつかのJavaシステムプロパティを強制的に変更しようとしました。 'export JAVA_TOOL_OPTIONS =" - Djavax.security.auth.useSubjectCredsOnly = false -Dsun.security.krb5.debug = true "' >>差をつける可能性のある小道具については、cf.私の答えはhttps://stackoverflow.com/questions/42477466/error-when-connect-to-impala-with-jdbc-under-kerberos-authrication/42506620 –

答えて

3

いくつかの退屈なものを最初に、物事を文脈に入れて解決してください。

  • ケルベロス:それはでも、マイクロソフトが独自の実装を持っており、拡張
  • JavaとKerberosのことを考慮せずに、自然(考える暗号ネットワークによって複雑だ:それは、さらに複雑(部分的にしかサポートしますJavaバージョンの微妙な変更など)
  • ハドープとJavaとKerberos:複雑で醜い(本当にあなたの正気を失いたい場合は、GitBook「HadoopとKerberos、狂気の門」を参照してください)とそれはWindows cfでさらに悪いです。 Hadoop "ネイティブライブラリ"の公式ビルドの欠如
  • ハイブとJDBCとケルベロス:WindowsでApache JDBCドライバを使用していない限り、Hadoopの "醜い"部分は必要ありません。(ヒント:Cloudera JDBCドライバを選んでください);悪いニュースは、生のJAAS設定と特定のJavaシステムプロパティーが必要な場合があることです。
  • RとJava/JDBC:JVMに特定のJavaシステムプロパティーを渡す場合を除いて、または実行時に - しかし、その私の知る限りを.jinitサポートしていない、あなたは


回避策に頼らなければならないのKerberos認証は、JDBCで動作するために設定され、それはですしなければならない1つの Javaシステム・プロパティーがあります常にデフォルトでは設定されません。
しかし、JavaプロパティをRから直接設定することはできません。

... Rを開始する前に、Linuxシェルスクリプトから:あなたは

環境変数(いずれかのRを開始する前に、またはRコードからではなく.jinit前)を設定するオプション1を持っています

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

オプション2:あなたのRコードから ...

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


すべての場合、これでは不十分な場合があります。 Hadoopクラスタが独自のKDCを使用するため、特定のKerberos設定を使用する必要があるかもしれません。おそらく、デフォルトのKerberosチケットを使用するのではなく、キータブファイルに保存されているパスワードを使用してサービスアカウントとして認証する必要があります。まあ、くそがが起こる、ので
そしておそらくあなたは

that postを参照してください(とセキュリティライブラリは、私が思う、ハッカーのために物事があまりにも簡単にするのではなく、デフォルトでは非常に秘密主義です...)いくつかのデバッグ情報を必要としますKerberosを使用したハイブ/インパラJDBCの高度なJava構成

環境変数を設定するときは注意してください。Javaコマンドラインをシミュレートします。つまり、-Dsome.key=value -Dsome.other.key=blahblahです。シェルスクリプトでは、引用符を使用します(スペースを分けるためです)。 Rコードでは、配列なしの単一の文字列を使用します。

関連する問題