Utiliser un lakehouse sans bordure

Lakehouse pour Apache Iceberg permet d'interroger des données à distance via une configuration Lakehouse sans bordure. Une fois configuré, le système prend en charge l'accès aux données à l'aide de SQL standard dans BigQuery, de la version Open Source d'Apache Spark ou de Managed Service pour Apache Spark. En plus des requêtes analytiques, vous pouvez utiliser vos données fédérées pour obtenir des insights et une gouvernance basés sur l'IA :

  • Conversational Analytics: Créez des agents spécialisés basés sur vos sources de données exactes, y compris des tables multicloud, pour analyser les données sur plusieurs clouds à partir d'une seule conversation.
  • Catalogue Dataplex: utilisez les fonctionnalités de Knowledge Catalog pour le profilage et les insights sur les données avec des sources de données fédérées.

Pour obtenir des insights plus approfondis, vous pouvez créer des agents spécialisés basés sur vos sources de données, des projets, des ensembles de données et des tables aux vues, graphiques et fonctions définies par l'utilisateur. Comme vos données sont rarement stockées à un seul endroit, l'analyse conversationnelle va au-delà des tables BigQuery Standard pour atteindre les tables Apache Iceberg gérées par Lakehouse et les sources Lakehouse sans bordure telles que Databricks Unity, AWS Glue, SAP et Salesforce. Cela vous permet de décloisonner les données et de les analyser sur plusieurs clouds à partir d'une seule conversation.

Cette page explique comment interroger des données à distance après avoir configuré un Lakehouse sans bordure.

Avant de commencer

Avant de pouvoir interroger vos données, vous devez effectuer les opérations suivantes :

  1. Configurez un Lakehouse sans bordure pour AWS Glue, Databricks Unity Catalog, ou Snowflake.
  2. Assurez-vous que votre catalogue à distance contient des données.

Rôles requis

Pour obtenir les autorisations nécessaires pour interroger des données fédérées, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Interroger les données

Une fois la fédération configurée, vous pouvez interroger vos données à distance à l'aide de SQL standard dans BigQuery ou d'Apache Spark dans Managed Service pour Apache Spark.

Lakehouse gère la traduction des métadonnées et l'accès sécurisé aux données, ce qui vous permet de traiter les tables Apache Iceberg à distance comme si elles étaient locales à votre Google Cloud environnement.

Interroger depuis BigQuery

Pour interroger des tables Apache Iceberg fédérées, utilisez SQL BigQuery standard. Le chemin d'accès à la table suit une structure en quatre parties : project.federated_catalog.namespace.table. La mise en cache, la distribution des identifiants et le routage du transit CCI sont gérés automatiquement.

SELECT
  user_id,
  action,
  COUNT(*) as total_actions
FROM `PROJECT_ID.FEDERATED_CATALOG_NAME.NAMESPACE_NAME.TABLE_NAME`
WHERE event_date >= '2026-04-01'
GROUP BY 1, 2;

Remplacez les éléments suivants :

  • PROJECT_ID: ID de votre Google Cloud projet.
  • FEDERATED_CATALOG_NAME : nom du catalogue fédéré.
  • NAMESPACE_NAME : espace de noms dans le catalogue.
  • TABLE_NAME : nom de la table.
  • REGION: la Google Cloud région. Par exemple, us-east4.

Vous pouvez également exécuter la requête à l'aide de l'outil de ligne de commande bq :

bq --location="REGION" --project_id="PROJECT_ID" query --use_legacy_sql=false \
  "SELECT * FROM \`PROJECT_ID.FEDERATED_CATALOG_NAME.NAMESPACE_NAME.TABLE_NAME\` LIMIT 10"

Interroger depuis Managed Service pour Apache Spark

