Lors d'AWS re:invent 2024, Amazon a publié une annonce au sujet d'Amazon S3 Tables, qui propose des tables Apache Iceberg entièrement gérées et optimisées pour les workloads analytiques. Ces tables s'appuient sur un stockage géré au format Iceberg, pilotable via l'API s3tables, et s'intègrent, pour les opérations sur les données, à Apache Spark ou aux services analytiques AWS — Amazon EMR, Amazon Athena, Amazon Redshift, Amazon EMR, Amazon QuickSight, Amazon Data Firehose.

Première étape : créer un table bucket, depuis la console ou via l'AWS CLI. Vous pouvez en profiter pour activer l'intégration de ce table bucket avec les services analytiques AWS cités plus haut.

Console S3 Table bucket
Une fois le table bucket créé, il vous reste à créer un namespace (à voir comme une base de données logique regroupant plusieurs tables) qui hébergera vos tables.
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
Tables créées dans la console table bucket
Le format des tables s'appuie sur le framework Apache Iceberg ; le stockage sous-jacent contient à la fois les données et leurs métadonnées. Avec les S3 tables, la maintenance ne vous concerne plus : Amazon S3 prend en charge des opérations de maintenance destinées à améliorer les performances de vos S3 tables et table buckets. Ces options couvrent la compaction des fichiers, la gestion des snapshots et la suppression des fichiers non référencés. Elles sont actives par défaut. Vous pouvez les modifier ou les désactiver via les fichiers de configuration de maintenance, ou encore ajuster les paramètres du job de maintenance selon vos besoins. Le statut du job se consulte via l'API s3tables.
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"Avant d'intégrer les S3 tables aux services analytiques, vous devez réaliser les étapes prérequises.
Créer un nouveau catalogue pour les 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"} }'Ce catalogue sera enregistré dans AWS LakeFormation. Vous y retrouverez également le namespace et la table créés plus tôt depuis la console LakeFormation (utilisez le menu déroulant pour sélectionner le catalogue S3 table créé ci-dessus).



Place maintenant à la partie la plus intéressante : l'intégration de ces S3 tables avec les services AWS. Commençons par Amazon EMR et provisionnons un cluster EMR compatible Iceberg avec Apache Spark. Connectez-vous ensuite au nœud principal du cluster en SSH.
Lancez le 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 sur le nœud principal EMR
Vérifiez que vous avez bien suivi les prérequis de l'intégration. Pour Amazon EMR, attachez la politique ``AmazonS3TablesFullAccess au rôle EMR_EC2_DefaultRole et accordez à ce même EMR_EC2_DefaultRole les permissions LakeFormation adéquates au niveau du catalogue, du namespace et de la table.
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()
Création d'un nouveau namespace pour le table bucket
Création d'une nouvelle table basée sur le table bucket à l'intérieur du namespace
Interrogation de la table
Si vous disposez d'un échantillon de données parquet sur S3, vous pouvez le lire, en faire une S3 table puis l'interroger.
#Read the parequet fileval data_file = spark.read.parquet("s3://myBucket/prefix1/file.parquet")
#Create a new tabledata_file.writeTo("s3tablesbucket.my_first_namespace.my_table").using("Iceberg").tableProperty ("format-version", "2").createOrReplace()
#Query the table we createdspark.sql(""" SELECT * FROM s3tablesbucket.my_first_namespace.my_table """).show()
Passons à l'intégration avec Amazon Athena. Le catalogue créé pour les S3 tables apparaît dans la rubrique Sources de données et catalogues de la console Athena ; il suffit alors d'utiliser le menu déroulant de l'éditeur pour afficher les s3 tables.


Vous pouvez ensuite interroger ces tables comme n'importe quelle table native du catalogue Glue dans Athena.

À noter : puisque les s3 tables sont gérées par S3, vous n'avez pas accès à l'emplacement de stockage S3 sous-jacent et ne pouvez pas interroger les fichiers manifest, contrairement à l'interrogation des métadonnées des tables Iceberg pour les tables Amazon Athena.
Amazon S3 tables vous permet de créer des tables logiques par-dessus vos données S3 stockées au format parquet, gage de performances de lecture optimales. Ces tables reposent sur le format Iceberg, qui prend en charge les transactions ACID et autorise les updates, deletes et inserts ainsi que les requêtes time-travel sur vos données. Le tout est géré par Amazon S3, avec à la clé la durabilité, la scalabilité et la performance habituelles de S3.
Pour en savoir plus ou découvrir nos services, n'hésitez pas à nous contacter ici.