Gérer les métadonnées Open Source avec le métastore BigLake (ancienne version)

BigLake Metastore (version classique) est un service de métadonnées physiques unifié pour les produits d'analyse de données sur Google Cloud. Le metastore BigLake (classique) 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 provenant de plusieurs sources. Le métastore BigLake (classique) est accessible depuis BigQuery et divers moteurs de traitement de données ouverts sur Managed Service pour Apache Spark. Il s'agit donc d'un outil utile pour les analystes et les ingénieurs de données.

Pour gérer les métadonnées métier, consultez Knowledge Catalog.

Fonctionnement de BigLake Metastore (version classique)

BigLake Metastore (version classique) est un service sans serveur qui ne nécessite pas de provisionnement de ressources avant utilisation. Vous pouvez l'utiliser comme alternative sans serveur à Hive Metastore dans les clusters Managed Service pour Apache Spark. Le metastore BigLake (classique) fonctionne de la même manière que Hive Metastore grâce à ses API compatibles avec Hive. Vous pouvez interroger immédiatement les tables au format ouvert dans BigQuery sans aucune autre étape. Le métastore BigLake (classique) n'est compatible qu'avec les tables Apache Iceberg.

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

Limites

BigLake Metastore (ancienne version) est soumis aux limitations suivantes :

  • BigLake Metastore (classique) 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 (classique) 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 et de région.
  • Les tables du metastore BigLake (classique) suivent les mêmes conventions de dénomination que les tables BigQuery. Pour en savoir plus, consultez Nommer les tables.

Avant de commencer

Vous devez activer la facturation et l'API BigLake avant d'utiliser le metastore BigLake (version classique).

  1. Demandez à votre administrateur de vous accorder le rôle IAM Administrateur de 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. Activez 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 (classique), 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 Managed Service pour Apache Spark ou un compte de service de VM Managed Service pour Apache Spark, accordez-lui le rôle d'administrateur BigLake.
  • Pour disposer d'un accès en lecture seule aux ressources BigLake Metastore (ancienne version), vous devez disposer du rôle Lecteur BigLake (roles/biglake.viewer). Par exemple, lorsque vous interrogez une table BigLake Metastore (ancienne version) dans BigQuery, l'utilisateur ou le compte de service de connexion BigQuery doivent 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 (ancienne version) peut être un compte utilisateur ou un compte de service :

  • Utilisateur : lors de l'appel direct de l'API BigLake ou lors de l'interrogation d'une table Apache Iceberg gérée 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 gérée Iceberg avec une connexion à partir de BigQuery BigQuery utilise les identifiants du compte de service de connexion pour accéder à BigLake Metastore (version classique).
  • Connecteur Spark BigQuery : lors de l'utilisation de Spark avec BigLake Metastore (ancienne version) 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 (version classique) et créer des tables BigQuery.
  • Compte de service Managed Service pour Apache Spark : lors de l'utilisation de Spark avec BigLake dans Managed Service pour Apache Spark Spark utilise l'identifiant du compte de service.
  • Compte de service de VM Managed Service pour Apache Spark : lorsque vous utilisez Managed Service pour Apache Spark (et non Managed Service pour Apache Spark). 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 du metastore BigLake (classique), 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 gérée 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 gérée Iceberg à l'aide d'une connexion.

Se connecter à BigLake Metastore (version classique)

Les sections suivantes expliquent comment se connecter au metastore BigLake (classique). 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 metastore BigLake (classique) à partir de moteurs Open Source tels qu'Apache Spark.

Se connecter à une VM Managed Service pour Apache Spark

Pour vous connecter à un metastore BigLake (classique) avec une VM Managed Service pour Apache Spark, procédez comme suit :

  1. Utilisez SSH pour vous connecter à Managed Service pour Apache Spark.
  2. Dans la CLI Spark SQL, utilisez l'instruction suivante pour installer et configurer le catalogue personnalisé Apache Iceberg afin de travailler avec BigLake Metastore (version classique) :

    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 Managed Service pour Apache Spark ou Managed Service pour Apache Spark. Pour afficher la liste des versions d'Apache Iceberg disponibles, consultez 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.9.1 : gs://spark-lib/biglake/biglake-catalog-iceberg1.9.1-0.1.3-with-dependencies.jar
    • Iceberg 1.5.1 : gs://spark-lib/biglake/biglake-catalog-iceberg1.5.1-0.1.2-with-dependencies.jar
    • Iceberg 1.5.0 : gs://spark-lib/biglake/biglake-catalog-iceberg1.5.0-0.1.1-with-dependencies.jar
    • 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 (ancienne version).
  • PROJECT_ID : ID du projet Google Cloud du catalogue BigLake Metastore (ancien) auquel le catalogue Spark est associé.
  • LOCATION : emplacement Google Cloud du catalogue BigLake Metastore (ancien) auquel le catalogue Spark est associé.
  • BLMS_CATALOG : ID du catalogue BigLake Metastore (classique) 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 Managed Service pour Apache Spark

Vous pouvez également envoyer un job Managed Service pour Apache Spark à un cluster. L'exemple suivant installe le catalogue personnalisé Iceberg approprié.

Pour vous connecter à un cluster Managed Service pour Apache Spark, envoyez un job 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=MANAGED_SERVICE_FOR_APACHE_SPARK_CLUSTER \
  --project=MANAGED_SERVICE_FOR_APACHE_SPARK_PROJECT_ID \
  --region=MANAGED_SERVICE_FOR_APACHE_SPARK_LOCATION \
  --jars=BIGLAKE_ICEBERG_CATALOG_JAR \
  --properties="${CONFS}" \
  --file=QUERY_FILE_PATH

Remplacez les éléments suivants :

  • MANAGED_SERVICE_FOR_APACHE_SPARK_CLUSTER : cluster Managed Service pour Apache Spark auquel envoyer le job.
  • MANAGED_SERVICE_FOR_APACHE_SPARK_PROJECT_ID : ID du projet du cluster Managed Service pour Apache Spark. Cet ID peut être différent de PROJECT_ID.
  • MANAGED_SERVICE_FOR_APACHE_SPARK_LOCATION : emplacement du cluster Managed Service pour Apache Spark. 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 à Managed Service pour Apache Spark

De même, vous pouvez envoyer une charge de travail par lot à Managed Service pour Apache Spark. Pour ce faire, suivez les instructions concernant les charges de travail par lot en ajoutant les indicateurs suivants :

  • --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 jobs Managed Service pour Apache Spark. Le processus est semblable à l'exécution de jobs Managed Service pour Apache Spark directement dans Managed Service pour Apache Spark.

Créer des ressources de metastore

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

Créer des catalogues

Les noms de catalogue sont soumis à des contraintes. Pour en savoir plus, consultez 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 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 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 SPARK_CATALOG.BLMS_DB;

Remplacez les éléments suivants :

  • BLMS_DB : ID de la base de données BigLake Metastore (ancienne version) à 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 sont soumis à des contraintes. Pour en savoir plus, consultez 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 (ancienne version) à créer

Terraform

Cela enregistre une table BigLake Metastore (classic) 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". Notez que la table doit exister avant l'enregistrement dans le catalogue. Pour ce faire, vous pouvez initialiser la table à partir d'un moteur tel qu'Apache Spark. 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"