← R2 Data Catalog / r2-data-catalog
Mazání dat
Mazání dat z R2 Data Catalog nebo jakéhokoli katalogu Apache Iceberg vyžaduje, aby operace probíhaly formou transakce přímo přes katalog. Ruční mazání metadat nebo datových souborů přímo v úložišti může vést k poškození datového katalogu.
Automatická údržba tabulky
R2 Data Catalog dokáže automaticky spravovat operace údržby tabulek, jako je vypršení platnosti snímků a kompaktace. Tyto průběžné operace pomáhají udržovat nízkou latenci a náklady na úložiště.
- Vypršení platnosti snímků: Automaticky odstraňuje staré snímky a příslušné neodkazované datové soubory. Tím se snižuje jak režie metadat, tak náklady na úložiště.
- Komprimace: Slučuje malé datové soubory do větších. Tím se optimalizuje výkon čtení a snižuje počet souborů čtených při dotazech.
Pokud nepovolíte automatickou údržbu, musíte tyto operace provádět ručně.
Další informace najdete v údržba tabulek dokumentace.
Příklady zapnutí automatické údržby tabulek v R2 Data Catalog
# Enable automatic snapshot expiration for entire catalog
npx wrangler r2 bucket catalog snapshot-expiration enable my-bucket \
--older-than-days 30 \
--retain-last 5
# Enable automatic compaction for entire catalog
npx wrangler r2 bucket catalog compaction enable my-bucket \
--target-size 256Další příklady najdete v správa katalogů dokumentace.
Ruční mazání a odstraňování dat
Data je nutné ručně smazat pro:
- Dodržování zásad uchovávání dat, například GDPR nebo CCPA.
- Selektivní mazání na základě podmíněné logiky.
- Odstraňování zastaralých souborů nebo souborů bez odkazů, které R2 Data Catalog nespravuje.
Následují základní příklady s použitím PySpark, obdobné operace však lze provádět i pomocí jiných enginů kompatibilních s Iceberg. Konfiguraci PySpark najdete v naší příklad nebo oficiální Dokumentace PySpark ↗.
Mazání řádků z tabulky
# Creates new snapshots and marks old files for cleanup
spark.sql("""
DELETE FROM r2dc.namespace.table_name
WHERE column_name = 'value'
""")
# The following is effectively a TRUNCATE operation
spark.sql("DELETE FROM r2dc.namespace.table_name")
# For large deletes, use partitioned tables and delete entire partitions for faster performance:
spark.sql("""
DELETE FROM r2dc.namespace.table_name
WHERE date_partition < '2024-01-01'
""")Odstraňování tabulek a oborů názvů
# Removes table from catalog but keeps data files in R2 storage
spark.sql("DROP TABLE r2dc.namespace.table_name")
# ⚠️ DANGER: Permanently deletes all data files from R2
# This operation cannot be undone
spark.sql("DROP TABLE r2dc.namespace.table_name PURGE")
# Use CASCADE to drop all tables within the namespace
spark.sql("DROP NAMESPACE r2dc.namespace_name CASCADE")
# You will need to PURGE the tables before running CASCADE to permanently delete data files
# This can be done with a loop over all tables in the namespace
tables = spark.sql("SHOW TABLES IN r2dc.namespace_name").collect()
for row in tables:
table_name = row['tableName']
spark.sql(f"DROP TABLE r2dc.namespace_name.{table_name} PURGE")
spark.sql("DROP NAMESPACE r2dc.namespace_name CASCADE")Ruční operace údržby
# Remove old metadata and data files marked for deletion
# The following retains the last 5 snapshots and deletes files older than Nov 28, 2024
spark.sql("""
CALL r2dc.system.expire_snapshots(
table => 'r2dc.namespace_name.table_name',
older_than => TIMESTAMP '2024-11-28 00:00:00',
retain_last => 5
)
""")
# Removes unreferenced data files from R2 storage (orphan files)
spark.sql("""
CALL r2dc.system.remove_orphan_files(
table => 'namespace.table_name'
)
""")
# Rewrite data files with a target file size (e.g., 512 MB)
spark.sql("""
CALL r2dc.system.rewrite_data_files(
table => 'r2dc.namespace_name.table_name',
options => map('target-file-size-bytes', '536870912')
)
""")O metadatech Apache Iceberg
Apache Iceberg používá vrstvenou strukturu metadat pro efektivní správu dat tabulky. Zde jsou klíčové komponenty a struktura souborů:
- metadata.json: Soubor JSON na nejvyšší úrovni odkazující na aktuální snímek
- snapshot-*: Neměnný stav tabulky k danému okamžiku
- manifest-list-*.avro: Soubor Avro obsahující seznam všech souborů manifestu pro daný snímek
- manifest-file-*.avro: Soubor Avro sledující datové soubory a jejich statistiky
- data-*.parquet: Soubory Parquet obsahující skutečná data tabulky
- Poznámka: Nezměněné soubory manifestu se mezi snímky znovu využívají
- metadata.json Soubor metadat - Odkazuje na aktuální snímek
- Schéma tabulky
- Partition Spec
- Sort Order
- Snímky
- snapshot-3051729675574597004.avro Snímek 1 (historické)
- manifest-list-abc123.avro Manifest List
- manifest-file-001.avro Manifest File
- data-00001.parquet (10 MB, 50K řádků)
- data-00002.parquet (12 MB, 60K řádků)
- data-00003.parquet (11 MB, 55K řádků)
- manifest-file-002.avro
- data-00004.parquet (9 MB, 45K řádků)
- data-00005.parquet (10 MB, 50K řádků)
- manifest-file-001.avro Manifest File
- manifest-list-abc123.avro Manifest List
- snapshot-3051729675574597005.avro Snímek 2 (aktuální)
- manifest-list-def456.avro Manifest List
- manifest-file-001.avro (znovu použito ze snímku 1)
- data-00001.parquet
- data-00002.parquet
- data-00003.parquet
- manifest-file-003.avro (nové)
- data-00006.parquet (11 MB, 53K řádků)
- data-00007.parquet (10 MB, 51K řádků)
- data-00008.parquet (12 MB, 58K řádků)
- manifest-file-001.avro (znovu použito ze snímku 1)
- manifest-list-def456.avro Manifest List
- snapshot-3051729675574597004.avro Snímek 1 (historické)
Co se stane během mazání
Apache Iceberg podporuje dva režimy mazání: Kopírování při zápisu (COW) a Merge-on-Read (MOR). Oba vytvoří nový snímek a označí staré soubory k vyčištění, ale s mazáním nakládají odlišně:
| Aspekt | Kopírování při zápisu (COW) | Merge-on-Read (MOR) |
|---|---|---|
| Jak funguje mazání | Přepíše datové soubory bez smazaných řádků | Vytváří soubory pro mazání, které označují řádky k přeskočení |
| Výkon dotazů | Rychlé (slučování není potřeba) | Pomalejší (vyžaduje sloučení za běhu čtení) |
| Výkon zápisu | Pomalejší (přepisuje datové soubory) | Rychlé (zapisují se pouze značky mazání) |
| Dopad na úložiště | Okamžitě vytváří nové datové soubory | Postupem času hromadí soubory mazání |
| Potřeby údržby | Vypršení platnosti snímků | Vypršení platnosti snímků + kompaktace (rewrite_data_files) |
| Vhodné pro | Úlohy náročné na čtení | Zátěže náročné na zápis s častými drobnými změnami |
Běžné operace mazání
Tyto operace fungují stejně pro tabulky COW i MOR:
| Operace | Co dělá | Data smazána? | Vratné? |
|---|---|---|---|
DELETE FROM |
Odstraní řádky odpovídající podmínce | Ne (označeno k vyčištění) | Pomocí časového cestování1 |
DROP TABLE |
Odstraní tabulku z katalogu | Ne | Ano (pokud existují data files) |
DROP TABLE ... PURGE |
Odstraní tabulku a smaže data | Ano | Ne |
expire_snapshots |
Odstraňuje staré snímky a soubory | Ano | Ne |
remove_orphan_files |
Odstraní soubory bez odkazů | Ano | Ne |
Operace specifické pro MOR
U tabulek typu Merge-on-Read může být kvůli výkonu nutné mazání aplikovat ručně:
| Operace | Co dělá | Kdy použít |
|---|---|---|
rewrite_data_files (kompaktace) |
Uplatňuje mazání a slučuje soubory | Když výkon dotazů klesá kvůli velkému množství delete files |
Související zdroje
- Údržba tabulek - Přečtěte si o automatických operacích údržby
- R2 Data Catalog - Přehled a úvodní příručka
- Dotazování dat - Dotazování tabulek pomocí R2 SQL
- Údržba Apache Iceberg ↗ - Oficiální dokumentace Iceberg k údržbě tabulek
Poznámky pod čarou
-
Časové cestování dostupné do
expire_snapshotsse nazývá ↩