2017-02-27 2 views
1

Ich erstellen eine Klasse SecureImpalaDataSource, die DriverManagerDataSource erweitert, und UserGroupInformation.doAs() verwenden, um eine Verbindung zu Impala mit Keytab-Datei zu erhalten. Aber ich habe den Fehler wie folgt:Fehler beim Verbinden mit Impala JDBC unter Kerberos Authrication

java.sql.SQLException: [Simba] ImpalaJDBCDriver Fehler initialisiert oder erstellt Transport zur Authentifizierung: [Simba] ImpalaJDBCDriver leider nicht möglich, Server zu verbinden: null.

Aber ich bin erfolgreich, wenn ich die Verbindung mit Kerberos-Ticket-Cache in einer Testdemo bekomme. Kann mir jemand helfen?

Antwort

1

Das Ergebnis ist, dass die HOST und der FQDN in meiner URL sind inkonsistent.

1

Vergessen Sie die Hadoop UGI: ein JDBC-Treiber muss nur die rohe JAAS-Konfiguration ein Kerberos-Ticket erstellen on-the-fly (mit useKeyTab angehoben und abgesenkt useTicketCache).

Systemeigenschaften

  • java.security.krb5.conf => (optional) Nicht-defaut Kerberos conf
  • java.security.auth.login.config => JAAS-Konfigurationsdatei
  • javax.security.auth.useSubjectCredsOnly => muss auf "false" gezwungen werden (die Standard hat sich in einigen Java-Releases geändert, duh)

Beispiel JAAS conf-Datei, Impala/Hive Cloudera-Treiber
Hier mit einem Windows-Pfad in Java-Notation.

Client { 
    com.sun.security.auth.module.Krb5LoginModule 
    required 
    useTicketCache=false 
    doNotPrompt=true 
    useKeyTab=true 
    keyTab="file:C:/blah/blah/dummy.keytab" 
    principal="[email protected]" 
    debug=false; 
}; 

Beispiel JAAS conf-Datei, Apache Hive Treiber
gerade Abschnitt Name
PS Client-com.sun.security.jgss.krb5.initiate ändern: Sie mehrere Abschnitte in der gleichen conf Datei stopfen kann; Das bedeutet, dass Sie ein "globales" conf definieren und es mit mehreren Tools & Treiber & libs verwenden können, mit konsistenten Einstellungen.

Debuggen

  • sun.security.krb5.debug => auf "true"
  • java.security.debug => auf "gssloginconfig, configfile, ConfigParser, Logincontext"
+0

vielen Dank. \t obwohl Ihre Antwort mir nicht helfen würde, mein Problem zu lösen. – SimbaHuang

1

Ein Weg zur Authentifizierung Ihrer jdbc-Verbindung ist die Verwendung von ugi.doAs. Hier ist der Beispielcode:

// 1. login use keytab 
System.setProperty("java.security.krb5.realm", "XXX.COM"); 
System.setProperty("java.security.krb5.kdc", "kdcXXX"); 
Configuration conf = new Configuration(); 
conf.set("hadoop.security.authentication", "Kerberos"); 
UserGroupInformation.setConfiguration(conf); 
UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("test", "test.keytab"); 

// 2. create impala jdbc connection 
Class.forName(JDBCDriverName); 
conn = (Connection) ugi.doAs(new PrivilegedExceptionAction<Object>() { 
    public Object run() { 
    Connection tcon = null; 
    try { 
     tcon = DriverManager.getConnection(connectionUrl); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return tcon; 
    } 
}); 

// 3. execute query using conn 
...... 
Verwandte Themen