← R2 Data Catalog / r2-data-catalog
Удаление данных
Удаление данных из R2 Data Catalog или любого другого каталога Apache Iceberg должно выполняться в рамках транзакции через сам каталог. Удаление файлов метаданных или данных вручную может привести к повреждению каталога данных.
Автоматическое обслуживание таблиц
R2 Data Catalog может автоматически управлять операциями обслуживания таблиц, такими как истечение срока действия снимков и уплотнение. Эти непрерывные операции помогают снизить задержки и затраты на хранение.
- Истечение срока действия снимков: автоматически удаляет старые снимки и соответствующие неиспользуемые файлы данных. Это снижает как накладные расходы на метаданные, так и затраты на хранение.
- Компактизация: объединяет мелкие файлы данных в более крупные. Это оптимизирует производительность чтения и уменьшает количество файлов, читаемых при выполнении запросов.
Если автоматическое обслуживание не включено, эти операции придётся выполнять вручную.
Подробнее см. в обслуживание таблиц документация.
Примеры включения автоматического обслуживания таблиц в 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 256Дополнительные примеры смотрите в управление каталогами документация.
Ручное удаление данных
Вам нужно вручную удалить данные для:
- Соблюдение политик хранения данных, таких как GDPR или CCPA.
- Выборочное удаление на основе условной логики.
- Удаление устаревших файлов или файлов, на которые нет ссылок, которыми R2 Data Catalog не управляет.
Ниже приведены базовые примеры с использованием PySpark, но аналогичные операции можно выполнять и в других движках, совместимых с Iceberg. Инструкции по настройке PySpark см. в нашем пример или официальную документация PySpark ↗.
Удаление строк из таблицы
# 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'
""")Удаление таблиц и пространств имён
# 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")Операции ручного обслуживания
# 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')
)
""")О метаданных Apache Iceberg
Apache Iceberg использует многоуровневую структуру метаданных для эффективного управления данными таблицы. Ниже перечислены ключевые компоненты и структура файлов:
- metadata.json: файл JSON верхнего уровня, указывающий на текущий снимок
- snapshot-*: неизменяемое состояние таблицы на определенный момент времени
- manifest-list-*.avro: файл Avro со списком всех файлов манифеста для данного снимка
- manifest-file-*.avro: файл Avro, отслеживающий файлы данных и их статистику
- data-*.parquet: файлы Parquet, содержащие фактические данные таблицы
- Примечание: неизмененные файлы манифеста повторно используются в разных снимках
- metadata.json Файл метаданных - Указывает на текущий снимок
- Схема таблицы
- Спецификация партиционирования
- Порядок сортировки
- Снимки
- snapshot-3051729675574597004.avro Снимок 1 (исторический)
- manifest-list-abc123.avro Список манифестов
- manifest-file-001.avro Файл манифеста
- data-00001.parquet (10 MB, 50K строк)
- data-00002.parquet (12 MB, 60K строк)
- data-00003.parquet (11 MB, 55K строк)
- manifest-file-002.avro
- data-00004.parquet (9 MB, 45K строк)
- data-00005.parquet (10 MB, 50K строк)
- manifest-file-001.avro Файл манифеста
- manifest-list-abc123.avro Список манифестов
- snapshot-3051729675574597005.avro Снимок 2 (текущий)
- manifest-list-def456.avro Список манифестов
- manifest-file-001.avro (повторно использован из снимка 1)
- data-00001.parquet
- data-00002.parquet
- data-00003.parquet
- manifest-file-003.avro (новый)
- data-00006.parquet (11 MB, 53K строк)
- data-00007.parquet (10 MB, 51K строк)
- data-00008.parquet (12 MB, 58K строк)
- manifest-file-001.avro (повторно использован из снимка 1)
- manifest-list-def456.avro Список манифестов
- snapshot-3051729675574597004.avro Снимок 1 (исторический)
Что происходит при удалении
Apache Iceberg поддерживает два режима удаления: Copy-on-Write (COW) и Merge-on-Read (MOR). Оба варианта создают новый снимок и помечают старые файлы для удаления, но по-разному выполняют само удаление:
| Аспект | Copy-on-Write (COW) | Merge-on-Read (MOR) |
|---|---|---|
| Как работают удаления | Перезаписывает файлы данных без удаленных строк | Создаёт файлы удаления, помечающие строки для пропуска |
| Производительность запросов | Быстро (слияние не требуется) | Медленнее (требует слияния во время чтения) |
| Производительность записи | Медленнее (перезаписывает файлы данных) | Быстро (записываются только маркеры удаления) |
| Влияние на хранилище | Немедленно создаёт новые файлы данных | Со временем накапливает файлы удаления |
| Потребности в обслуживании | Истечение срока действия снимков | Истечение срока действия снимков и уплотнение (rewrite_data_files) |
| Подходит для | Нагрузки с преобладанием чтения | Нагрузки с большим количеством записи и частыми мелкими изменениями |
Распространённые операции удаления
Эти операции работают одинаково как для таблиц COW, так и для таблиц MOR:
| Операция | Что это делает | Данные удалены? | Обратимо? |
|---|---|---|---|
DELETE FROM |
Удаляет строки, соответствующие условию | Нет (помечено для очистки) | С помощью путешествия во времени1 |
DROP TABLE |
Удаляет таблицу из каталога | Нет | Да (если существуют файлы данных) |
DROP TABLE ... PURGE |
Удаляет таблицу и данные | Да | Нет |
expire_snapshots |
Удаляет устаревшие снимки и файлы | Да | Нет |
remove_orphan_files |
Удаляет файлы, на которые нет ссылок | Да | Нет |
Операции, специфичные для MOR
Для таблиц Merge-on-Read может потребоваться вручную применять удаления, чтобы сохранить производительность:
| Операция | Что это делает | Когда использовать |
|---|---|---|
rewrite_data_files (сжатие) |
Применяет удаления и объединяет файлы | Когда производительность запросов снижается из-за большого количества delete-файлов |
Дополнительные материалы
- Обслуживание таблиц - Подробнее об операциях автоматического обслуживания
- R2 Data Catalog - Обзор и руководство по началу работы
- Запрос данных - Запрос таблиц с помощью R2 SQL
- Обслуживание Apache Iceberg ↗ - Официальная документация Iceberg по обслуживанию таблиц
Сноски
-
Путешествие во времени доступно до
expire_snapshotsназывается ↩