Abfragen von Apache Hive über den JDBC-Treiber in HDInsight

Erfahren Sie, wie Sie den JDBC-Treiber aus einer Java-Anwendung heraus verwenden, um Apache Hive-Abfragen an Apache Hadoop in Azure HDInsight zu übermitteln. Die Informationen in diesem Dokument veranschaulichen, wie eine Verbindung programmgesteuert und mithilfe des SQuirreL SQL-Clients hergestellt wird.

Weitere Informationen zur Hive-JDBC-Schnittstelle finden Sie unter HiveJDBCInterface.

Voraussetzungen

Verbindungszeichenfolge für JDBC

JDBC-Verbindungen mit einem HDInsight-Cluster unter Azure werden über Port 443 hergestellt, und der Datenverkehr wird per TLS/SSL geschützt. Das öffentliche Gateway, hinter dem sich die Cluster befinden, leitet den Datenverkehr an den Port um, auf dem von HiveServer2 gelauscht wird. Die folgende Verbindungszeichenfolge zeigt das für HDInsight zu verwendende Format:

    jdbc:hive2://CLUSTERNAME.azurehdinsight.net:443/default;transportMode=http;ssl=true;httpPath=/hive2

Ersetzen Sie CLUSTERNAME durch den Namen Ihres HDInsight-Clusters.

Hostname in der Verbindungszeichenfolge

Der Hostname „CLUSTERNAME.azurehdinsight.net“ in der Verbindungszeichenfolge ist mit der Cluster-URL identisch. Sie können sie über das Azure-Portal abrufen.

Port in der Verbindungszeichenfolge

Sie können nur über Port 443 eine Verbindung mit dem Cluster von Orten außerhalb des virtuellen Azure-Netzwerks herstellen. HDInsight ist ein verwalteter Dienst. Das bedeutet, dass alle Verbindungen mit dem Cluster über ein sicheres Gateway verwaltet werden. Es ist nicht möglich, direkt über die Ports 10001 oder 10000 eine Verbindung mit HiveServer 2 herzustellen. Diese Ports werden nicht nach außen verfügbar gemacht.

Authentifizierung

Verwenden Sie beim Herstellen der Verbindung den Administratornamen und das Kennwort für den HDInsight-Cluster, um sich zu authentifizieren. Geben Sie in JDBC-Clients, z. B. SQuirreL SQL, den Administratornamen und das Kennwort in den Clienteinstellungen ein.

In einer Java-Anwendung müssen Sie den Namen und das Kennwort beim Herstellen einer Verbindung eingeben. Der folgende Java-Code öffnet z. B. eine neue Verbindung:

DriverManager.getConnection(connectionString,clusterAdmin,clusterPassword);

Herstellen einer Verbindung mit dem SQuirreL SQL-Client

SQuirreL SQL ist ein JDBC-Client, der für die Remoteausführung von Hive-Abfragen mit Ihrem HDInsight-Cluster verwendet werden kann. Bei den folgenden Schritten wird davon ausgegangen, dass Sie SQuirreL SQL bereits installiert haben.

  1. Erstellen Sie ein Verzeichnis zur Aufnahme bestimmter Dateien, die aus Ihrem Cluster kopiert werden müssen.

  2. Ersetzen Sie im folgenden Skript sshuser durch den Namen des SSH-Benutzerkontonamens für den Cluster. Ersetzen Sie CLUSTERNAME durch den Namen des HDInsight-Clusters. Ändern Sie an einer Befehlszeile Ihre Arbeitsverzeichnis in das, das Sie im vorherigen Schritt erstellt haben, und geben Sie dann den folgenden Befehl ein, um Dateien aus einem HDInsight-Cluster zu kopieren:

    scp sshuser@CLUSTERNAME-ssh.azurehdinsight.net:/usr/hdp/current/hadoop-client/{hadoop-auth.jar,hadoop-common.jar,lib/log4j-*.jar,lib/slf4j-*.jar,lib/curator-*.jar} .
    
    scp sshuser@CLUSTERNAME-ssh.azurehdinsight.net:/usr/hdp/current/hive-client/lib/{commons-codec*.jar,commons-logging-*.jar,hive-*-*.jar,httpclient-*.jar,httpcore-*.jar,libfb*.jar,libthrift-*.jar} .
    
  3. Starten Sie die SQuirreL SQL-Anwendung. Wählen Sie auf der linken Seite des Fensters Drivers aus.

    Registerkarte „Drivers“ auf der linken Seite des Fensters

  4. Wählen Sie unter den Symbolen oben im Dialogfeld Treiber das Symbol +, um einen Treiber zu erstellen.

    SQuirreL SQL-Anwendungstreibersymbol

  5. Fügen Sie im Dialogfeld „Add Driver“ die folgenden Informationen hinzu:

    Eigenschaft Wert
    Name Hive
    Beispiel-URL jdbc:hive2://localhost:443/default;transportMode=http;ssl=true;httpPath=/hive2
    Zusätzlicher Klassenpfad Fügen Sie mit der Schaltfläche Add alle JAR-Dateien hinzu, die Sie zuvor heruntergeladen haben.
    Klassenname org.apache.hive.jdbc.HiveDriver

    Dialogfeld zum Hinzufügen eines Treibers mit Parametern

    Wählen Sie auf OK aus, um die Einstellungen zu speichern.

  6. Wählen Sie auf der linken Seite des Fensters „SQuirreL SQL“ die Option Aliases aus. Wählen Sie dann das Symbol + aus, um einen Verbindungsalias zu erstellen.

    „SQuirreL SQL – Dialogfeld zum Hinzufügen eines neuen Alias“

  7. Verwenden Sie für das Dialogfeld Add Alias die folgenden Werte:

    Eigenschaft Wert
    Name Hive in HDInsight
    Treiber Wählen Sie in der Dropdownliste den Hive-Treiber aus.
    URL jdbc:hive2://CLUSTERNAME.azurehdinsight.net:443/default;transportMode=http;ssl=true;httpPath=/hive2. Ersetzen Sie CLUSTERNAME durch den Namen Ihres HDInsight-Clusters.
    Benutzername Der Name des Clusteranmeldekontos für den HDInsight-Cluster. Der Standardname lautet admin.
    Kennwort Das Kennwort für das Clusteranmeldekonto.

    Dialogfeld zum Hinzufügen eines Alias mit Parametern

    Wichtig

    Überprüfen Sie mithilfe der Schaltfläche Test, ob die Verbindung funktioniert. Wenn das Dialogfeld Connect to: Hive on HDInsight angezeigt wird, wählen Sie Connect aus, um den Test durchzuführen. Wenn der Test erfolgreich ist, wird das Dialogfeld Connection successful (Verbindung erfolgreich) angezeigt. Wenn ein Fehler auftritt, finden Sie Informationen unter Problembehandlung.

    Verwenden Sie die Schaltfläche OK unten im Dialogfeld Add Alias (Alias hinzufügen), um den Verbindungsalias zu speichern.

  8. Wählen Sie oben in SQuirreL SQL in der Dropdownliste Connect to die Option Hive on HDInsight aus. Wenn Sie dazu aufgefordert werden, wählen Sie Connect aus.

    Dialogfeld für Verbindungen mit Parametern

  9. Nachdem die Verbindung hergestellt wurde, geben Sie im Dialogfeld für die SQL-Abfrage die folgende Abfrage ein, und wählen Sie das Symbol Run (ein laufender Mensch) aus. Die Ergebnisse der Abfrage sollten im Ergebnisbereich angezeigt werden.

    select * from hivesampletable limit 10;
    

    Dialogfeld für die SQL-Abfrage einschließlich der Ergebnisse

