Intégration d’Apache Hive Metastores à Snowflake

Cette rubrique fournit des instructions sur l’utilisation du connecteur Hive metastore pour Snowflake pour intégrer des metastores Apache Hive à Snowflake à l’aide de tables externes. Le connecteur détecte les événements de metastore et les transmet à Snowflake pour que les tables externes soient synchronisées avec le metastore Hive. Cela permet aux utilisateurs de gérer leur schéma dans Hive tout en l’interrogeant à partir de Snowflake.

L’Apache Hive Metastore doit être intégré au stockage Cloud sur l’une des plates-formes Cloud suivantes :

  • Amazon Web Services

  • Google Cloud Platform

  • Microsoft Azure

Dans ce chapitre :

Installation et configuration du connecteur Hive Metastore

Cette section fournit des instructions détaillées sur l’installation et la configuration du connecteur de metastore Hive pour Snowflake.

Conditions préalables

Le connecteur Hive pour Snowflake présente les conditions préalables suivantes :

Base de données et schémas Snowflake:

Stockez les tables externes mappées sur les tables Hive du metastore.

Utilisateur Snowflake désigné:

Le connecteur est configuré pour exécuter des opérations sur les tables externes en tant que cet utilisateur.

Intégration de stockage:

Les intégrations de stockage permettent de configurer un accès sécurisé au stockage dans le Cloud externe sans transmettre d’identifiants de fournisseur Cloud explicites tels que des clés secrètes ou des jetons d’accès. Créez une intégration de stockage pour accéder aux emplacements de stockage dans le Cloud référencés dans les tables Hive à l’aide de CREATE STORAGE INTEGRATION.

Le paramètre STORAGE_ALLOWED_LOCATIONS de l’intégration de stockage doit répertorier les mêmes conteneurs de stockage que ceux référencés dans le paramètre Location des tables Hive de votre metastore.

Rôle:

Le rôle doit être attribué à l’utilisateur Snowflake désigné et inclure les privilèges d’objet suivants sur les autres objets Snowflake identifiés dans cette section :

Objet

Privilèges

Base de données

USAGE

Schéma

USAGE , CREATE STAGE , CREATE EXTERNAL TABLE

Intégration de stockage

USAGE

Étape 1 : Installation du connecteur