Envoyez une charge de travail par lot PySpark à Managed Service pour Apache Spark avec la distribution des identifiants activée à l'aide de X-Iceberg-Access-Delegation=vended-credentials. Spark utilisera les identifiants distribués à courte durée de vie pour se connecter à S3 de manière sécurisée, sans avoir à gérer des identifiants AWS ni des connecteurs S3 distincts.

  1. Activez la connectivité sortante pour Managed Service pour Apache Spark.

    Managed Service pour Apache Spark ne peut pas se connecter à AWS S3 avec sa configuration réseau par défaut network configuration. Vous devez provisionner un Cloud Router et Cloud NAT.

    gcloud compute routers create lakehouse-router \
      --network=NETWORK_NAME \
      --region=REGION
    
    gcloud compute routers nats create lakehouse-nat \
      --router=lakehouse-router \
      --auto-allocate-nat-external-ips \
      --nat-all-subnet-ip-ranges \
      --region=REGION

    Remplacez les éléments suivants :

    • NETWORK_NAME : réseau de la charge de travail par lot Managed Service pour Apache Spark (par exemple, default).
    • REGION : région de la charge de travail par lot Managed Service pour Apache Spark.
  2. Créez un fichier d'application PySpark et exécutez le job PySpark.

    from pyspark.sql import SparkSession
    spark = SparkSession.builder.appName("CATALOG_NAME").getOrCreate()
    
    df = spark.table("CATALOG_NAME.NAMESPACE_NAME.TABLE_NAME")
    df.show(10, truncate=False)

    Importez-le dans Cloud Storage à l'adresse PYSPARK_FILE.

    gcloud dataproc batches submit pyspark PYSPARK_FILE \
        --project=PROJECT_ID \
        --region=REGION \
        --version=RUNTIME_VERSION \
        --properties="\
        spark.sql.defaultCatalog=CATALOG_NAME,\
        spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog,\
        spark.sql.catalog.CATALOG_NAME.type=rest,\
        spark.sql.catalog.CATALOG_NAME.uri=https://biglake.googleapis.com/iceberg/v1/restcatalog,\
        spark.sql.catalog.CATALOG_NAME.warehouse=bl://projects/PROJECT_ID/catalogs/FEDERATED_CATALOG_NAME,\
        spark.sql.catalog.CATALOG_NAME.header.x-goog-user-project=PROJECT_ID,\
        spark.sql.catalog.CATALOG_NAME.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager,\
        spark.sql.catalog.CATALOG_NAME.io-impl=IO_IMPL,\
        spark.sql.catalog.CATALOG_NAME.header.X-Iceberg-Access-Delegation=vended-credentials,\
        spark.sql.catalog.CATALOG_NAME.rest-metrics-reporting-enabled=false,\
        spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"

    Remplacez les éléments suivants :

    • NAMESPACE_NAME : espace de noms dans le catalogue fédéré.
    • TABLE_NAME : nom de la table dans le catalogue fédéré.
    • CATALOG_NAME : nom du catalogue Spark local (par exemple, my_catalog).
    • PYSPARK_FILE : chemin d'accès gs:// Cloud Storage vers votre fichier d'application PySpark.
    • REGION : région de la charge de travail par lot Managed Service pour Apache Spark.
    • RUNTIME_VERSION : version d'exécution de Managed Service pour Apache Spark, par exemple 2.3.
    • PROJECT_ID: projet facturé pour l'utilisation du point de terminaison du catalogue REST Apache Iceberg.
    • FEDERATED_CATALOG_NAME : nom du catalogue fédéré.
    • IO_IMPL : implémentation FileIO correspondant à votre stockage sous-jacent.

    Paramètres de configuration Spark

    Le tableau suivant répertorie les paramètres courants requis pour toutes les connexions :

    Paramètre Description
    spark.sql.defaultCatalog Nom du catalogue par défaut (par exemple, CATALOG_NAME).
    spark.sql.catalog.CATALOG_NAME Classe d'implémentation du catalogue. Définissez la valeur sur org.apache.iceberg.spark.SparkCatalog.
    spark.sql.catalog.CATALOG_NAME.type Type de backend du catalogue. Définissez la valeur sur rest pour le catalogue REST Iceberg.
    spark.sql.catalog.CATALOG_NAME.uri URI du point de terminaison du catalogue REST. Définissez la valeur sur https://biglake.googleapis.com/iceberg/v1/restcatalog.
    spark.sql.catalog.CATALOG_NAME.warehouse Chemin d'accès à l'emplacement de l'entrepôt pour le catalogue fédéré. Définissez la valeur sur bl://projects/PROJECT_ID/catalogs/FEDERATED_CATALOG_NAME.
    spark.sql.catalog.CATALOG_NAME.header.x-goog-user-project ID du projet Google Cloud utilisé pour la facturation et l'attribution des quotas. Définissez la valeur sur PROJECT_ID.
    spark.sql.extensions Extensions de session Spark pour la syntaxe et les fonctionnalités SQL Iceberg. Définissez la valeur sur org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions.

    Le tableau suivant répertorie les paramètres d'authentification :

    Paramètre Description
    spark.sql.catalog.CATALOG_NAME.rest.auth.type Classe du gestionnaire d'authentification personnalisé. Définissez la valeur sur org.apache.iceberg.gcp.auth.GoogleAuthManager pour l'authentification par flux OAuth.
    spark.sql.catalog.CATALOG_NAME.oauth2-server-uri URI du point de terminaison du serveur de jetons OAuth2. Définissez la valeur sur https://oauth2.googleapis.com/token pour l'authentification par jeton d'accès personnel.
    spark.sql.catalog.CATALOG_NAME.token Jeton du porteur ou jeton d'accès personnel. Généralement défini sur $(gcloud auth application-default print-access-token) pour l'authentification par jeton d'accès personnel.

    Le tableau suivant répertorie les paramètres uniques en fonction de votre fournisseur de stockage (IO_IMPL) :

    Stockage spark.sql.catalog.CATALOG_NAME.io-impl Remarques
    Amazon S3 org.apache.iceberg.aws.s3.S3FileIO Nécessite la distribution des identifiants (X-Iceberg-Access-Delegation=vended-credentials) si elle est activée.
    Paramètre supplémentaire : spark.sql.catalog.CATALOG_NAME.s3.region (pour obtenir la liste des régions, consultez Points de terminaison et quotas Amazon S3).
    Google Cloud Storage org.apache.iceberg.gcp.gcs.GCSFileIO Paramètre supplémentaire : spark.sql.catalog.CATALOG_NAME.gcs.oauth2.refresh-credentials-endpoint=https://oauth2.googleapis.com/token.
    Azure Blob Storage org.apache.iceberg.azure.adlsv2.ADLSFileIO Aucun paramètre de stockage supplémentaire n'est requis.

    Pour Snowflake, vous pouvez rencontrer des problèmes lors de l'interrogation des colonnes STRING, car elles sont automatiquement optimisées pour le stockage. Pour résoudre ce problème, utilisez l'une des deux méthodes ci-dessous :

    • Option 1 : Désactiver la vectorisation dans Spark : ajoutez les propriétés de configuration Spark suivantes à l'indicateur --properties :
    • spark.sql.iceberg.vectorization.enabled=false
    • spark.sql.catalog.CATALOG_NAME.table-override.read.parquet.vectorization.enabled=false

    • Option 2 : Modifier la règle de sérialisation dans Snowflake : définissez la règle de sérialisation du stockage sur COMPATIBLE pour la table dans Snowflake.

Étape suivante