Je souhaite migrer mes tables hors lac de données vers des tables Apache Iceberg.
Brève description
Une architecture de lac de données robuste vous permet de regrouper vos différentes sources de données à un emplacement unique pour y accéder facilement. Vous pouvez ensuite utiliser les outils de gestion des données et les transactions ACID d'un système d'entrepôt de données traditionnel pour réduire les coûts.
Résolution
Les tables Iceberg prennent en charge deux types de migration : la migration sur place et la migration miroir. Pour plus d'informations, consultez la section Migration sur place et migration miroir sur le site Web d'Iceberg.
Initialiser une session Apache Spark avec la configuration Iceberg
Créez un nouveau bloc-notes dans AWS Glue. Assurez-vous d'utiliser le rôle AWS Identity and Access Management (IAM) avec les autorisations appropriées lorsque vous créez le bloc-notes.
Procédez comme suit :
- Connectez-vous à la console AWS Glue.
- Créez un bloc-notes Glue et configurez les paramètres suivants :
%glue_version 4.0
%idle_timeout 60
%number_of_workers 5
%worker_type G.1X
%%configure
{
"--conf": "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
"--datalake-formats": "iceberg"
}
from pyspark.sql import SparkSession
spark = SparkSession.builder \
.config(f"spark.sql.catalog.glue_catalog", "org.apache.iceberg.spark.SparkCatalog") \
.config(f"spark.sql.catalog.glue_catalog.warehouse","s3://bucket_name/prefix/") \
.config(f"spark.sql.catalog.glue_catalog.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
.config(f"spark.sql.catalog.glue_catalog.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") \
.getOrCreate()
Utiliser la migration sur place pour déplacer des tables ne faisant pas partie du lac de données
La migration sur place laisse les fichiers de données de la table source tels quels, puis les ajoute à la nouvelle table Iceberg. Le processus crée uniquement les métadonnées de la table cible. Toute erreur survenant au cours de la migration nécessite uniquement une réécriture des métadonnées et non une réécriture des fichiers de données proprement dits.
Pour migrer la table, procédez comme suit :
Remarque : Utilisez add_files pour les données Parquet.
-
Créez une table Iceberg vide ayant la même structure que celle de la table source.
query = f"""
CREATE TABLE IF NOT EXISTS glue_catalog.dbname.target_iceberg_tablename USING iceberg LOCATION 's3://bucket_name/prefix/' AS
SELECT * FROM dbname.source_tablename LIMIT 0
"""
spark.sql(query)
-
Exécutez la procédure add_files :
query = f"""
CALL glue_catalog.system.add_files(table => 'dbname.target_iceberg_tablename', source_table => 'dbname.source_tablename')
"""
spark.sql(query).show(truncate=False)
-
Vérifiez que les fichiers de données pointent toujours vers les fichiers de données précédents à l'emplacement source. Seuls les fichiers de métadonnées créés au nouvel emplacement appartiennent à la table Iceberg :
query = f"""
SELECT file_path FROM glue_catalog.dbname.target_iceberg_tablename.files
"""
spark.sql(query).show(10, truncate=False)
Utiliser la migration miroir pour déplacer des tables qui ne sont pas des lacs de données
Le processus de migration miroir reformule les données de la table source. Vous pouvez valider les données lors de la migration. Vous pouvez également tester différentes configurations en créant une nouvelle table pour chaque configuration.
Pour éviter toute collision, ce type de migration place les fichiers de données cible à un emplacement différent de celui des fichiers de données source. Le processus vous permet également d'utiliser la restauration et de supprimer la table cible afin de résoudre rapidement tout problème.
Pour migrer la table, procédez comme suit :
-
Créez une table Iceberg avec les données de la table existante :
query = f"""
CREATE TABLE IF NOT EXISTS glue_catalog.dbname.target_iceberg_tablename USING iceberg LOCATION 's3://bucket_name/prefix/' AS
SELECT * FROM dbname.source_tablename
"""
spark.sql(query).show(truncate=False)
-
Vérifiez que les fichiers de données ont été migrés vers le nouvel emplacement. Les fichiers de métadonnées qui ont été créés au nouvel emplacement appartiennent à la table Iceberg :
query = f"""
SELECT file_path FROM glue_catalog.dbname.target_iceberg_tablename.files
"""
spark.sql(query).show(10, truncate=False)
Informations connexes
Utilisation du cadre Iceberg dans AWS Glue