Integration von Apache Hive-Metastores in Snowflake

Unter diesem Thema finden Sie Anweisungen zur Verwendung des Hive-Metastore-Konnektors zum Integrieren von Apache Hive-Metastores in Snowflake mithilfe externer Tabellen. Der Konnektor erkennt Metastore-Ereignisse und überträgt sie an Snowflake, um die externen Tabellen mit dem Hive-Metastore synchron zu halten. Auf diese Weise können Benutzer ihr Schema in Hive verwalten, während es über Snowflake abgefragt wird.

Der Apache Hive-Metaspeicher muss auf einer der folgenden Cloudplattformen mit Cloudspeicher integriert werden:

  • Amazon Web Services

  • Google Cloud Platform

  • Microsoft Azure

Unter diesem Thema:

Installieren und Konfigurieren des Hive-Metastore-Konnektors

Dieser Abschnitt enthält detaillierte Anweisungen zum Installieren und Konfigurieren des Hive-Metastore-Konnektors für Snowflake.

Voraussetzungen

Der Hive-Konnektor für Snowflake weist die folgenden Voraussetzungen auf:

Snowflake-Datenbank und -Schemas

Speichern die externen Tabellen, die den Hive-Tabellen im Metastore zugeordnet sind.

Designierter Snowflake-Benutzer

Der Konnektor ist so konfiguriert, dass er als dieser Benutzer Operationen auf den externen Tabellen ausführt.

Speicherintegration

Speicherintegrationen ermöglichen die Konfiguration sicheren Zugriffs auf externen Cloudspeicher, ohne dass explizite Cloudanbieter-Anmeldeinformationen wie geheime Schlüssel oder Zugriffstoken übergeben werden. Erstellen Sie eine Speicherintegration, um mit CREATE STORAGE INTEGRATION auf Cloudspeicherorte zuzugreifen, auf die in Hive-Tabellen verwiesen wird.

Der Parameter STORAGE_ALLOWED_LOCATIONS für die Speicherintegration muss die gleichen Speichercontainer enthalten, auf die im Parameter Location der Hive-Tabellen in Ihrem Metastore verwiesen wird.

Rolle

Die Rolle muss dem angegebenen Snowflake-Benutzer zugewiesen sein und die folgenden Objektberechtigungen für die anderen in diesem Abschnitt angegebenen Snowflake-Objekte enthalten:

Objekt

Berechtigungen

Datenbank

USAGE

Schema

USAGE , CREATE STAGE , CREATE EXTERNAL TABLE

Speicherintegration

USAGE

Schritt 1: Konnektor installieren

