Wenn Ihr Cluster mit Kerberos geschützt ist und Sie eine Verbindung zu einem Hive Repository von einem Computer aus herstellen möchten, der nicht Teil dieses Clusters ist, müssen Sie einige Hürden überwinden.
Hive und Impala können eine hilfreiche Technologie für den Aufbau Ihrer Datenverarbeitungspipelines sein, insbesondere in Organisationen, die noch viel mit SQL arbeiten. Oft verwenden diese Organisationen Kerberos, um zu verhindern, dass unberechtigter Zugriff auf ihre Daten erfolgt. Es gibt verschiedene Möglichkeiten, mit Hive oder Impala zu interagieren. Im Webbrowser können Sie Hue verwenden, während Sie auf der Kommandozeile eines Ihrer Knoten im Cluster Hive CLI, Beeline oder Impala Shell verwenden können. Diese Möglichkeiten der Interaktion mit Hive und Impala wurden von Systemadministratoren so eingerichtet, dass sie mit Kerberos funktionieren, so dass Sie sich darüber keine Sorgen machen müssen. manchmal möchten Sie jedoch von einem Computer, der nicht Teil des Clusters ist, eine Verbindung zu den Daten-Repositories herstellen, zum Beispiel über JDBC. Da unsere Datenquellen jedoch über Kerberos gesichert sind, können wir nicht "einfach" eine JDBC-Verbindung herstellen und müssen Kerberos auch auf unserem Laptop konfigurieren. Das ist nicht besonders schwierig und auf Ihrem Mac ist Kerberos bereits installiert. Dennoch haben wir festgestellt, dass es auch nicht trivial war, alles richtig zu machen. Daher haben wir diesen kurzen Blog-Beitrag verfasst, in dem wir Ihnen zeigen, wie Sie eine JDBC-Verbindung zu Hive und Impala herstellen, die in einem durch Kerberos gesicherten Hadoop-Cluster laufen, und zwar von einem Computer aus, der nicht Teil des eigentlichen Clusters ist. Beachten Sie, dass wir in diesem Blog einen Mac verwenden, aber das meiste sollte auch für Computer mit anderen Betriebssystemen gelten.
Kerberos
Wir beginnen mit einem kurzen Überblick über Kerberos. Eine ausführlichere Einführung in Kerberos und seine Verwendung mitHadoop finden Sie dort, um mehr Hintergrundmaterial zu erhalten.
Kerberos ist eine Möglichkeit, Identitäten über ein unzuverlässiges Netzwerk auf sichere Art und Weise gegenseitig aufzubauen. Mit
Kerberos arbeitet mit der Erstellung von Tickets. Das System verwendet diese Tickets, um weitere Tickets zu erstellen und zu versenden. Im Falle des Zugriffs auf Impala oder Hive funktioniert dies wie folgt.
- Zuerst beantragen wir ein Ticket, das zeigt, dass wir wirklich die sind, die wir vorgeben zu sein.
- Mit diesem Ticket können Sie dann weitere Tickets beantragen, die uns Zugang zu Dienstleistungen verschaffen.
- Jeder Benutzer hat eine eindeutige Kennung (in der Kerberos-Sprache Principal genannt), die Sie unter verwenden können, um ein Ticket zu beantragen.
Beachten Sie, dass Tickets nur innerhalb einer bestimmten Anwendungsdomäne gültig sind, die im Kerberos-System /realm/ genannt wird.
Das erste Ticket erhalten.
Wir gehen davon aus, dass sich unser Mac-Laptop in einem LAN befindet, das Zugriff auf den Cluster hat und (natürlich) nicht Teil
des Clusters selbst ist. Wie wir bereits erwähnt haben, müssen wir als erstes das Ticket besorgen, mit dem
uns identifiziert. Dazu verwenden wir den Befehl kinit, der wissen muss, wie und wo Kerberos
eingerichtet ist. Diese Informationen sind normalerweise in /etc/krb5.conf auf einem Knoten in Ihrem Cluster verfügbar. Diese
Konfigurationsdatei enthält Informationen über die /realm/s und die in Ihrem
System verwendeten Standardwerte. Unter Kerberos-Grundlagen und Installation eines KDC
finden Sie ein Beispiel für eine solche
Konfiguration.
Wir beginnen also damit, eine Kopie der /etc/krb5.conf von einem Knoten in Ihrem Cluster zu erhalten:
$ scp mydatanode:/etc/krb5.conf .
Mit dieser Konfigurationsdatei können wir ein Ticket im Bereich MYREALM anfordern.
$ KRB5_CONFIG=./krb5.conf kinit Benutzer@MYREALM
Nach Eingabe des (korrekten) Passworts erhalten Sie ein Ticket für den Bereich MYREALM. Dieses
Ticket ist die Grundlage für den Zugriff auf die Remote-Dienste Hive und Impala.
Die Gläser besorgen
Um über JDBC auf Hive und Impala zugreifen zu können, müssen wir auch die erforderlichen Jars in unserem Klassenpfad haben. Wir
gehen hier davon aus, dass auf unserem Laptop keine lokale Hadoop-Installation vorhanden ist. Daher müssen wir die
erforderlichen Jars von Knoten beziehen, die Teil des Hadoop-Clusters sind, auf den wir zugreifen wollen. Es gibt einige
Informationen darüber, was die Liste der benötigten Jars ist, wie zum Beispiel unter
Apache wiki HiveServer2 Clients, aber diese Listen
sind leider unvollständig. Nach einigem Ausprobieren haben wir jedoch festgestellt, dass die folgende Liste die minimale Menge
von Jars ist, die benötigt wird, um eine JDBC-Verbindung sowohl zu Hive als auch zu Impala herzustellen. Die meisten der Jars
finden Sie auf Ihrem Hadoop-Cluster im Verzeichnis hive/lib Ihres Paketstamms, während einige
aus dem Verzeichnis hadoop/client-0.20 kopiert werden müssen. Der folgende Shell-Code kann verwendet werden, um
jars in ein lokales lib Verzeichnis zu kopieren. Beachten Sie, dass Sie user, mydatanode ersetzen müssen,
CDHVERSION und PARCELROOT zu Ihren eigenen Werten.
mkdir lib PARCELROOT=/opt/cloudera CDHVERSION=CDH-5.1.0-1.cdh5.1.0.p0.53 Bienenstöcke=( hive-jdbc*.jar Hive-Dienst*.jar libfb303-0.9.0.jar libthrift-0.9.0*.jar log4j-1.2.16.jar Gemeingut-Sammlungen-*.jar guava-11.0.2.jar hive-exec*.jar) für i in $hivejars; tun scp user@mydatanode:/$PARCELROOT/parcels/$CDHVERSION/lib/hive/lib/$i lib/ fertig hadoopjars=( Hadoop-Kern*.jar hadoop-gemeinsam*.jar hadoop-auth*.jar httpclient*.jar # benötigt seit CDH-5 httpcore*.jar # benötigt seit CDH-5 slf4j-api*.jar slf4j-log4j12*Krug commons-konfiguration*.jar commons-logging*.jar) für i in $hadoopjars; tun scp user@mydatanode:/$PARCELROOT/parcels/$CDHVERSION/lib/hadoop/client-0.20/$i lib/ fertig
Danach können Sie Ihren Klassenpfad so einrichten, dass die Jars im Verzeichnis lib enthalten sind, z. B.
wie folgt:
für i in lib/*.jar; tun CLASSPATH=$CLASSPATH:$i; fertig
oder
für i in lib/*.jar; tun Klassenpfad=($cLasspfad $i); fertig
wenn Sie zsh verwenden.
Starten Sie die JVM
Jetzt sind wir bereit, eine JVM zu starten. Wir werden dafür Scala verwenden, aber Sie können auch
andere jvm-basierte
Sprachen natürlich. Um der JVM mitzuteilen, welche Kerberos-Parameter verwendet werden sollen,
müssen wir diese auf der Kommandozeile mit dem -D Argument sowohl von scala als auch von java angeben.
scala -Djava.security.krb5.realm=MYREALM
-Djava.security.krb5.kdc=kdc-host.mydomain.org
-Djava.security.krb5.conf=pwd/krb5.conf
Beachten Sie, dass wir pwd verwenden, um den absoluten Pfad zur Datei krb5.conf zu erhalten.
Sobald wir uns in der Scala REPL befinden, können wir eine Verbindung herstellen, für die wir eine JDBC-URL benötigen. Diese url
enthält den Hostnamen (oder die IP-Adresse) eines Knotens in unserem Cluster und eine Portnummer: Verwenden Sie Port 10000
für den Hive2-Server und Port 21050 für den Impala-Server. Wir können einen optionalen Namen der
Datenbank angeben, mit der wir uns verbinden wollen: in unserem Beispiel verbinden wir uns mit der "Standard"-Datenbank. Und da wir
mit Kerberos arbeiten müssen, muss die URL Informationen über den Hostnamen des Servers enthalten, auf dem
HiveServer2 läuft und der als principal in Ihrem krb5.conf aufgeführt ist.
importieren java.sql.{Verbindung, DriverManager, ErgebnisSet => RS, Anweisung} java.lang.Klasse.forName("org.apache.hive.jdbc.HiveDriver") val Bienenstock = "hiveserver.meinedomain.org" val Knoten = "somenode" val hive_port = 10000 val impala_port = 21050 val db = "Standard" val url = s "jdbc:hive2://$Knoten:$hive_port/$db;principal=hive/$Bienenstock@MYREALM" val con = DriverManager.getConnection(url)
Im obigen Code verwenden wir das s"" Konstrukt, um eine String-Interpolation in Scala zu erhalten. Und wenn alles
gut gelaufen ist, wird die letzte Zeile ohne Fehler zurückgegeben und wir können mit der Ausführung von Abfragen beginnen.
Aktualisieren der Sicherheitsstärke
Es gibt allerdings eine Einschränkung: Java wird unter Mac OSX standardmäßig mit einer starken Sicherheitsrichtlinie installiert, aber um mit Kerberos zu arbeiten, benötigen wir eine unbegrenzte Stärke. Wenn Sie also einen Fehler wie den folgenden sehen, müssen Sie die Richtlinie aktualisieren.
javax.Sicherheit.sasl.SaslException: GSS initiieren Sie gescheitert [Verursacht von GSSException: Nein gültig Berechtigungsnachweise bereitgestellt (Mechanismus Niveau: Illegal Schlüssel Größe)] unter com.Sonne.Sicherheit.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:212) unter org.apache.Sparsamkeit.transportieren.TSaslClientTransport.handleSaslStartMessage(TSaslClientTransport.java:94) unter org.apache.Sparsamkeit.transportieren.TSaslTransport.öffnen Sie(TSaslTransport.java:253) unter org.apache.Sparsamkeit.transportieren.TSaslClientTransport.öffnen Sie(TSaslClientTransport.java:1) unter org.apache.hadoop.Bienenstock.Sparsamkeit.Kunde.TUGIAaufwändigerTransport$1.laufen(TUGIAsumingTransport.java:52) unter org.apache.hadoop.Bienenstock.Sparsamkeit.Kunde.TUGIAaufwändigerTransport$1.laufen(TUGIAsumingTransport.java:49) unter java.Sicherheit.AccessController.doPrivileged(Einheimische Methode) unter javax.Sicherheit.auth.Thema.doAs(Thema.java:415) unter org.apache.hadoop.Sicherheit.UserGroupInformation.doAs(UserGroupInformation.java:1408)
Um die Richtlinie zu aktualisieren, können Sie die Dateien für Java 7 oder Java 6. Achten Sie darauf, dass Sie nicht die Java 6-Richtliniendateien installieren (wie wir es getan haben), wenn Sie Java 7 verwenden (und umgekehrt), , sonst wird es (immer noch) nicht funktionieren.
Auf einem Macbook Pro, auf dem die Datei UnlimitedJCEPolicy.zip auf ~/Downloads und
heruntergeladen wurde und auf dem JDK 1.7 installiert ist, würden beispielsweise die folgenden Zeilen in der Befehlszeile die Dateien für die unbegrenzte Stärke von
installieren.
cd ~/Downloads entpacken Sie UnlimitedJCEPolicy.zip cd /Library/Java/JavaVirtualMachines/jdk1.7/Contents/Home/jre/lib/security # wir müssen root sein, um etwas in diesem Systemverzeichnis zu ändern sudo su cp local_policy.jar local_policy.jar-old cp US_export_policy.jar US_export_policy.jar-old cp ~/Downloads/UnlimitedJCEPolicy/local_policy.jar . cp ~/Downloads/UnlimitedJCEPolicy/US_export_policy.jar . Ausgang
Sobald Sie das getan haben, starten Sie scala neu (mit den -D Argumenten, die wir oben gezeigt haben) und versuchen Sie erneut, eine Verbindung zu
herzustellen.
Testen der Verbindung
Sobald die Verbindung hergestellt ist, können wir mit den Ergebnissen ein wenig Scala machen! Wir können zum Beispiel eine Zuordnung vom Datenbanknamen zu den Tabellen in dieser Datenbank erstellen.
Typ SS = Setzen Sie[Zeichenfolge] def exec(sql: Zeichenfolge): ErgebnisSet = con.createStatement.executeQuery(sql) def toSet(sql: Zeichenfolge): SS = { def app(rs: ErgebnisSet, einstellen.: SS = Setzen Sie.leer): SS = wenn (rs.nächste) { app(rs, einstellen. + rs.getString(1)) } sonst { einstellen. } app(exec(sql)) } def Tabellen(t: Zeichenfolge): SS = toSet(s "Tabellen anzeigen von $t") val dbs = toSet("Datenbanken anzeigen") val dbStructure = dbs.foldLeft(Karte[Zeichenfolge, SS]()) { (mm, t) => mm + (t -> Tabellen(t)) }
Viel Spaß mit Hive, Impala, Kerberos und JDBC!
Unsere Ideen
Weitere Blogs
Contact