Effectuez les étapes suivantes pour installer le connecteur :

  1. Téléchargez le fichier JAR de connecteur et le fichier de configuration XML à partir du référentiel central Maven :

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

  2. Copiez le fichier JAR dans le répertoire suivant :

    Amazon S3 ou Google Cloud Storage:

    Répertoire lib dans le classpath de Hive. L’emplacement peut varier en fonction de l’installation de Hive. Pour déterminer le chemin de classe, vérifiez la variable d’environnement HIVE_AUX_JARS_PATH .

    Microsoft Azure HDInsight:

    Répertoire hive dans le répertoire utilisateur ; par exemple, /usr/hdp/<hdinsight_version>/atlas/hook/hive/. L’emplacement peut varier en fonction de la version d’Azure HDInsight et des choix d’installation.

    Note

    Un exemple de script personnalisé est disponible dans le dossier scripts de la page GitHub du projet. Le script ajoute le fichier JAR et les fichiers de configuration dans les bons répertoires.

  3. Créez un fichier nommé snowflake-config.xml dans le répertoire suivant :

    Amazon S3 ou Google Cloud Storage:

    Répertoire conf dans le classpath de Hive.

    Microsoft Azure HDInsight:

    Répertoire conf/conf.server dans le classpath de Hive.

  4. Ouvrez le fichier snowflake-config.xml dans un éditeur de texte et remplissez-le avec les propriétés <nom> suivantes et les <valeurs> correspondantes :

    snowflake.jdbc.username

    Spécifie le nom de connexion de l’utilisateur Snowflake désigné pour les opérations d’actualisation sur les tables externes.

    snowflake.jdbc.password

    Spécifie le mot de passe pour le nom de connexion.

    Note

    • Vous pouvez définir un espace réservé pour le mot de passe en fonction d’une propriété système ou d’une variable d’environnement, en fonction de votre version de Hadoop. La configuration se comporte comme les autres configurations Hadoop. Pour plus d’informations, consultez la documentation Hadoop.

    • snowflake.jdbc.privateKey

    Vous pouvez également vous authentifier à l’aide de l’authentification par paire de clés. Pour des instructions sur la génération de paire de clés et sur l’affectation d’une clé publique à un utilisateur, voir Authentification par paire de clés et rotation de paires de clés.

    Pour transmettre la clé privée à Snowflake, ajoutez la propriété snowflake.jdbc.privateKey au fichier snowflake-config.xml. Ouvrez le fichier de la clé privée (par exemple rsa_key.p8) dans un éditeur de texte. Copiez les lignes entre -----BEGIN RSA PRIVATE KEY----- et -----END RSA PRIVATE KEY----- comme valeur de la propriété ou de la variable d’environnement.

    snowflake.jdbc.account

    Spécifie le nom de votre compte (fourni par Snowflake), par ex. xy12345.

    snowflake.jdbc.db

    Spécifie une base de données Snowflake existante à utiliser pour l’intégration du metastore Hive. Consultez la section Conditions préalables (dans cette rubrique) pour plus d’informations.

    snowflake.jdbc.schema

    Spécifie un schéma Snowflake existant dans la base de données spécifiée. Consultez la section Conditions préalables (dans cette rubrique) pour plus d’informations.

    Pour faire correspondre plusieurs schémas de votre Hive Metastore aux schémas correspondants de votre base de données Snowflake, définissez la propriété snowflake.hive-metastore-listener.schemas en plus de la propriété actuelle. Spécifiez le schéma Snowflake par défaut dans la propriété snowflake.jdbc.schema.

    snowflake.jdbc.role

    Spécifie le rôle de contrôle d’accès à utiliser par le connecteur Hive. Le rôle spécifié doit être un rôle existant qui a déjà été affecté à l’utilisateur spécifié.

    Si aucun rôle n’est spécifié ici, le connecteur Hive utilise le rôle par défaut pour l’utilisateur spécifié.

    snowflake.jdbc.connection

    Spécifie la chaîne de connexion de votre compte Snowflake au format suivant :

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

    Où :

    <account_identifier>

    Identificateur unique pour votre compte Snowflake.

    Le format préféré de l’identificateur du compte est le suivant :

    organization_name-account_name

    Noms de votre organisation et de votre compte Snowflake. Pour plus de détails, voir Format 1 (recommandé) : nom du compte dans votre organisation..

    Vous pouvez également indiquer votre localisateur de compte ainsi que la région géographique, et éventuellement la plate-forme Cloud, où le compte est hébergé. Pour plus de détails, voir Format 2 (existant) : localisateur de compte dans une région.

    snowflake.hive-metastore-connector.integration

    Spécifie le nom de l’objet d’intégration de stockage à utiliser pour un accès sécurisé aux emplacements de stockage externes référencés dans les tables Hive du metastore. Consultez la section Conditions préalables (dans cette rubrique) pour plus d’informations.

    snowflake.hive-metastore-listener.schemas

    Spécifie une liste séparée par des virgules de schémas Snowflake qui existent dans la base de données Snowflake spécifiée dans snowflake.jdbc.db.

    Lorsqu’une table est créée dans le métastore de Hive, le connecteur vérifie si cette propriété répertorie un schéma Snowflake portant le même nom que le schéma/la base de données de Hive qui contient la nouvelle table :

    • Si un schéma Snowflake portant le même nom est répertorié, le connecteur crée une table externe dans ce schéma.

    • Si un schéma Snowflake du même nom n’est pas répertorié, le connecteur crée une table externe dans le schéma par défaut, qui est défini dans la propriété snowflake.jdbc.schema .

    La table externe porte le même nom que la nouvelle table Hive.

    Note

    Nécessite la version 0.5.0 (ou supérieure) du connecteur Hive.

    En option, ajoutez la propriété suivante :

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

    Spécifie les noms de toutes les bases de données du métastore Hive à ignorer avec l’intégration. L’utilisation de cette propriété vous permet de contrôler les bases de données à intégrer à Snowflake. Cette option est particulièrement utile lorsque plusieurs tables ont le même nom dans les bases de données Hive. Actuellement, dans cette situation, le connecteur Hive crée la première table avec le nom dans la base de données cible Snowflake mais ignore les autres tables portant le même nom.

    Par exemple, supposons que les bases de données mydb1, mydb2 et mydb3 contiennent toutes une table nommée table1. Vous pouvez omettre toutes les bases de données avec la convention de dénomination mydb<nombre> à l’exception de mydb1 en ajoutant l’expression régulière mydb[^1] comme valeur de propriété.

    Exemple de nœud de propriété

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

    Exemple de fichier 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. Enregistrez les modifications dans le fichier.

  6. Modifiez le fichier de configuration Hive existant (hive-site.xml) :

    Amazon S3 ou Google Cloud Storage:

    Ouvrez le fichier hive-site.xml dans un éditeur de texte. Ajoutez le connecteur au fichier de configuration, comme suit :

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

    Suivez les étapes de la documentation Azure HDInsight pour modifier le fichier hive-site.xml . Ajoutez la propriété personnalisée suivante à la configuration du cluster :

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

    Vous pouvez également ajouter la propriété personnalisée dans le portail de gestion des clusters HDInsight :

    1. Cliquez sur l’onglet Hive dans le menu de gauche » Configs » Advanced.

    2. Faites défiler l’écran jusqu’à l’onglet Custom Hive Site.

    3. Ajoutez la propriété personnalisée.

    Note

    Si d’autres connecteurs sont déjà configurés dans ce fichier, ajoutez le connecteur Hive pour Snowflake dans une liste séparée par des virgules dans le nœud <value> .

  7. Enregistrez les modifications dans le fichier.

  8. Redémarrez le service Hive Metastore.

