Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Introduzione ad Amazon S3 Tables e table bucket

By Swapnil BhoiteJan 18, 20254 min read

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

All'AWS re:invent 2024 è arrivato l'annuncio di Amazon S3 Tables: tabelle Apache Iceberg completamente gestite e ottimizzate per workloads analitici. Si tratta di tabelle in formato Iceberg con storage gestito, amministrabili tramite la API s3tables; per le operazioni sui dati è prevista l'integrazione con Apache Spark o con i servizi analitici AWS: Amazon EMR, Amazon Athena, Amazon Redshift, Amazon EMR, Amazon QuickSight e Amazon Data Firehose.

Generato con Amazon Bedrock

Per iniziare

Per prima cosa occorre creare un table bucket, dalla console oppure dall'AWS CLI; in questa fase si può abilitare l'integrazione del table bucket con i servizi analitici AWS citati in precedenza.

Console del table bucket S3

Una volta creato il table bucket, bisogna creare un namespace (immaginatelo come un database logico che conterrà più tabelle) all'interno del quale risiederanno le nostre tabelle.

aws s3tables create-namespace \
    --table-bucket-arn arn:aws:s3tables:us-east-1:111122223333:bucket/my-s3-table-bucket \
    --namespace my_first_namespace

aws s3tables create-table \
    --table-bucket-arn arn:aws:s3tables:us-east-1:111122223333:bucket/my-s3-table-bucket \
    --namespace my_first_namespace \
    --name my_first_table --format ICEBERG

Tabelle create nella console del table bucket

Il formato delle tabelle si basa sul framework Apache Iceberg: lo storage sottostante contiene sia i dati delle tabelle sia i relativi metadati. Con S3 Tables non bisogna preoccuparsi della manutenzione: se ne occupa Amazon S3, per migliorare le prestazioni delle vostre S3 Tables o dei vostri table bucket. Le opzioni di manutenzione comprendono compattazione dei file, gestione degli snapshot e rimozione dei file non referenziati. Sono tutte attive per impostazione predefinita ed è possibile modificarle o disattivarle tramite i file di configurazione della manutenzione. Si possono inoltre configurare i parametri del job di manutenzione con i valori più adatti alle proprie esigenze. Lo stato del job si verifica con la s3tables API.

aws s3tables get-table-maintenance-job-status \
   --table-bucket-arn="arn:aws:s3tables:us-east-1:111122223333:bucket/my-s3-table-bucket" \
   --namespace="mynamespace" \
   --name="testtable"

Prima di integrare le S3 Tables con i servizi analitici, occorre completare i prerequisiti.

Creiamo un nuovo catalogo per le S3 Tables

aws glue create-catalog --region us-east-1 --name s3tablescatalog --catalog-input '{ "CreateDatabaseDefaultPermissions":[], "CreateTableDefaultPermissions":[], "FederatedCatalog":{ "Identifier":"arn:aws:s3tables:us-east-1:111122223333:bucket/*", "ConnectionName":"aws:s3tables"} }'

Il catalogo verrà registrato in AWS LakeFormation; allo stesso modo, dalla console di LakeFormation potrete vedere il namespace e la tabella creati in precedenza (utilizzando il menu a discesa per selezionare il catalogo S3 Tables appena creato).

Integrazione con Amazon EMR

Ed eccoci alla parte più interessante: l'integrazione delle S3 Tables con i servizi AWS. Partiamo da Amazon EMR, creando un cluster EMR con Iceberg abilitato e Apache Spark. Poi accediamo al nodo primario del cluster via SSH.

Avviate la spark-shell

spark-shell \
--packages software.amazon.s3tables:s3-tables-catalog-for-iceberg-runtime:0.1.3 \
--conf spark.sql.catalog.s3tablesbucket=org.apache.iceberg.spark.SparkCatalog \
--conf spark.sql.catalog.s3tablesbucket.catalog-impl=software.amazon.s3tables.iceberg.S3TablesCatalog \
--conf spark.sql.catalog.s3tablesbucket.warehouse=arn:aws:s3tables:us-east-1:111122223333:bucket/my-s3-table-bucket \
--conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions

Spark-shell sul nodo primario di EMR

Verificate di aver seguito correttamente i prerequisiti previsti per l'integrazione. Per Amazon EMR è necessario associare la policy AmazonS3TablesFullAccess al ruolo EMR_EC2_DefaultRole e assegnare allo stesso ruolo i permessi LakeFormation a livello di catalogo, namespace e tabella.

spark.sql("CREATE NAMESPACE IF NOT EXISTS s3tablesbucket.my_first_namespace")

spark.sql(
""" CREATE TABLE IF NOT EXISTS s3tablesbucket.my_first_namespace.`example_table` (
    id INT,
    name STRING,
    value INT
)
USING iceberg """
)

spark.sql(
"""
    INSERT INTO s3tablesbucket.my_first_namespace.example_table
    VALUES
        (1, 'ABC', 100),
        (2, 'XYZ', 200)
""")

spark.sql(""" SELECT * FROM s3tablesbucket.my_first_namespace.example_table """).show()

Creazione di un nuovo namespace per il table bucket

Creazione, all'interno del namespace, di una nuova tabella basata sul table bucket

Interrogazione della tabella

Se avete dati di esempio in formato parquet su S3, potete leggerli, creare una S3 table corrispondente e interrogarla.

#Read the parequet file
val data_file = spark.read.parquet("s3://myBucket/prefix1/file.parquet")

#Create a new table
data_file.writeTo("s3tablesbucket.my_first_namespace.my_table").using("Iceberg").tableProperty ("format-version", "2").createOrReplace()

#Query the table we created
spark.sql(""" SELECT * FROM s3tablesbucket.my_first_namespace.my_table """).show()

Integrazione con Amazon Athena

Passiamo ora all'integrazione di questa tabella con Amazon Athena! Avendo già creato un catalogo per le S3 Tables, lo trovate nella sezione Data sources and catalogs della console Athena e, dal menu a discesa nell'editor, potete selezionare le S3 Tables.

A questo punto potete interrogare queste tabelle esattamente come fareste con le tabelle native del catalogo Glue in Athena.

Da notare che, essendo le S3 Tables gestite direttamente da S3, non si ha accesso alla location S3 sottostante e non è possibile interrogare i file di manifest, a differenza di quanto avviene interrogando i metadati delle tabelle Iceberg per le tabelle basate su Amazon Athena.

Riferimenti:

Amazon S3 Tables permette di creare tabelle logiche sui dati presenti in S3, archiviati in formato parquet per ottimizzare le prestazioni in lettura. Queste tabelle si basano sul formato Iceberg, che oltre a supportare le transazioni ACID consente di eseguire update, delete e insert, nonché query di tipo time-travel sui dati. Il tutto è gestito da Amazon S3, con i vantaggi tipici di S3 in termini di durabilità, scalabilità e prestazioni.

Se volete approfondire o siete interessati ai nostri servizi, contattateci pure: potete farlo da qui.