Herstellen einer Verbindung von einer Beispiel-Java-Anwendung aus

Ein Beispiel der Verwendung eines Java-Clients zur Hive-Abfrage in HDInsight finden Sie unter https://github.com/Azure-Samples/hdinsight-java-hive-jdbc. Befolgen Sie die Anleitung im Repository, um das Beispiel zu erstellen und auszuführen.

Problembehandlung

Unerwarteter Fehler beim Versuch, eine SQL-Verbindung zu öffnen

Symptome: Beim Herstellen einer Verbindung mit einem HDInsight-Cluster der Version 3.3 oder höher erhalten Sie möglicherweise die Meldung, dass ein unerwarteter Fehler aufgetreten ist. Die Stapelüberwachung für diesen Fehler beginnt mit folgenden Zeilen:

java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.<init>(I)V
at java.util.concurrent.FutureTas...(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:206)

Ursache: Dieser Fehler wird durch eine ältere Version der in SQuirreL enthaltenen commons-codec.jar-Datei verursacht.

Lösung: Führen Sie zum Beheben dieses Fehlers die folgenden Schritte aus:

  1. Beenden Sie SQuirreL, und wechseln Sie zu dem Verzeichnis, in dem SQuirreL in Ihrem System installiert ist, beispielsweise C:\Program Files\squirrel-sql-4.0.0\lib. Ersetzen Sie im SquirreL-Verzeichnis, unterhalb des lib -Verzeichnisses, die vorhandene commons-codec.jar-Datei durch die Datei, die Sie aus dem HDInsight-Cluster heruntergeladen haben.

  2. Starten Sie SQuirreL neu. Dieser Fehler sollte jetzt nicht mehr auftreten, wenn Sie eine Verbindung mit Hive in HDInsight herstellen.

Verbindung von HDInsight getrennt

Symptome: Wenn Sie versuchen, eine große Datenmenge (z. B. mehrere GB) über JDBC/ODBC herunterzuladen, wird die Verbindung während des Herunterladens unerwartet von HDInsight getrennt.

Ursache: Dieser Fehler wird durch die Einschränkung für Gatewayknoten verursacht. Beim Abrufen von Daten über JDBC/ODBC müssen alle Daten über den Gatewayknoten übergeben werden. Ein Gateway ist jedoch nicht für das Herunterladen einer großen Datenmenge konzipiert, sodass die Verbindung möglicherweise vom Gateway geschlossen wird, wenn es den Datenverkehr nicht verarbeiten kann.

Lösung: Vermeiden Sie die Verwendung des JDBC-/ODBC-Treibers zum Herunterladen großer Datenmengen. Kopieren Sie Daten stattdessen direkt aus dem Blobspeicher.

Nächste Schritte

Nachdem Sie erfahren haben, wie Sie JDBC mit Hive verwenden, können Sie mithilfe der nachfolgenden Links andere Möglichkeiten für die Arbeit mit Azure HDInsight untersuchen.