Étape 2 : Validation de l’installation

  1. Créez une nouvelle table dans Hive.

  2. Interrogez la liste des tables externes de votre base de données et de votre schéma Snowflake à l’aide de SHOW EXTERNAL TABLES :

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

    database et schema sont la base de données et le schéma que vous avez spécifiés dans le fichier snowflake-config.xml dans Étape 1 : Installer le connecteur (dans ce chapitre).

    Les résultats devraient afficher une table externe portant le même nom que la nouvelle table Hive.

Les enregistrements de connecteur sont écrits dans les journaux du metastore Hive. Les requêtes exécutées par le connecteur peuvent être visualisées dans la sortie de vue/fonction Snowflake QUERY_HISTORY de la même manière que les autres requêtes.

Intégration de tables et de partitions Hive existantes à Snowflake

Pour intégrer des tables et des partitions Hive existantes dans Snowflake, exécutez la commande suivante dans Hive pour chaque table et partition :

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

Pour plus d’informations, consultez la documentation Hive.

Sinon, Snowflake fournit un script pour synchroniser les tables et partitions Hive existantes. Pour plus d’informations, consultez la page de projet GitHub.

Note

Si une table externe portant le même nom que la table Hive existe déjà dans le schéma Snowflake correspondant de la base de données spécifiée dans la propriété snowflake.jdbc.db, la commande ALTER TABLE …. TOUCH ne recrée pas la table externe. Si vous devez recréer la table externe, supprimez la table externe (en utilisant DROP EXTERNAL TABLE) avant d’exécuter la commande ALTER TABLE …. TOUCH dans le métastore de Hive.

Fonctionnalités

Types de table et opérations Hive pris en charge

Opérations Hive

