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:
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/)
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.
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.
Ö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 Dateisnowflake-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 Eigenschaftsnowflake.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
undmydb3
enthalten alle eine Tabelle mit dem Namentable1
. Sie können alle Datenbanken mit der Namenskonventionmydb<Nummer>
mit Ausnahme vonmydb1
weglassen, indem Sie den regulären Ausdruckmydb[^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 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>
Speichern Sie die an der Datei vorgenommenen Änderungen.
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>
- 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:
Klicken Sie im linken Menü » Configs » Advanced auf die Registerkarte Hive.
Scrollen Sie nach unten zur Registerkarte Custom Hive Site.
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.Speichern Sie die an der Datei vorgenommenen Änderungen.
Starten Sie den Hive-Metastore-Dienst neu.
Schritt 2: Installation validieren¶
Erstellen Sie eine neue Tabelle in Hive.
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
database
undschema
die Datenbank bzw. das Schema sind, die Sie in der Dateisnowflake-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. 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, -Features 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>;
- 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.
Wenn der Speicherort, der der Hive-Tabelle (und der entsprechenden externen Snowflake-Tabelle) zugeordnet ist, beispielsweise
s3://path/
ist, muss allen Partitionsspeicherorten in der Hive-Tabelle ebenfalls das Präfixs3://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';
- 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.