Gérer les métadonnées Open Source avec le métastore BigLake

BigLake Metastore est un service de métadonnées physiques unifié pour les produits d'analyse de données sur Google Cloud. BigLake Metastore fournit une source unique de vérité pour les métadonnées et vous permet de gérer et d'accéder aux données de plusieurs sources. BigLake Metastore est accessible depuis BigQuery et divers moteurs de traitement de données Open Source sur Dataproc, ce qui en fait un outil utile pour les analystes et les ingénieurs de données.

Pour gérer les métadonnées d'entreprise, consultez Dataplex.

Fonctionnement de BigLake Metastore

BigLake Metastore est un service sans serveur qui ne nécessite pas de provisionner des ressources avant de l'utiliser. Vous pouvez l'utiliser comme alternative sans serveur au métastore Hive dans les clusters Dataproc. BigLake Metastore fonctionne de la même manière que Hive Metastore via ses API compatibles avec Hive. Vous pouvez immédiatement interroger des tables au format ouvert dans BigQuery sans aucune autre étape. BigLake Metastore n'est compatible qu'avec les tables Apache Iceberg.

BigLake Metastore fournit des API, des bibliothèques clientes et une intégration de moteur de données (comme Apache Spark) pour gérer les catalogues, les bases de données et les tables.

Limites

BigLake Metastore est soumis aux limites suivantes:

  • BigLake Metastore n'est pas compatible avec les tables Apache Hive.
  • Les rôles et autorisations IAM (Identity and Access Management) ne peuvent être accordés qu'aux projets. Il n'est pas possible d'accorder des autorisations IAM aux ressources.
  • Cloud Monitoring n'est pas compatible.
  • Les catalogues et les bases de données BigLake Metastore sont soumis aux limitations de dénomination suivantes :
    • Les noms peuvent comporter jusqu'à 1 024 caractères.
    • Les noms ne peuvent contenir que des lettres UTF-8 (majuscules, minuscules), des chiffres et des traits de soulignement.
    • Les noms doivent être uniques pour chaque combinaison de projet et de région.
  • Les tables BigLake Metastore suivent les mêmes conventions de dénomination que les tables BigQuery. Pour en savoir plus, consultez la section Nommer les tables.

Avant de commencer

Vous devez activer la facturation et l'API BigLake avant d'utiliser BigLake Metastore.

  1. Demandez à votre administrateur de vous accorder le rôle IAM "Administrateur de l'utilisation des services" (roles/serviceusage.serviceUsageAdmin) sur votre projet. Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.
  2. Activer la facturation pour votre projet Google Cloud. Découvrez comment vérifier si la facturation est activée sur un projet.
  3. Activez l'API BigLake.

    Activer l'API

Rôles requis

  • Pour disposer d'un contrôle total sur les ressources BigLake Metastore, vous devez disposer du rôle Administrateur BigLake (roles/biglake.admin). Si vous utilisez un compte de service connecteur BigQuery Spark, un compte de service Dataproc Serverless ou un Compte de service de VM Dataproc, accordez-lui le rôle d'administrateur BigLake.
  • Pour disposer d'un accès en lecture seule aux ressources BigLake Metastore, vous devez disposer du rôle Lecteur BigLake (roles/biglake.viewer). Par exemple, lorsque vous interrogez une table BigLake Metastore dans BigQuery, l'utilisateur ou le compte de service de connexion BigQuery doit disposer du rôle Lecteur BigLake.
  • Pour créer des tables BigQuery avec des connexions, vous devez disposer du rôle Utilisateur de connexion BigQuery (roles/bigquery.connectionUser). Pour en savoir plus sur le partage de connexions, consultez Partager des connexions avec des utilisateurs.