Führen Sie die folgenden Schritte aus, um den Konnektor zu installieren:

  1. Laden Sie die JAR-Datei des Konnektors und die XML-Konfigurationsdatei aus dem Maven Central Repository herunter:

    Sonatype (oder https://repo1.maven.org/maven2/net/snowflake/snowflake-hive-metastore-connector/)

  2. Kopieren Sie die JAR-Datei in das folgende Verzeichnis:

    Amazon S3 oder Google Cloud Storage

    lib-Verzeichnis im Hive-Klassenpfad. Der Speicherort kann je nach Hive-Installation variieren. Überprüfen Sie die Umgebungsvariable HIVE_AUX_JARS_PATH, um den Klassenpfad zu ermitteln.

    Microsoft Azure HDInsight

    hive-Verzeichnis im Benutzerverzeichnis, z. B. /usr/hdp/<HDInsight-Version>/atlas/hook/hive/. Der Speicherort kann je nach Azure HDInsight-Version und den Installationsoptionen variieren.

    Bemerkung

    Ein kundenspezifisches Beispielskript ist im Ordner scripts auf der GitHub-Projektseite verfügbar. Das Skript fügt die JAR-Datei und die Konfigurationsdateien zu den korrekten Verzeichnissen hinzu.

  3. Erstellen Sie eine Datei mit dem Namen snowflake-config.xml im folgenden Verzeichnis:

    Amazon S3 oder Google Cloud Storage

    conf-Verzeichnis im Hive-Klassenpfad.

    Microsoft Azure HDInsight

    conf/conf.server-Verzeichnis im Hive-Klassenpfad.

  4. Öffnen Sie die Datei snowflake-config.xml in einem Texteditor, und fügen Sie die folgenden <Name>-Eigenschaften mit den zugehörigen <Werten> hinzu:

    snowflake.jdbc.username

    Gibt den Anmeldenamen des Snowflake-Benutzers an, der für Aktualisierungsoperationen auf den externen Tabellen vorgesehen ist.

    snowflake.jdbc.password

    Gibt das Kennwort für den Anmeldenamen an.

    Bemerkung

    • Je nach Hadoop-Version können Sie auf Basis einer Systemeigenschaft oder einer Umgebungsvariablen einen Platzhalter für das Kennwort festlegen. Die Konfiguration verhält sich wie andere Hadoop-Konfigurationen. Weitere Informationen dazu finden Sie in der Hadoop-Dokumentation.

    • snowflake.jdbc.privateKey

    Alternativ können Sie die Schlüsselpaar-Authentifizierung verwenden. Eine Anleitung zum Generieren des Schlüsselpaars und zum Zuweisen des öffentlichen Schlüssels an einen Benutzer finden Sie unter Schlüsselpaar-Authentifizierung und Schlüsselpaar-Rotation.

    Um den privaten Schlüssel an Snowflake zu übergeben, fügen Sie die Eigenschaft snowflake.jdbc.privateKey zur Datei snowflake-config.xml hinzu. Öffnen Sie die Datei mit dem privaten Schlüssel (z. B. rsa_key.p8) in einem Texteditor. Kopieren Sie die Zeilen zwischen -----BEGIN RSA PRIVATE KEY----- und -----END RSA PRIVATE KEY----- als Wert der Eigenschaft oder Umgebungsvariable.

    snowflake.jdbc.account

    Gibt den Namen Ihres Kontos an (bereitgestellt von Snowflake), z. B. xy12345.

    snowflake.jdbc.db

    Gibt eine vorhandene Snowflake-Datenbank an, die für die Hive-Metastore-Integration verwendet werden soll. Weitere Informationen dazu finden Sie im Abschnitt Voraussetzungen (unter diesem Thema).

    snowflake.jdbc.schema

    Gibt ein vorhandenes Snowflake-Schema in der angegebenen Datenbank an. Weitere Informationen dazu finden Sie im Abschnitt Voraussetzungen (unter diesem Thema).

    Um mehrere Schemas in Ihrem Hive-Metaspeicher den entsprechenden Schemas in Ihrer Snowflake-Datenbank zuzuordnen, legen Sie zusätzlich zur aktuellen Eigenschaft auch die Eigenschaft snowflake.hive-metastore-listener.schemas fest. Geben Sie das Standardschema von Snowflake in der Eigenschaft snowflake.jdbc.schema an.

    snowflake.jdbc.role

    Gibt die Zugriffssteuerungsrolle an, die vom Hive-Konnektor verwendet werden soll. Die Rolle sollte eine bestehende Rolle sein, die dem angegebenen Benutzer bereits zugeordnet wurde.

    Wenn hier keine Rolle angegeben ist, verwendet der Hive-Konnektor die Standardrolle für den angegebenen Benutzer.

    snowflake.jdbc.connection

    Gibt die Verbindungszeichenfolge für Ihr Snowflake-Konto im folgenden Format an:

    jdbc:snowflake://<account_identifier>.snowflakecomputing.com

    Wobei:

    <account_identifier>

    Eindeutiger Bezeichner Ihres Snowflake-Kontos.

    Das bevorzugte Format für den Kontobezeichner ist wie folgt:

    organization_name-account_name

    Namen Ihrer Snowflake-Organisation und Ihres Snowflake-Kontos. Weitere Details dazu finden Sie unter Format 1 (bevorzugt): Kontoname in Ihrer Organisation.

    Geben Sie alternativ Ihren Konto-Locator zusammen mit der geografischen Region und ggf. mit der Cloudplattform an, auf der das Konto gehostet wird. Weitere Details dazu finden Sie unter Format 2 (älter): Konto-Locator in einer Region.

    snowflake.hive-metastore-connector.integration

    Gibt den Namen des Speicherintegrationsobjekts an, das für den sicheren Zugriff auf die externen Speicherorte verwendet werden soll, auf die in Hive-Tabellen im Metastore verwiesen wird. Weitere Informationen dazu finden Sie im Abschnitt Voraussetzungen (unter diesem Thema).

    snowflake.hive-metastore-listener.schemas

    Gibt eine kommagetrennte Liste der Snowflake-Schemas an, die in der in snowflake.jdbc.db angegebenen Snowflake-Datenbank vorhanden sind.

    Wenn eine Tabelle im Hive-Metaspeicher erstellt wird, prüft der Konnektor, ob diese Eigenschaft ein Snowflake-Schema mit dem gleichen Namen wie das Hive-Schema bzw. die Hive-Datenbank auflistet, das/die die neue Tabelle enthält:

    • Wenn ein Snowflake-Schema mit demselben Namen aufgeführt ist, erstellt der Konnektor eine externe Tabelle in diesem Schema.

    • Wenn ein Snowflake-Schema mit demselben Namen nicht aufgeführt ist, erstellt der Konnektor eine externe Tabelle in dem Standardschema, das in der Eigenschaft snowflake.jdbc.schema definiert ist.

    Die externe Tabelle hat den gleichen Namen wie die neue Hive-Tabelle.

    Bemerkung

    Erfordert Version 0.5.0 (oder höher) des Hive-Konnektors.

    Fügen Sie optional die folgende Eigenschaft hinzu:

    snowflake.hive-metastore-listener.database-filter-regex

    Gibt die Namen aller Datenbanken im Hive-Metastore an, die bei der Integration übersprungen werden sollen. Mit dieser Eigenschaft können Sie steuern, welche Datenbanken in Snowflake integriert werden sollen. Diese Option ist besonders nützlich, wenn mehrere Tabellen in Hive-Datenbanken denselben Namen haben. Derzeit erstellt der Hive-Konnektor in dieser Situation die erste Tabelle mit dem Namen in der Snowflake-Zieldatenbank, überspringt jedoch zusätzliche Tabellen mit demselben Namen.

    Angenommen, die Datenbanken mydb1, mydb2 und mydb3 enthalten alle eine Tabelle mit dem Namen table1. Sie können alle Datenbanken mit der Namenskonvention mydb<Nummer> mit Ausnahme von mydb1 weglassen, indem Sie den regulären Ausdruck mydb[^1] als Eigenschaftswert hinzufügen.

    Beispiel für einen Eigenschaftsknoten

    <configuration>
      ..
      <property>
        <name>snowflake.hive-metastore-listener.database-filter-regex</name>
        <value>mydb[^1]</value>
      </property>
    </configuration>
    
    Copy

    Beispiel für Datei „snowflake-config.xml“

    <configuration>
      <property>
        <name>snowflake.jdbc.username</name>
        <value>jsmith</value>
      </property>
      <property>
        <name>snowflake.jdbc.password</name>
        <value>mySecurePassword</value>
      </property>
      <property>
        <name>snowflake.jdbc.role</name>
        <value>custom_role1</value>
      </property>
      <property>
        <name>snowflake.jdbc.account</name>
        <value>myaccount</value>
      </property>
      <property>
        <name>snowflake.jdbc.db</name>
        <value>mydb</value>
      </property>
      <property>
        <name>snowflake.jdbc.schema</name>
        <value>myschema</value>
      </property>
      <property>
        <name>snowflake.jdbc.connection</name>
        <value>jdbc:snowflake://myaccount.snowflakecomputing.com</value>
      </property>
      <property>
        <name>snowflake.hive-metastore-listener.integration</name>
        <value>s3_int</value>
      </property>
      <property>
        <name>snowflake.hive-metastore-listener.schemas</name>
        <value>myschema1,myschema2</value>
      </property>
    </configuration>
    
    Copy
  5. Speichern Sie die an der Datei vorgenommenen Änderungen.

  6. Bearbeiten Sie die vorhandene Hive-Konfigurationsdatei (hive-site.xml):

    Amazon S3 oder Google Cloud Storage

    Öffnen Sie die Datei hive-site.xml in einem Texteditor. Fügen Sie den Konnektor der Konfigurationsdatei wie folgt hinzu:

    <configuration>
     ...
     <property>
      <name>hive.metastore.event.listeners</name>
      <value>net.snowflake.hivemetastoreconnector.SnowflakeHiveListener</value>
     </property>
    </configuration>
    
    Copy
    Microsoft Azure HDInsight

    Führen Sie die Schritte aus der Azure HDInsight-Dokumentation aus, um die Datei hive-site.xml zu bearbeiten. Fügen Sie der Clusterkonfiguration die folgende kundenspezifische Eigenschaft hinzu:

    hive.metastore.event.listeners=net.snowflake.hivemetastoreconnector.SnowflakeHiveListener

    Fügen Sie alternativ die kundenspezifische Eigenschaft im HDInsight Cluster Management Portal hinzu:

    1. Klicken Sie im linken Menü » Configs » Advanced auf die Registerkarte Hive.

    2. Scrollen Sie nach unten zur Registerkarte Custom Hive Site.

    3. Fügen Sie die kundenspezifische Eigenschaft hinzu.

    Bemerkung

    Wenn in dieser Datei bereits andere Konnektoren konfiguriert sind, fügen Sie den Hive-Konnektor für Snowflake in einer durch Kommas getrennten Liste im Knoten <value> hinzu.

  7. Speichern Sie die an der Datei vorgenommenen Änderungen.

  8. Starten Sie den Hive-Metastore-Dienst neu.

Schritt 2: Installation überprüfen

  1. Erstellen Sie eine neue Tabelle in Hive.

  2. Fragen Sie mit SHOW EXTERNAL TABLES die Liste der externen Tabellen in Ihrer Snowflake-Datenbank und dem zugehörigen Schema ab:

    SHOW EXTERNAL TABLES IN <database>.<schema>;
    
    Copy

    Wobei database und schema die Datenbank bzw. das Schema sind, die Sie in der Datei snowflake-config.xml in Schritt 1: Konnektor installieren (unter diesem Thema) angegeben haben.

    Im Ergebnis sollte nun eine externe Tabelle mit demselben Namen wie die neue Hive-Tabelle vorhanden sein:

Konnektor-Datensätze werden in die Hive-Metastore-Protokolle geschrieben. Vom Konnektor ausgeführte Abfragen können in der Snowflake-Ansicht/Funktionsausgabe QUERY_HISTORY angezeigt werden, ähnlich wie bei anderen Abfragen.

Integrieren vorhandener Hive-Tabellen und -Partitionen in Snowflake

Führen Sie den folgenden Befehl in Hive für jede Tabelle und Partition aus, um vorhandene Hive-Tabellen und -Partitionen in Snowflake zu integrieren:

ALTER TABLE <table_name> TOUCH [PARTITION partition_spec];
Copy

Weitere Informationen dazu finden Sie in der Hive-Dokumentation.

Alternativ stellt Snowflake ein Skript zum Synchronisieren vorhandener Hive-Tabellen und -Partitionen zur Verfügung. Weitere Informationen dazu finden Sie auf der GitHub-Projektseite

Bemerkung

Wenn eine externe Tabelle mit demselben Namen wie die Hive-Tabelle bereits im entsprechenden Snowflake-Schema der in der Eigenschaft snowflake.jdbc.db angegebenen Datenbank vorhanden ist, wird mit dem Befehl ALTER TABLE … TOUCH die externe Tabelle nicht neu erstellt. Wenn Sie die externe Tabelle neu erstellen müssen, löschen Sie die externe Tabelle (mit DROP EXTERNAL TABLE), bevor Sie den Befehl ALTER TABLE … TOUCH im Hive-Metaspeicher ausführen.

Features

Unterstützte Hive-Operationen und -Tabellentypen

Hive-Operationen

Der Konnektor unterstützt die folgenden Hive-Operationen:

  • Tabelle erstellen

  • Tabelle löschen

  • Tabelle ändern Spalte hinzufügen

  • Tabelle ändern Spalte löschen

  • Tabelle ändern (d. h. berühren)

  • Partition hinzufügen

  • Partition löschen

  • Partition ändern (berühren)

Hive-Tabellentypen

Der Konnektor unterstützt die folgenden Typen von Hive-Tabellen:

  • Externe und verwaltete Tabellen

  • Partitionierte und nicht partitionierte Tabellen

Hive- und Snowflake-Datentypen

Die folgende Tabelle veranschaulicht die Zuordnung von Hive- und Snowflake-Datentypen:

Hive

Snowflake

BIGINT

BIGINT

BINARY

BINARY

BOOLEAN

BOOLEAN

CHAR

CHAR

DATE

DATE

DECIMAL

DECIMAL

DOUBLE

DOUBLE

DOUBLE PRECISION

DOUBLE

FLOAT

FLOAT

INT

INT

INTEGER

INT

NUMERIC

DECIMAL

SMALLINT

SMALLINT

STRING

STRING

TIMESTAMP

TIMESTAMP

TINYINT

SMALLINT

VARCHAR

VARCHAR

Alle andere Datentypen

VARIANT

Unterstützte Dateiformate und Optionen

Die folgenden Datendateiformate und Hive-Dateiformatoptionen werden unterstützt:

  • CSV

    Die folgenden Optionen werden mit den Eigenschaften SerDe (Serializer/Deserializer) unterstützt:

    • field.delim / separatorChar

    • line.delim

    • escape.delim / escapeChar

  • JSON

  • AVRO

  • ORC

  • PARQUET

    Die folgenden Optionen werden mithilfe der Tabelleneigenschaften unterstützt:

    • parquet.compression.

Nicht unterstützte Hive-Befehle, -Funktionen und -Anwendungsfälle

Der Konnektor unterstützt nicht die folgenden Hive-Befehle, -Funktionen und -Anwendungsfälle:

  • Hive-Ansichten

  • ALTER-Anweisungen mit Ausnahme von TOUCH, ADD COLUMNS und DROP COLUMNS

  • Kundenspezifische SerDe-Eigenschaften.

  • Ändern einer vorhandenen verwalteten Hive-Tabelle in eine externe Hive-Tabelle oder umgekehrt

Aktualisieren externer Tabellenmetadaten, um Cloudspeicherereignisse widerzuspiegeln

Wenn eine der in Unterstützte Hive-Operationen und -Tabellentypen (unter diesem Thema) aufgelisteten Hive-Operationen für eine Tabelle ausgeführt wird, überwacht der Hive-Konnektor die Hive-Ereignisse und aktualisiert anschließend in Snowflake die Metadaten für die entsprechende externe Tabelle.

Der Konnektor aktualisiert jedoch nicht die Metadaten der externen Tabelle basierend auf Ereignissen im Cloudspeicher, z. B. beim Hinzufügen oder Entfernen von Datendateien. Um die Metadaten für eine externe Tabelle zu aktualisieren, damit sie Ereignisse im Cloudspeicher widerspiegeln, führen Sie den entsprechenden ALTER TABLE … TOUCH-Befehl für Ihre partitionierte oder nicht partitionierte Hive-Tabelle aus. TOUCH liest die Metadaten und schreibt sie zurück. Weitere Informationen zu dem Befehl finden Sie in der Hive-Dokumentation:

Partitionierte Hive-Tabelle

Führen Sie den folgenden Befehl aus:

ALTER TABLE <table_name> TOUCH PARTITION <partition_spec>;
Copy
Nicht partitionierte Hive-Tabelle

Führen Sie den folgenden Befehl aus:

ALTER TABLE <table_name> TOUCH;
Copy

Unterschiede zwischen Hive-Tabellen und externen Snowflake-Tabellen

In diesem Abschnitt werden die Hauptunterschiede zwischen Hive-Tabellen und externen Snowflake-Tabellen beschrieben.

Partitionen
  • Snowflake-Partitionen bestehen aus Unterpfaden des Speicherorts, auf den in der Tabelle verwiesen wird. Bei Hive-Partitionen gibt es diese Einschränkung nicht. Wenn Partitionen in Hive-Tabellen hinzugefügt werden, die keine Unterpfade des Speicherorts sind, werden diese Partitionen nicht zu den entsprechenden externen Tabellen in Snowflake hinzugefügt.

    Lautet der der Hive-Tabelle (und der entsprechenden externen Snowflake-Tabelle) zugeordnete Speicherort beispielsweise s3://path/, muss allen Partitionsspeicherorten in der Hive-Tabelle auch das Präfix s3://path/ vorangestellt werden.

  • Zwei Snowflake-Partitionen in einer einzelnen externen Tabelle können nicht auf den exakt gleichen Speicherort verweisen. Die folgenden Partitionen stehen beispielsweise in Konflikt miteinander:

    ALTER EXTERNAL TABLE exttable ADD PARTITION(partcol='1') LOCATION 's3:///files/2019/05/12';
    
    ALTER EXTERNAL TABLE exttable ADD PARTITION(partcol='2') LOCATION 's3:///files/2019/05/12';
    
    Copy
Spaltennamen

Bei den Namen von Hive-Spalten wird die Groß-/Kleinschreibung nicht berücksichtigt, bei den von VALUES abgeleiteten virtuellen Snowflake-Spalten wird sie jedoch beachtet. Wenn Hive-Tabellen Spalten mit Namen in gemischter Groß-/Kleinschreibung enthalten, sind die Daten in diesen Spalten in den entsprechenden Spalten der externen Snowflake-Tabellen möglicherweise NULL.