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 de vérité unique pour les métadonnées et vous permet de gérer les données et d'y accéder à partir de plusieurs sources. 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 et les ingénieurs de données.

Pour gérer les métadonnées d'entreprise, consultez la page 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 à 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 étape supplémentaire. 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 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 de 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 Service Usage" (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 la section 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. Dans ce cas, BigQuery utilise 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 de lecture et d'écriture. En règle générale, Apache Spark doit être capable de lire et d'écrire des données, y compris de 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 à une VM Dataproc

Pour vous connecter à BigLake Metastore à l'aide d'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 page Téléchargements Apache Iceberg. Par exemple, l'option pour 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. 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 il 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 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 du 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 de la charge de travail par lot avec les indicateurs supplémentaires suivants :

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

Se connecter avec 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 à celui de 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 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 base de données ont 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 table comportent 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

Cette opération 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". Consultez la documentation du fournisseur Terraform pour en savoir plus : 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 plus d'informations sur l'utilisation de cet exemple, reportez-vous à 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 sur 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 metastore recommandé pour interroger les 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 à 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 de tables BigLake Iceberg avec des URI de table BigLake Metastore spécifiés (blms://…), utilisez l'instruction BigQuery SQL 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 les ressources du métastore.

Mettre des tables à jour

Pour éviter les conflits lorsque plusieurs jobs 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 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'un seul job 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 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 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;