Selon le cas d'utilisation, l'identité qui appelle BigLake Metastore peut être un compte utilisateurs ou un compte de service :

  • Utilisateur : lors de l'appel direct de l'API Rest BigLake ou lors de l'interrogation d'une table BigQuery Iceberg sans connexion depuis BigQuery. BigQuery utilise les identifiants de l'utilisateur dans ce cas.
  • Connexion de ressources cloud BigQuery : lors de l'interrogation d'une table BigQuery Iceberg avec une connexion à partir de BigQuery BigQuery utilise les identifiants du compte de service de connexion pour accéder à BigLake Metastore.
  • Connecteur Spark BigQuery : lors de l'utilisation de Spark avec BigLake Metastore dans une procédure stockée Spark dans BigQuery. Spark utilise les identifiants du compte de service du connecteur Spark pour accéder à BigLake Metastore et créer des tables BigQuery.
  • Compte de service Dataproc sans serveur : lors de l'utilisation de Spark avec BigLake dans Dataproc sans serveur Spark utilise les identifiants du compte de service.
  • Compte de service de VM Dataproc : lorsque vous utilisez Dataproc (et non Dataproc sans serveur). Apache Spark utilise les identifiants du compte de service de la VM.

Selon vos autorisations, vous pouvez vous attribuer ces rôles ou demander à votre administrateur de vous les accorder. Pour en savoir plus sur l'attribution de rôles, consultez la page Afficher les rôles pouvant être attribués sur des ressources.

Pour afficher les autorisations exactes requises pour accéder aux ressources BigLake Metastore, développez la section Autorisations requises:

Autorisations requises

  • biglake.tables.get au niveau du projet, pour tous les accès en lecture seule. L'interrogation d'une table BigQuery Iceberg est en lecture seule.
  • biglake.{catalogs|databases|tables}.* au niveau du projet, pour toutes les autorisations de lecture et d'écriture. En règle générale, Apache Spark doit pouvoir lire et écrire des données, y compris créer, gérer et afficher des catalogues, des bases de données et des tables.
  • bigquery.connections.delegate au niveau de la connexion à la ressource cloud BigQuery ou à un niveau supérieur, pour créer une table BigQuery Iceberg à l'aide d'une connexion.

Se connecter à BigLake Metastore

Les sections suivantes expliquent comment se connecter à BigLake Metastore. Ces sections installent et utilisent le plug-in de catalogue BigLake Apache Iceberg, indiqué par les fichiers JAR dans les méthodes suivantes. Le plug-in de catalogue se connecte au métastore BigLake à partir de moteurs Open Source tels qu'Apache Spark.

Se connecter à une VM Dataproc

Pour vous connecter à BigLake Metastore avec une VM Dataproc, procédez comme suit:

  1. Utilisez SSH pour vous connecter à Dataproc.
  2. Dans la CLI Spark SQL, utilisez l'instruction suivante pour installer et configurer le catalogue personnalisé Apache Iceberg pour travailler avec BigLake Metastore:

    spark-sql \
      --packages ICEBERG_SPARK_PACKAGE \
      --jars BIGLAKE_ICEBERG_CATALOG_JAR \
      --conf spark.sql.catalog.SPARK_CATALOG=org.apache.iceberg.spark.SparkCatalog \
      --conf spark.sql.catalog.SPARK_CATALOG.catalog-impl=org.apache.iceberg.gcp.biglake.BigLakeCatalog \
      --conf spark.sql.catalog.SPARK_CATALOG.gcp_project=PROJECT_ID \
      --conf spark.sql.catalog.SPARK_CATALOG.gcp_location=LOCATION \
      --conf spark.sql.catalog.SPARK_CATALOG.blms_catalog=BLMS_CATALOG \
      --conf spark.sql.catalog.SPARK_CATALOG.warehouse=GCS_DATA_WAREHOUSE_FOLDER \
      --conf spark.sql.catalog.SPARK_HMS_CATALOG=org.apache.iceberg.spark.SparkCatalog \
      --conf spark.sql.catalog.SPARK_HMS_CATALOG.type=hive \
      --conf spark.sql.catalog.SPARK_HMS_CATALOG.uri=thrift://HMS_URI:9083
      