Le connecteur prend en charge les opérations Hive suivantes :

  • Créer une table

  • Détruire une table

  • Modifier la table ajouter une colonne

  • Modifier la table détruire une colonne

  • Modifier la table (toucher)

  • Ajouter une partition

  • Détruire une partition

  • Modifier la partition (toucher)

Types de table Hive

Le connecteur prend en charge les types de tables Hive suivants :

  • Tables externes et gérées

  • Tables partitionnées et non partitionnées

Types de données Hive et Snowflake

La table suivante illustre la relation entre les types de données Hive et Snowflake :

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

Tous les autres types de données

VARIANT

Formats de fichier et options pris en charge

Les formats de fichier de données et les options de format de fichier Hive suivants sont pris en charge :

  • CSV

    Les options suivantes sont prises en charge à l’aide des propriétés SerDe (Serializer/Deserializer) :

    • field.delim / separatorChar

    • line.delim

    • escape.delim / escapeChar

  • JSON

  • AVRO

  • ORC

  • PARQUET

    Les options suivantes sont prises en charge à l’aide des propriétés de la table :

    • parquet.compression.

Commandes, fonctionnalités et cas d’utilisation Hive non pris en charge

Le connecteur ne prend pas en charge les commandes, fonctionnalités et cas d’utilisation Hive suivants :

  • Vues Hive

  • Instructions ALTER autres que TOUCH, ADD COLUMNS et DROP COLUMNS

  • Propriétés SerDe personnalisées.

  • Modification d’une table Hive gérée existante pour qu’elle devienne une table Hive externe, ou inversement

Actualisation des métadonnées de tables externes pour refléter les événements de stockage dans le Cloud

Lorsque l’une des opérations Hive répertoriées dans Opérations Hive prises en charge et types de tables (dans cette rubrique) est exécutée sur une table, le connecteur Hive écoute les événements Hive, puis actualise les métadonnées de la table externe correspondante dans Snowflake.

Toutefois, le connecteur n’effectue pas l’actualisation des métadonnées de la table externe en fonction des événements du stockage dans le Cloud, tels que l’ajout ou la suppression de fichiers de données. Pour actualiser les métadonnées d’une table externe afin de refléter les événements du stockage dans le Cloud, exécutez la commande respective ALTER TABLE … TOUCH pour votre table Hive partitionnée ou non. TOUCH lit les métadonnées et les réécrit. Pour plus d’informations sur la commande, consultez la documentation Hive:

Table Hive partitionnée:

Exécutez la commande suivante :

ALTER TABLE <table_name> TOUCH PARTITION <partition_spec>;
Copy
Table Hive non partitionnée:

Exécutez la commande suivante :

ALTER TABLE <table_name> TOUCH;
Copy

Différences entre les tables Hive et les tables externes Snowflake

Cette section décrit les principales différences entre les tables Hive et les tables externes Snowflake.

Partitions:
  • Les partitions Snowflake sont composées de sous-chemins de l’emplacement de stockage référencé par la table, tandis que les partitions Hive n’ont pas cette contrainte. Si des partitions sont ajoutées dans les tables Hive qui ne sont pas des sous-chemins de l’emplacement de stockage, ces partitions ne sont pas ajoutées aux tables externes correspondantes dans Snowflake.

    Par exemple, si l’emplacement de stockage associé à la table Hive (et à la table externe Snowflake correspondante) est s3://path/, tous les emplacements de partition de la table Hive doivent également porter le préfixe s3://path/.

  • Deux partitions Snowflake d’une même table externe ne peuvent pas pointer vers le même emplacement de stockage. Par exemple, les partitions suivantes sont en conflit les unes avec les autres :

    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
Noms de colonne:

Les noms de colonnes Hive ne respectent pas la casse, mais les colonnes virtuelles Snowflake dérivées de VALUES sont sensibles à la casse. Si les tables Hive contiennent des colonnes avec des noms dont la casse est différente, les données de ces colonnes peuvent être NULL dans les colonnes correspondantes des tables externes Snowflake.