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 Hive-Konnektor integriert derzeit alle Tabellen in Datenbanken und Schemas eines Metastore mit einer einzigen Snowflake-Datenbank und einem einzigen Schema.

Bemerkung

Diese Funktion wird derzeit nur bei Hive-Tabellen unterstützt, die auf Datendateien verweisen, die in Amazon S3 oder Google Cloud Storage gespeichert sind. Unterstützung für Microsoft Azure ist geplant.

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 Schema

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

Designierter Snowflake-Benutzer

Der Konnektor wird so konfiguriert, dass er als dieser Benutzer Vorgänge für die 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 (Amazon S3 oder Google Cloud Storage) 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:

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

  2. Kopieren Sie die JAR-Datei in das 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.

  3. Erstellen Sie eine Datei mit dem Namen snowflake-config.xml im Verzeichnis conf im Hive-Klassenpfad.

  4. Öffnen Sie die Datei snowflake-config.xml in einem Texteditor, und füllen Sie sie mit den folgenden <Name>-Eigenschaften und den entsprechenden <Werten> aus:

    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. Beachten Sie, dass Sie abhängig von Ihrer Hadoop-Version basierend auf einer Systemeigenschaft oder einer Umgebungsvariablen einen Platzhalter für das Kennwort festlegen können. Die Konfiguration verhält sich wie andere Hadoop-Konfigurationen. Weitere Informationen dazu finden Sie in der Hadoop-Dokumentation.

    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).

    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 den vollständigen Namen Ihres Kontos (bereitgestellt von Snowflake) im folgenden Format an:

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

    Beachten Sie, dass Ihr vollständiger Kontoname möglicherweise zusätzliche Segmente enthält, die die Region und die Cloudplattform angeben, wo Ihr Konto gehostet wird.

    Beispiele für Kontonamen nach Region

    Wenn Ihr Kontoname beispielsweise xy12345 ist:

    Cloudplattform/Region

    Vollständiger Kontoname

    AWS

    US West (Oregon)

    xy12345

    US East (Ohio)

    xy12345.us-east-2.aws

    US East (N. Virginia)

    xy12345.us-east-1

    US East (Commercial Gov - N. Virginia)

    xy12345.us-east-1-gov.aws

    Canada (Central)

    xy12345.ca-central-1.aws

    EU (Irland)

    xy12345.eu-west-1

    EU (Frankfurt)

    xy12345.eu-central-1

    Asia Pacific (Tokio)

    xy12345.ap-northeast-1.aws

    Asia Pacific (Mumbai)

    xy12345.ap-south-1.aws

    Asia Pacific (Singapur)

    xy12345.ap-southeast-1

    Asia Pacific (Sydney)

    xy12345.ap-southeast-2

    GCP

    US Central1 (Iowa)

    xy12345.us-central1.gcp

    Europe West2 (London)

    xy12345.europe-west2.gcp

    Europe West4 (Niederlande)

    xy12345.europe-west4.gcp

    Azure

    West US 2 (Washington)

    xy12345.west-us-2.azure

    East US 2 (Virginia)

    xy12345.east-us-2.azure

    US Gov Virginia

    xy12345.us-gov-virginia.azure

    Canada Central (Toronto)

    xy12345.canada-central.azure

    West Europe (Niederlande)

    xy12345.west-europe.azure

    Switzerland North (Zürich)

    xy12345.switzerland-north.azure

    Southeast Asia (Singapur)

    xy12345.southeast-asia.azure

    Australia East (New South Wales)

    xy12345.australia-east.azure

    Wichtig

    Wenn eine der folgenden Bedingungen zutrifft, unterscheidet sich Ihr Kontoname von der oben beschriebenen Struktur:

    • Wenn Ihre Snowflake Edition VPS ist, wenden Sie sich an den Snowflake-Support, um Details zu Ihrem Kontonamen zu erhalten.

    • Wenn für Ihr Konto AWS PrivateLink aktiviert ist, muss der Kontoname ein zusätzliches privatelink-Segment enthalten. Weitere Details dazu finden Sie unter AWS PrivateLink & Snowflake.

    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).

    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>
    

    Beispiel für :file:`snowflake-config.xml`-Datei

    <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>
    </configuration>
    
  5. Speichern Sie die an der Datei vorgenommenen Änderungen.

  6. Öffnen Sie die vorhandene Hive-Konfigurationsdatei (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>
    

    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>;
    

    Wobei Datenbank und Schema die Datenbank und 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];

Weitere Informationen dazu finden Sie in der Hive-Dokumentation.

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

Funktionen

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

Bemerkung

Während dieser Vorschau werden die Datentypzuordnungen noch getestet. Es kann Unterschiede in der Semantik der verschiedenen Typen geben.

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

  • Benutzerdefinierte 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>;
Nicht partitionierte Hive-Tabelle

Führen Sie den folgenden Befehl aus:

ALTER TABLE <table_name> TOUCH;

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 TABLE exttable ADD PARTITION (partcol='1') LOCATION 's3:///files/2019/05/12';
    
    ALTER TABLE exttable ADD PARTITION (partcol='2') LOCATION 's3:///files/2019/05/12';
    
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.