Utilizzo del framework Iceberg in AWS Glue - AWS Glue

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo del framework Iceberg in AWS Glue

AWS Glue 3.0 e versioni successive supportano il framework Apache Iceberg per i data lake. Iceberg fornisce un formato di tabella ad alte prestazioni che funziona proprio come una tabella SQL. Questo argomento descrive le funzionalità disponibili per l'utilizzo dei dati in AWS Glue durante il trasporto o l'archiviazione dei dati in una tabella Iceberg. Per ulteriori informazioni su Iceberg, consulta la documentazione ufficiale di Apache Iceberg.

È possibile usare AWS Glue per eseguire operazioni di lettura e scrittura sulle tabelle Iceberg in Amazon S3 o lavorare con le tabelle Iceberg utilizzando il catalogo dati AWS Glue. Sono supportate anche operazioni aggiuntive, tra cui inserimenti e tutte le query Spark e scritture Spark. L'aggiornamento non è supportato per le tabelle Iceberg.

Nota

ALTER TABLE … RENAME TO non è disponibile per Apache Iceberg 0.13.1 per AWS Glue 3.0.

La tabella seguente elenca la versione di Iceberg inclusa in ogni versione di AWS Glue.

Versione di AWS Glue Versione Iceberg supportata
5.0 1.7.1
4.0 1.0.0
3.0 0.13.1

Per ulteriori informazioni sui framework di data lake supportati da AWS Glue, consulta Utilizzo di framework data lake con processi ETL di AWS Glue.

Abilitazione del framework Iceberg

Per abilitare Iceberg per AWS Glue, completa le seguenti attività:

  • Specifica iceberg come valore per i parametri del processo --datalake-formats. Per ulteriori informazioni, consulta Utilizzo dei parametri del processo nei processi AWS Glue.

  • Crea una chiave denominata --conf per il tuo processo AWS Glue e impostala sul seguente valore. In alternativa, puoi impostare la seguente configurazione usando SparkConf nel tuo script. Queste impostazioni consentono ad Apache Spark di gestire correttamente le tabelle Iceberg.

    spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.catalog.glue_catalog=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.glue_catalog.warehouse=s3://<your-warehouse-dir>/ --conf spark.sql.catalog.glue_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.glue_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO

    Se si sta leggendo da o scrivendo su tabelle Iceberg registrate con Lake Formation, seguire le indicazioni contenute Utilizzo di AWS Glue with AWS Lake Formation per un controllo degli accessi a grana fine in AWS Glue 5.0 e versioni successive. In AWS Glue 4.0, aggiungere la seguente configurazione per abilitare il supporto di Lake Formation.

    --conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true --conf spark.sql.catalog.glue_catalog.glue.id=<table-catalog-id>

    Se utilizzi AWS Glue 3.0 con Iceberg 0.13.1, devi impostare le seguenti configurazioni aggiuntive per utilizzare il gestore blocchi di Amazon DynamoDB per garantire la transazione atomica. AWS Glue 4.0 e le versioni successive utilizzano il blocco ottimistico per impostazione predefinita. Per ulteriori informazioni, consulta Integrazioni di AWS Iceberg nella documentazione ufficiale di Apache Iceberg.

    --conf spark.sql.catalog.glue_catalog.lock-impl=org.apache.iceberg.aws.glue.DynamoLockManager --conf spark.sql.catalog.glue_catalog.lock.table=<your-dynamodb-table-name>

Utilizzo di una versione differente di Iceberg

Per utilizzare una versione di Iceberg non supportata da AWS Glue, specifica i tuoi file JAR Iceberg utilizzando il parametro del processo --extra-jars. Non includere iceberg come valore per il parametro --datalake-formats. Se si utilizza AWS Glue 5.0, è necessario impostare il parametro del processo --user-jars-first true.

Abilitazione della crittografia per le tabelle Iceberg

Nota

Le tabelle Iceberg dispongono di meccanismi propri per abilitare la crittografia lato server. È necessario abilitare questa configurazione oltre alla configurazione di sicurezza di AWS Glue.

Per abilitare la crittografia lato server sulle tabelle Iceberg, consulta le indicazioni contenute nella documentazione di Iceberg.

Aggiungere la configurazione Spark per Iceberg su più Regioni

Per aggiungere una configurazione Spark aggiuntiva per l'accesso alle tabelle su più Regioni di Iceberg con Catalogo dati AWS Glue e AWS Lake Formation, procedere nel seguente modo:

  1. Creare un punto di accesso multi-regione.

  2. Configurare le seguenti proprietà Spark:

    ----- --conf spark.sql.catalog.my_catalog.s3.use-arn-region-enabled=true \ --conf spark.sql.catalog.{CATALOG}.s3.access-points.bucket1", "arn:aws:s3::<account-id>:accesspoint/<mrap-id>.mrap \ --conf spark.sql.catalog.{CATALOG}.s3.access-points.bucket2", "arn:aws:s3::<account-id>:accesspoint/<mrap-id>.mrap -----

