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:
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/)
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.Erstellen Sie eine Datei mit dem Namen
snowflake-config.xml
im Verzeichnisconf
im Hive-Klassenpfad.Ö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
Europe (London)xy12345.eu-west-2.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 Virginiaxy12345.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 voller Kontoname von der im obigen Beispiel beschriebenen Struktur:
Wenn Ihre Snowflake Edition VPS ist, wenden Sie sich an den Snowflake-Support, um Details zu Ihrem Kontonamen zu erhalten.
Wenn AWS PrivateLink oder Azure Private Link für Ihr Konto aktiviert ist, muss Ihr Kontoname ein
privatelink
-Segment anstelle des Regionssegments enthalten. Weitere Details dazu finden Sie unter:
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
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> </configuration>
Speichern Sie die an der Datei vorgenommenen Änderungen.
Ö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.Speichern Sie die an der Datei vorgenommenen Änderungen.
Starten Sie den Hive-Metastore-Dienst neu.
Schritt 2: Installation überprüfen¶
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
Datenbank
undSchema
die Datenbank und 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. 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ä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 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.