Remplacez les éléments suivants :

  • ICEBERG_SPARK_PACKAGE: version d'Apache Iceberg à utiliser avec Spark. Nous vous recommandons d'utiliser la version de Spark qui correspond à la version de Spark dans votre instance Dataproc ou Dataproc sans serveur. Pour afficher la liste des versions Apache Iceberg disponibles, consultez la section Téléchargements Apache Iceberg. Par exemple, l'indicateur pour Apache Spark 3.3 est le suivant:
    --packages org.apache.iceberg:iceberg-spark-runtime-3.3_2.13:1.2.1
  • BIGLAKE_ICEBERG_CATALOG_JAR: URI Cloud Storage du plug-in de catalogue personnalisé Iceberg à installer. Selon votre environnement, sélectionnez l'une des options suivantes :
    • Iceberg 1.2.0 : gs://spark-lib/biglake/biglake-catalog-iceberg1.2.0-0.1.1-with-dependencies.jar
    • Iceberg 0.14.0 : gs://spark-lib/biglake/biglake-catalog-iceberg0.14.0-0.1.1-with-dependencies.jar
  • SPARK_CATALOG : identifiant de catalogue pour Spark. Il est associé à un catalogue BigLake Metastore.
  • PROJECT_ID: ID de projet Google Cloud du catalogue BigLake Metastore auquel le catalogue Spark est associé.
  • LOCATION: emplacement Google Cloud du catalogue BigLake Metastore auquel le catalogue Spark est associé.
  • BLMS_CATALOG: ID du catalogue BigLake Metastore auquel le catalogue Spark est associé. Le catalogue n'a pas besoin d'exister et peut être créé dans Spark.
  • GCS_DATA_WAREHOUSE_FOLDER: dossier Cloud Storage dans lequel Spark crée tous les fichiers. Il commence par gs://.
  • HMS_DB : (facultatif) base de données HMS contenant la table depuis laquelle copier.
  • HMS_TABLE : (facultatif) table HMS depuis laquelle copier.
  • HMS_URI: (facultatif) point de terminaison HMS Thrift.

Se connecter à un cluster Dataproc

Vous pouvez également envoyer une tâche Dataproc à un cluster. L'exemple suivant installe le catalogue personnalisé Iceberg approprié.

Pour vous connecter à un cluster Dataproc, envoyez une tâche avec les spécifications suivantes:

CONFS="spark.sql.catalog.SPARK_CATALOG=org.apache.iceberg.spark.SparkCatalog,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.catalog-impl=org.apache.iceberg.gcp.biglake.BigLakeCatalog,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.gcp_project=PROJECT_ID,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.gcp_location=LOCATION,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.blms_catalog=BLMS_CATALOG,"
CONFS+="spark.sql.catalog.SPARK_CATALOG.warehouse=GCS_DATA_WAREHOUSE_FOLDER,"
CONFS+="spark.jars.packages=ICEBERG_SPARK_PACKAGE"

gcloud dataproc jobs submit spark-sql --cluster=DATAPROC_CLUSTER \
  --project=DATAPROC_PROJECT_ID \
  --region=DATAPROC_LOCATION \
  --jars=BIGLAKE_ICEBERG_CATALOG_JAR \
  --properties="${CONFS}" \
  --file=QUERY_FILE_PATH

Remplacez les éléments suivants :

  • DATAPROC_CLUSTER: cluster Dataproc auquel envoyer la tâche.
  • DATAPROC_PROJECT_ID: ID de projet du cluster Dataproc. Cet ID peut être différent de PROJECT_ID.
  • DATAPROC_LOCATION: emplacement du cluster Dataproc. Cet emplacement peut être différent de LOCATION.
  • QUERY_FILE_PATH: chemin d'accès au fichier contenant les requêtes à exécuter.

Se connecter à Dataproc sans serveur

De même, vous pouvez envoyer une charge de travail par lot à Dataproc sans serveur. Pour ce faire, suivez les instructions concernant les charges de travail par lot avec les indicateurs supplémentaires suivants:

  • --properties="${CONFS}"
  • --jars=BIGLAKE_ICEBERG_CATALOG_JAR