Esempio: scrittura di una tabella Iceberg su Amazon S3 e registrazione nel catalogo dati AWS Glue

Questo script di esempio dimostra come scrivere una tabella Iceberg su Amazon S3. L'esempio utilizza Integrazioni di AWS Iceberg per registrare la tabella nel catalogo dati AWS.

Python
# Example: Create an Iceberg table from a DataFrame # and register the table to Glue Data Catalog dataFrame.createOrReplaceTempView("tmp_<your_table_name>") query = f""" CREATE TABLE glue_catalog.<your_database_name>.<your_table_name> USING iceberg TBLPROPERTIES ("format-version"="2") AS SELECT * FROM tmp_<your_table_name> """ spark.sql(query)
Scala
// Example: Example: Create an Iceberg table from a DataFrame // and register the table to Glue Data Catalog dataFrame.createOrReplaceTempView("tmp_<your_table_name>") val query = """CREATE TABLE glue_catalog.<your_database_name>.<your_table_name> USING iceberg TBLPROPERTIES ("format-version"="2") AS SELECT * FROM tmp_<your_table_name> """ spark.sql(query)

In alternativa, è possibile scrivere una tabella Iceberg su Amazon S3 e catalogo dati tramite metodi Spark.

Prerequisiti: è necessario fornire un catalogo per l'utilizzo della libreria Iceberg. AWS Glue facilita l'utilizzo di Catalogo dati AWS Glue. Catalogo dati AWS Glue è preconfigurato per essere utilizzato dalle librerie Spark come glue_catalog. Le tabelle di Catalogo dati sono identificate da un databaseName e un tableName. Per ulteriori informazioni su Catalogo dati AWS Glue, consulta la pagina Rilevamento e catalogazione dei dati in AWS Glue.

Se non utilizzi Catalogo dati AWS Glue, dovrai fornire un catalogo tramite le API Spark. Per ulteriori informazioni, consulta la pagina Spark Configuration nella documentazione di Spark.

In questo esempio viene scritta una tabella Iceberg in Amazon S3 e il catalogo dati tramite Spark.

Python
# Example: Write an Iceberg table to S3 on the Glue Data Catalog # Create (equivalent to CREATE TABLE AS SELECT) dataFrame.writeTo("glue_catalog.databaseName.tableName") \ .tableProperty("format-version", "2") \ .create() # Append (equivalent to INSERT INTO) dataFrame.writeTo("glue_catalog.databaseName.tableName") \ .tableProperty("format-version", "2") \ .append()
Scala
// Example: Write an Iceberg table to S3 on the Glue Data Catalog // Create (equivalent to CREATE TABLE AS SELECT) dataFrame.writeTo("glue_catalog.databaseName.tableName") .tableProperty("format-version", "2") .create() // Append (equivalent to INSERT INTO) dataFrame.writeTo("glue_catalog.databaseName.tableName") .tableProperty("format-version", "2") .append()

Esempio: lettura di una tabella Iceberg da Amazon S3 tramite il catalogo dati AWS Glue

Questo esempio legge la tabella Iceberg che creata in Esempio: scrittura di una tabella Iceberg su Amazon S3 e registrazione nel catalogo dati AWS Glue.

Python

Per questo esempio, usa il metodo GlueContext.create_data_frame.from_catalog().

# Example: Read an Iceberg table from Glue Data Catalog from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) df = glueContext.create_data_frame.from_catalog( database="<your_database_name>", table_name="<your_table_name>", additional_options=additional_options )
Scala

Per questo esempio, utilizza il metodo getCatalogSource.

// Example: Read an Iceberg table from Glue Data Catalog import com.amazonaws.services.glue.GlueContext import org.apacke.spark.SparkContext object GlueApp { def main(sysArgs: Array[String]): Unit = { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) val df = glueContext.getCatalogSource("<your_database_name>", "<your_table_name>", additionalOptions = additionalOptions) .getDataFrame() } }

Esempio: inserimento di un DataFrame in una tabella Iceberg in Amazon S3 tramite il catalogo dati AWS Glue

Questo esempio inserisce i dati nella tabella Iceberg creata in Esempio: scrittura di una tabella Iceberg su Amazon S3 e registrazione nel catalogo dati AWS Glue.

Nota

Questo esempio consente di impostare il parametro del processo --enable-glue-datacatalog in modo da utilizzare il catalogo dati AWS Glue come metastore Apache Spark Hive. Per ulteriori informazioni, consulta Utilizzo dei parametri del processo nei processi AWS Glue.

Python

Per questo esempio, usa il metodo GlueContext.write_data_frame.from_catalog().

# Example: Insert into an Iceberg table from Glue Data Catalog from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) glueContext.write_data_frame.from_catalog( frame=dataFrame, database="<your_database_name>", table_name="<your_table_name>", additional_options=additional_options )
Scala

Per questo esempio, utilizza il metodo getCatalogSink.

