2017-05-04 4 views
0

Ich versuche, RStudio mit Hive zu verbinden, das über Kerberos-Authentifizierung verfügt. Wenn ich das unten in einem R-Skript ausführe, das von der Befehlszeile angerufen wird, funktioniert es.Problem beim Verbinden von RStudio (aber nicht R) mit Hive mit 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) 

Wenn ich genau das gleiche Skript in RStudio laufen, bekomme ich eine Fehlermeldung:

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

Wenn ich System laufen ('klist') in RStudio, es zeigt, dass ich ein gültiges Ticket haben. Es scheint, dass RStudio das Ticket nicht identifizieren kann, aber R ist. Irgendwelche Ideen?

+0

Auf welchem ​​Betriebssystem laufen Sie? Mit welchem ​​Tool haben Sie das Ticket generiert? Hast du an der env Variable 'KRB5CCNAME' herumgebastelt? –

+0

OS ist Red Hat 6.5. Verwendet kinit, um das Ticket zu generieren. Die Variable KRB5CCNAME ist nicht gesetzt/existiert bei der Ausführung von Sys.getenv() –

+0

Versuchen Sie, einige Java-Systemeigenschaften zu erzwingen, die '.jinit' nicht verarbeiten kann, mit einer env-Variablen, z. 'export JAVA_TOOL_OPTIONS =" - Djavax.security.auth.useSubjectCredsOnly = false -Dsun.security.krb5.debug = true "'>> für die Requisiten, die einen Unterschied machen könnten, vgl. meine Antwort auf https://stackoverflow.com/questions/42477466/error-when-connect-to-impala-with-jdb-under-kerberos-authrication/42506620 –

Antwort

3

Einige langweilige Dinge zuerst, um die Dinge in einen Zusammenhang zu bringen, dann die Lösung.

  • Kerberos: es ist noch komplizierter (nur teilweise Unterstützung,: es von Natur aus (man denke Kryptographie Netzwerk), auch ohne zu bedenken, dass Microsoft hat seine eigene Implementierung und Erweiterungen
  • Java und Kerberos ist kompliziert subtile Änderungen in Java-Versionen, etc.)
  • Hadoop und Java und Kerberos: es ist kompliziert und hässlich (lesen Sie das GitBook "Hadoop und Kerberos, die Verrücktheit hinter dem Tor", wenn Sie wirklich Ihre Vernunft verlieren wollen) und es ist noch schlimmer auf Windows cf. Mangel an einem offiziellen Build für die erforderlichen Hadoop "native libs"
  • Hive und JDBC und Kerberos: die gute Nachricht ist, dass Sie die Hadoop "hässlichen" Teil nicht benötigen, es sei denn Sie den Apache JDBC-Treiber unter Windows verwenden (Hinweis: Graben Sie es und entscheiden Sie sich für den Cloudera JDBC-Treiber!); Die schlechte Nachricht ist, dass Sie möglicherweise eine rohe JAAS-Konfiguration und spezifische Java-Systemeigenschaften und Java/JDBC benötigen: Es funktioniert ziemlich gut, außer dass Sie manchmal bestimmte Java-Systemeigenschaften an die JVM übergeben wollen - entweder zum Zeitpunkt des Starts oder zur Laufzeit - aber .jinit nicht, dass AFAIK nicht unterstützt, müssen Sie zu einer Vermeidung des Problems greifen


es ist ein Java-Systemeigenschaft, die für die Kerberos-Authentifizierung eingestellt werden muss in JDBC zu arbeiten, und es ist nicht immer standardmäßig eingestellt.
Sie können diese Java-Eigenschaft jedoch nicht direkt von R aus festlegen; müssen Sie eine Umgebungsvariable (entweder vor dem Start R oder von R-Code, sondern vor .jinit) gesetzt

Option 1: aus einem Skript Linux-Shell, vor dem Start R ...

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

Option 2: aus dem R-Code ...


Nun, das kann nicht in allen Fällen ausreichen. Möglicherweise müssen Sie eine bestimmte Kerberos-Konfiguration verwenden, da Ihr Hadoop-Cluster ein eigenes KDC verwendet.Möglicherweise möchten Sie nicht das Standard-Kerberos-Ticket verwenden, sondern sich stattdessen als Dienstkonto authentifizieren, indem Sie ein in einer Chiffrierschlüsseldatei gespeichertes Kennwort verwenden.
Und vielleicht müssen Sie einige Debug-Informationen, weil, na ja, Scheiße geschieht (Standard und Sicherheitsbibliotheken sind sehr verschwiegen, die Dinge nicht zu einfach für Hacker zu machen, nehme ich an ...)

verweisen auf that post Weitere Informationen über erweiterte Java-Konfiguration für Hive/Impala JDBC mit Kerberos.

Und seien Sie vorsichtig, wenn Sie die Umgebungsvariable setzen: Simulieren Sie eine Java-Befehlszeile, d. H. ; Verwenden Sie im Shell-Skript Zitate (wegen des Trennungsraums); Verwenden Sie in R-Code eine einzelne Zeichenfolge, kein Array.

Verwandte Themen