Se connecter à des procédures stockées BigQuery

Vous pouvez utiliser des procédures stockées BigQuery pour exécuter des jobs Dataproc sans serveur. Le processus est semblable à l'exécution de jobs Dataproc sans serveur directement dans Dataproc.

Créer des ressources de métastore

Les sections suivantes expliquent comment créer des ressources dans le métastore.

Créer des catalogues

Les noms de catalogue sont soumis à des contraintes. Pour en savoir plus, consultez la section Limites. Pour créer un catalogue, sélectionnez l'une des options suivantes :

API

Utilisez la méthode projects.locations.catalogs.create et spécifiez le nom d'un catalogue.

Spark SQL

CREATE NAMESPACE SPARK_CATALOG;

Terraform

Cela crée une base de données BigLake nommée "my_database" de type "HIVE" dans le catalogue spécifié par la variable "google_biglake_catalog.default.id". Pour en savoir plus, consultez la documentation Terraform BigLake.

resource "google_biglake_catalog" "default" {
name     = "my_catalog"
location = "US"
}

Créer des bases de données

Les noms de base de données sont soumis à des contraintes. Pour en savoir plus, consultez la section Limites. Pour vous assurer que votre ressource de base de données est compatible avec les moteurs de données, nous vous recommandons de créer des bases de données à l'aide de moteurs de données plutôt que de créer manuellement le corps de la ressource. Pour créer une base de données, sélectionnez l'une des options suivantes :

API

Utilisez la méthode projects.locations.catalogs.databases.create et spécifiez le nom d'une base de données.

Spark SQL

CREATE NAMESPACE SPARK_CATALOG.BLMS_DB;

Remplacez les éléments suivants :

  • BLMS_DB : ID de la base de données BigLake Metastore à créer

Terraform

Cela crée une base de données BigLake nommée "my_database" de type "HIVE" dans le catalogue spécifié par la variable "google_biglake_catalog.default.id". Pour en savoir plus, consultez la documentation Terraform BigLake.

resource "google_biglake_database" "default" {
name    = "my_database"
catalog = google_biglake_catalog.default.id
type    = "HIVE"
hive_options {
  location_uri = "gs://${google_storage_bucket.default.name}/${google_storage_bucket_object.metadata_directory.name}"
  parameters = {
    "owner" = "Alex"
  }
}
}

Créer des tables

Des contraintes s'appliquent aux noms de table. Pour en savoir plus, consultez la section Nommer les tables. Pour créer une table, choisissez l'une des options suivantes :

API

Utilisez la méthode projects.locations.catalogs.databases.tables.create et spécifiez le nom d'une table.

Spark SQL

CREATE TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE
  (id bigint, data string) USING iceberg;

Remplacez les éléments suivants :

  • BLMS_TABLE : ID de la table BigLake Metastore à créer

Terraform

Cette action crée une table BigLake Metastore nommée "my_table" et de type "HIVE" dans la base de données spécifiée par la variable "google_biglake_database.default.id". Pour en savoir plus, consultez la documentation du fournisseur Terraform : Table BigLake.

resource "google_biglake_table" "default" {
name     = "my-table"
database = google_biglake_database.default.id
type     = "HIVE"
hive_options {
  table_type = "MANAGED_TABLE"
  storage_descriptor {
    location_uri  = "gs://${google_storage_bucket.default.name}/${google_storage_bucket_object.data_directory.name}"
    input_format  = "org.apache.hadoop.mapred.SequenceFileInputFormat"
    output_format = "org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat"
  }
  parameters = {
    "spark.sql.create.version"          = "3.1.3"
    "spark.sql.sources.schema.numParts" = "1"
    "transient_lastDdlTime"             = "1680894197"
    "spark.sql.partitionProvider"       = "catalog"
    "owner"                             = "Alex"
    "spark.sql.sources.schema.part.0" = jsonencode({
      "type" : "struct",
      "fields" : [
        { "name" : "id", "type" : "integer",
          "nullable" : true,
          "metadata" : {}
        },
        {
          "name" : "name",
          "type" : "string",
          "nullable" : true,
          "metadata" : {}
        },
        {
          "name" : "age",
          "type" : "integer",
          "nullable" : true,
          "metadata" : {}
        }
      ]
    })
    "spark.sql.sources.provider" = "iceberg"
    "provider"                   = "iceberg"
  }
}
}