// Example: Insert into an Iceberg table from Glue Data Catalog import com.amazonaws.services.glue.GlueContext import org.apacke.spark.SparkContext object GlueApp { def main(sysArgs: Array[String]): Unit = { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) glueContext.getCatalogSink("<your_database_name>", "<your_table_name>", additionalOptions = additionalOptions) .writeDataFrame(dataFrame, glueContext) } }

Esempio: lettura di una tabella Iceberg da Amazon S3 tramite Spark

Prerequisiti: è necessario fornire un catalogo per l'utilizzo della libreria Iceberg. AWS Glue facilita l'utilizzo di Catalogo dati AWS Glue. Catalogo dati AWS Glue è preconfigurato per essere utilizzato dalle librerie Spark come glue_catalog. Le tabelle di Catalogo dati sono identificate da un databaseName e un tableName. Per ulteriori informazioni su Catalogo dati AWS Glue, consulta la pagina Rilevamento e catalogazione dei dati in AWS Glue.

Se non utilizzi Catalogo dati AWS Glue, dovrai fornire un catalogo tramite le API Spark. Per ulteriori informazioni, consulta la pagina Spark Configuration nella documentazione di Spark.

In questo esempio viene letta una tabella Iceberg in Amazon S3 da Catalogo dati tramite Spark.

Python
# Example: Read an Iceberg table on S3 as a DataFrame from the Glue Data Catalog dataFrame = spark.read.format("iceberg").load("glue_catalog.databaseName.tableName")
Scala
// Example: Read an Iceberg table on S3 as a DataFrame from the Glue Data Catalog val dataFrame = spark.read.format("iceberg").load("glue_catalog.databaseName.tableName")

Esempio: lettura e scrittura della tabella Iceberg con il controllo delle autorizzazioni di Lake Formation

Questo esempio legge da e scrive su una tabella Iceberg con il controllo delle autorizzazioni di Lake Formation.

Nota

Questo esempio funziona solo con AWS Glue 4.0. In AWS Glue 5.0 e versioni successive, seguire le istruzioni riportate in Utilizzo di AWS Glue with AWS Lake Formation per un controllo degli accessi a grana fine.

  1. Crea una tabella Iceberg e registrala in Lake Formation:

    1. Per abilitare il controllo delle autorizzazioni di Lake Formation, devi prima registrare il percorso della tabella Amazon S3 su Lake Formation. Per ulteriori informazioni, consulta la pagina Registrazione di una posizione Amazon S3. Puoi registrarlo dalla console di Lake Formation o utilizzando la CLI AWS:

      aws lakeformation register-resource --resource-arn arn:aws:s3:::<s3-bucket>/<s3-folder> --use-service-linked-role --region <REGION>

      Una volta registrata una posizione Amazon S3, qualsiasi tabella AWS Glue che punta alla posizione, o a una delle sue sedi secondarie, restituirà il valore del parametro IsRegisteredWithLakeFormation come true nella chiamata GetTable.

    2. Crea una tabella Iceberg che punti al percorso registrato tramite Spark SQL:

      Nota

      Di seguito vengono mostrati gli esempi Python.

      dataFrame.createOrReplaceTempView("tmp_<your_table_name>") query = f""" CREATE TABLE glue_catalog.<your_database_name>.<your_table_name> USING iceberg AS SELECT * FROM tmp_<your_table_name> """ spark.sql(query)

      Puoi anche creare la tabella manualmente tramite l'API CreateTable di AWS Glue. Per ulteriori informazioni, consulta Creazione di tabelle Apache Iceberg.

      Nota

      Attualmente, l'API UpdateTable non supporta il formato di tabella Iceberg come input per l'operazione.

  2. Concedi a Lake Formation l'autorizzazione per il ruolo IAM del processo. Puoi concedere le autorizzazioni dalla console di Lake Formation o utilizzando la CLI AWS. Per ulteriori informazioni, consulta: https://docs.aws.amazon.com/lake-formation/latest/dg/granting-table-permissions.html

  3. Leggi una tabella Iceberg registrata con Lake Formation. Il codice equivale a leggere una tabella Iceberg non registrata. Il ruolo IAM del processo AWS Glue deve disporre dell'autorizzazione SELECT affinché la lettura abbia esito positivo.

    # Example: Read an Iceberg table from the AWS Glue Data Catalog from awsglue.context import GlueContextfrom pyspark.context import SparkContext sc = SparkContext() glueContext = GlueContext(sc) df = glueContext.create_data_frame.from_catalog( database="<your_database_name>", table_name="<your_table_name>", additional_options=additional_options )
  4. Scrivi su una tabella Iceberg registrata con Lake Formation. Il codice equivale a scrivere su una tabella Iceberg non registrata. Il ruolo IAM del processo AWS Glue deve disporre dell'autorizzazione SUPER affinché la scrittura abbia esito positivo.

    glueContext.write_data_frame.from_catalog( frame=dataFrame, database="<your_database_name>", table_name="<your_table_name>", additional_options=additional_options )