Gérer les métadonnées Open Source avec BigLake Metastore

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 les données de plusieurs sources et d'y accéder. BigLake Metastore est accessible depuis BigQuery et divers moteurs de traitement de données ouverts sur Dataproc, ce qui en fait un outil utile pour les analystes de données et les ingénieurs.

Pour savoir comment gérer les métadonnées commerciales, consultez la page sur Dataplex.

Fonctionnement de BigLake Metastore

BigLake Metastore est un service sans serveur qui ne vous oblige pas à provisionner des ressources avant de l'utiliser. Vous pouvez l'utiliser comme alternative sans serveur à Hive Metastore dans les clusters Dataproc. BigLake Metastore fonctionne de la même manière que Hive Metastore via ses API compatibles avec Hive. Vous pouvez également interroger immédiatement 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 limitations suivantes:

  • BigLake Metastore n'est pas compatible avec les tables Apache Hive.
  • Les rôles et les autorisations IAM (Identity and Access Management) ne peuvent être attribués qu'à des projets. Il n'est pas possible de donner des autorisations IAM aux ressources.
  • Cloud Monitoring n'est pas disponible.
  • Les catalogues et bases de données BigLake Metastore sont soumis aux limites 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 projet/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 attribuer le rôle IAM Administrateur d'utilisation du service (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, lors de l'interrogation d'une table BigLake Metastore dans BigQuery, l'utilisateur ou le compte de service de connexion BigQuery doit disposer du rôle BigLake Viewer.
  • 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 des connexions, consultez la page Partager des connexions avec les 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 alors les identifiants de l'utilisateur.
  • 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 en lecture et en écriture. En règle générale, Apache Spark doit pouvoir lire et écrire des données, y compris pour 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 à BigLake Metastore à partir de moteurs Open Source tels qu'Apache Spark.

Se connecter avec 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 disponibles d'Apache Iceberg, consultez la section Téléchargements Apache Iceberg. Par exemple, l'option Apache Spark 3.3 est la suivante:
    --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. En fonction de 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. Elle est associée à un catalogue BigLake Metastore.
  • PROJECT_ID: ID de projet Google Cloud du catalogue BigLake Metastore avec lequel 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 avec lequel 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 à partir de laquelle effectuer la copie.
  • HMS_TABLE: (facultatif) table HMS à partir de laquelle effectuer la copie.
  • HMS_URI: (facultatif) point de terminaison HMS Thrift.

Se connecter avec 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 avec Dataproc sans serveur

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

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

Se connecter aux procédures stockées BigQuery

Vous pouvez utiliser des procédures stockées BigQuery pour exécuter des tâches Dataproc sans serveur. Le processus est semblable à l'exécution de tâches 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 comportent 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 bases de données comportent 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 au lieu 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 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

Les noms de tables ont des contraintes. 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

Cela crée une table BigLake Metastore avec le nom "my_table" et le 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 : BigLake Table.

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 plus d'informations sur l'utilisation de cet exemple, reportez-vous à la page 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 dans BigLake Metastore, utilisez l'instruction Spark SQL 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 des tables BigLake 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. Il 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 table BigLake.

Pour créer manuellement des liens de tables BigLake Iceberg avec des URI de table BigLake Metastore (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, procédez comme suit:

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 afficher 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 à jour des tables

Pour éviter les conflits lorsque plusieurs tâches tentent de mettre à jour la même table en même temps, BigLake Metastore utilise un 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'ETag précédemment récupéré. Si une autre tâche met à jour la table après avoir récupéré l'ETag, la méthode UpdateTable échoue. Cette mesure permet de s'assurer qu'une seule tâche peut mettre à jour la table à la fois, évitant ainsi 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 la table en SQL, consultez la section ALTER TABLE.

Renommer les 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 expliquent 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 sur 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 sur 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 sur Google Cloud.

Spark SQL

Pour ne supprimer que la table, utilisez l'instruction suivante:

DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE;

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

DROP TABLE SPARK_CATALOG.BLMS_DB.BLMS_TABLE PURGE;