Exemple Terraform E2E

Cet exemple GitHub fournit un exemple E2E exécutable qui crée un catalogue, une base de données et une table "BigLake Metastore". Pour en savoir plus sur l'utilisation de cet exemple, consultez la section Commandes Terraform de base.

Copier une table Iceberg depuis Hive Metastore vers BigLake Metastore

Pour créer une table Iceberg et copier une table Hive Metastore vers BigLake Metastore, utilisez l'instruction SQL Spark suivante:

CREATE TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE
  (id bigint, data string) USING iceberg
  TBLPROPERTIES(hms_table='HMS_DB.HMS_TABLE');

BigLake Metastore est le métastore recommandé pour interroger les tables externes BigLake pour Iceberg. Lorsque vous créez une table Iceberg dans Spark, vous pouvez éventuellement créer une table BigLake Iceberg associée en même temps.

Pour créer une table Iceberg dans Spark et créer automatiquement une table BigLake Iceberg en même temps, utilisez l'instruction Spark SQL suivante:

  CREATE TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE
    (id bigint, data string) USING iceberg
    TBLPROPERTIES(bq_table='BQ_TABLE_PATH',
    bq_connection='BQ_RESOURCE_CONNECTION');

Remplacez les éléments suivants :

  • BQ_TABLE_PATH: chemin d'accès de la table BigLake Iceberg à créer. Suivez la syntaxe du chemin d'accès à la table BigQuery. Elle utilise le même projet que le catalogue BigLake Metastore si le projet n'est pas spécifié.
  • BQ_RESOURCE_CONNECTION (facultatif) : le format est project.location.connection-id. Si cette option est spécifiée, les requêtes BigQuery utilisent les identifiants de connexion à la ressource cloud pour accéder à BigLake Metastore. Si cette option n'est pas spécifiée, BigQuery crée une table externe standard au lieu d'une tableBigLake.

