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.

Le connecteur Hive intègre actuellement toutes les tables des bases de données et des schémas dans un metastore avec une base de données et un schéma Snowflake uniques.

Note

Cette fonctionnalité n’est actuellement prise en charge que pour les tables Hive faisant référence à des fichiers de données stockés dans Amazon S3 ou dans Google Cloud Storage. La prise en charge de Microsoft Azure est prévue.

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éma Snowflake

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

Utilisateur Snowflake désigné

Le connecteur sera 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 (Amazon S3 ou Google Cloud Storage) 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 : Installer le 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 :

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

  2. Copiez le fichier JAR dans le répertoire lib du chemin de classe 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.

  3. Créez un fichier nommé snowflake-config.xml dans le répertoire conf du chemin de classe 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. Notez que 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.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.

    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 le nom complet de votre compte (fourni par Snowflake) au format suivant :

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

    Notez que votre nom de compte complet peut inclure des segments supplémentaires identifiant la région et la plate-forme Cloud où votre compte est hébergé.

    Exemples de noms de compte par région

    Si votre nom de compte est xy12345 :

    Plate-forme Cloud/Région

    Nom de compte complet

    AWS

    US Ouest (Oregon)

    xy12345

    US Est (Ohio)

    xy12345.us-east-2.aws

    US Est (Virginie du Nord)

    xy12345.us-east-1

    US Est (Gouvernement commercial - Virginie du Nord)

    xy12345.us-east-1-gov.aws

    Canada (Centre)

    xy12345.ca-central-1.aws

    EU (Irlande)

    xy12345.eu-west-1

    EU (Francfort)

    xy12345.eu-central-1

    Asie-Pacifique (Tokyo)

    xy12345.ap-northeast-1.aws

    Asie Pacifique (Mumbai)

    xy12345.ap-south-1.aws

    Asie-Pacifique (Singapour)

    xy12345.ap-southeast-1

    Asie-Pacifique (Sydney)

    xy12345.ap-southeast-2

    GCP

    US Central1 (Iowa)

    xy12345.us-central1.gcp

    Europe Ouest2 (Londres)

    xy12345.europe-west2.gcp

    Europe Ouest4 (Pays-Bas)

    xy12345.europe-west4.gcp

    Azure

    Ouest US 2 (Washington)

    xy12345.west-us-2.azure

    Est US 2 (Virginie)

    xy12345.east-us-2.azure

    US Gov Virginia

    xy12345.us-gov-virginia.azure

    Canada Central (Toronto)

    xy12345.canada-central.azure

    Europe de l’Ouest (Pays-Bas)

    xy12345.west-europe.azure

    Suisse Nord (Zurich)

    xy12345.switzerland-north.azure

    Asie du Sud-Est (Singapour)

    xy12345.southeast-asia.azure

    Australie Est (Nouvelle-Galles du Sud)

    xy12345.australia-east.azure

    Important

    Si l’une des conditions suivantes est remplie, le nom de votre compte est différent de la structure décrite dans cet exemple :

    • Si votre édition Snowflake est VPS, contactez le support Snowflake pour obtenir des détails sur le nom de votre compte.

    • Si AWS PrivateLink est activé pour votre compte, le nom de votre compte nécessite un segment privatelink supplémentaire. Pour plus de détails, voir AWS PrivateLink et Snowflake.

    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.

    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>
    

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

  6. Ouvrez le fichier de configuration Hive existant (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>
    

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

    base_de_données et schéma sont la base de données et le schéma que vous avez spécifiés dans 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 dans 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];

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

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

Note

Au cours de cet aperçu, les mappages de types de données sont toujours en cours de test. Il peut y avoir des différences dans la sémantique des différents types.

Formats de fichier pris en charge et options

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 études de cas 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 table externe 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>;
Table Hive non partitionnée

Exécutez la commande suivante :

ALTER TABLE <table_name> TOUCH;

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