Pour créer manuellement des liens entre des tables BigLake Iceberg et des URI de table BigLake Metastore spécifiés (blms://…), utilisez l'instruction SQL BigQuery suivante:

CREATE EXTERNAL TABLE 'BQ_TABLE_PATH'
  WITH CONNECTION `BQ_RESOURCE_CONNECTION`
  OPTIONS (
          format = 'ICEBERG',
          uris = ['blms://projects/PROJECT_ID/locations/LOCATION/catalogs/BLMS_CATALOG/databases/BLMS_DB/tables/BLMS_TABLE']
          )

Afficher les ressources de métastore

Les sections suivantes expliquent comment afficher les ressources dans BigLake Metastore.

Afficher les catalogues

Pour afficher toutes les bases de données d'un catalogue, utilisez la méthode projects.locations.catalogs.list et spécifiez le nom d'un catalogue.

Pour afficher des informations sur un catalogue, utilisez la méthode projects.locations.catalogs.get et spécifiez le nom d'un catalogue.

Afficher les bases de données

Pour afficher une base de données:

API

Pour afficher toutes les tables d'une base de données, utilisez la méthode projects.locations.catalogs.databases.list et spécifiez le nom d'une base de données.

Pour afficher des informations sur une base de données, utilisez la méthode projects.locations.catalogs.databases.get et spécifiez le nom d'une base de données.

Spark SQL

Pour afficher toutes les bases de données d'un catalogue, utilisez l'instruction suivante:

SHOW { DATABASES | NAMESPACES } IN SPARK_CATALOG;

Pour afficher des informations sur une base de données définie, utilisez l'instruction suivante:

DESCRIBE { DATABASE | NAMESPACE } [EXTENDED] SPARK_CATALOG.BLMS_DB;

Afficher des tables

Pour afficher toutes les tables d'une base de données ou une table définie, procédez comme suit:

API

Pour afficher toutes les tables d'une base de données, utilisez la méthode projects.locations.catalogs.databases.tables.list et spécifiez le nom d'une base de données.

Pour afficher des informations sur une table, utilisez la méthode projects.locations.catalogs.databases.tables.get et spécifiez le nom d'une table.

Spark SQL

Pour afficher toutes les tables d'une base de données, utilisez l'instruction suivante:

SHOW TABLES IN SPARK_CATALOG.BLMS_DB;

Pour afficher des informations sur une table définie, utilisez l'instruction suivante:

DESCRIBE TABLE [EXTENDED] SPARK_CATALOG.BLMS_DB.BLMS_TABLE;

Modifier les ressources de métastore

Les sections suivantes expliquent comment modifier des ressources dans le métastore.

Mettre des tables à jour

Pour éviter les conflits lorsque plusieurs tâches tentent de mettre à jour la même table en même temps, BigLake Metastore utilise le verrouillage optimiste. Pour utiliser le verrouillage optimiste, vous devez d'abord obtenir la version actuelle de la table (appelée etag) à l'aide de la méthode GetTable. Vous pouvez ensuite apporter des modifications à la table et utiliser la méthode UpdateTable en transmettant l'étiquette d'article générée précédemment. Si un autre job met à jour la table une fois que vous avez récupéré l'etag, la méthode UpdateTable échoue. Cette mesure garantit qu'une seule tâche peut mettre à jour la table à la fois, ce qui évite les conflits.

Pour créer une table BigLake, choisissez l'une des options suivantes :

API

Utilisez la méthode projects.locations.catalogs.databases.tables.patch et spécifiez le nom d'une table.

Spark SQL

Pour connaître les options de mise à jour de table en SQL, consultez ALTER TABLE.

Renommer des tables

Pour renommer une table, sélectionnez l'une des options suivantes :

API

Utilisez la méthode projects.locations.catalogs.databases.tables.rename et spécifiez le nom d'une table et une valeur newName.

Spark SQL

ALTER TABLE BLMS_TABLE RENAME TO NEW_BLMS_TABLE;

Remplacez les éléments suivants :

  • NEW_BLMS_TABLE: nouveau nom de BLMS_TABLE. Doit se trouver dans le même ensemble de données que BLMS_TABLE.

Supprimer les ressources de métastore

Les sections suivantes décrivent comment supprimer des ressources dans BigLake Metastore.

Supprimer les catalogues

Pour supprimer un ensemble de données, sélectionnez l'une des options suivantes :

API

Utilisez la méthode projects.locations.catalogs.delete et spécifiez le nom d'un catalogue. Cette méthode ne supprime pas les fichiers associés dans Google Cloud.

Spark SQL

DROP NAMESPACE SPARK_CATALOG;

Supprimer des bases de données

Pour supprimer un ensemble de données, sélectionnez l'une des options suivantes :

API

Utilisez la méthode projects.locations.catalogs.databases.delete et spécifiez le nom d'une base de données. Cette méthode ne supprime pas les fichiers associés dans Google Cloud.

Spark SQL

DROP NAMESPACE SPARK_CATALOG.BLMS_DB;

Supprimer des tables

Pour supprimer un ensemble de données, sélectionnez l'une des options suivantes :

API

Utilisez la méthode projects.locations.catalogs.databases.tables.delete et spécifiez le nom d'une table. Cette méthode ne supprime pas les fichiers associés dans Google Cloud.

Spark SQL

Pour n'abandonner que la table, utilisez l'instruction suivante:

DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE;

Pour abandonner la table et supprimer les fichiers associés sur Google Cloud, utilisez l'instruction suivante:

DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE PURGE;