Таблица Delta Lake (OSS) по EMR и S3 - вакуум занимает много времени без работы - PullRequest
2 голосов
/ 09 июля 2020

Я записываю много данных в Databricks Delta lake, используя версию с открытым исходным кодом, работающую на AWS EMR с S3 в качестве уровня хранения. Я использую EMRFS.

Для повышения производительности я время от времени сжимаю и очищаю таблицу следующим образом:

    spark.read.format("delta").load(s3path)
            .repartition(num_files)
            .write.option("dataChange", "false").format("delta").mode("overwrite").save(s3path)
    
    t = DeltaTable.forPath(spark, path)
    t.vacuum(24)

Затем он удаляет 100 КБ файлов из S3. Однако этап вакуумирования занимает очень много времени. В это время кажется, что задание неактивно, однако каждые ~ 5-10 минут будет появляться небольшая задача, указывающая, что задание активно и что-то делает. Starting from task 16

I've read through this post Искра: большая задержка между заданиями что, кажется, предполагает, что это может быть связано с паркетом? Но я не вижу никаких опций на стороне дельты для настройки каких-либо параметров.

1 Ответ

3 голосов
/ 11 июля 2020

Я также заметил, что команда Delta Vacuum довольно медленная. Разработчики с открытым исходным кодом, вероятно, ограничены в возможности делать AWS специфичных c оптимизаций в репо, потому что эта библиотека является кроссплатформенной (должна работать во всех облаках).

Я заметил, что вакуум даже медленный локально. Вы можете клонировать репозиторий Delta, запустить набор тестов на своем локальном компьютере и убедиться в этом сами.

Удаление сотен тысяч файлов, хранящихся в S3, происходит медленно, даже если вы используете AWS CLI . Вы должны посмотреть, сможете ли вы провести рефакторинг операции сжатия, чтобы создать меньше файлов, которые нужно очистить.

Предположим, ваша цель - создать файлы размером 1 ГБ. Возможно, у вас есть 15 000 файлов размером в один гигабайт и 20 000 файлов небольшого размера. Прямо сейчас ваша операция уплотнения перезаписывает все данные (поэтому все 35 000 исходных файлов необходимо очистить после сжатия). Попробуйте выполнить рефакторинг своего кода, чтобы сжать только 20 000 небольших файлов (так что операция вакуумирования должна удалить только 20 000 файлов).

Реальное решение - создать команду очистки, оптимизированную для AWS. Delta Lake должна работать со всеми популярными облаками и локальной файловой системой. Должно быть довольно легко создать библиотеку с открытым исходным кодом, которая читает журнал транзакций, определяет, какие файлы необходимо удалить, выполняет эффективный вызов API удаления файлов, а затем записывает запись в журнал транзакций, совместимую с Delta. Может быть, я сделаю это репо;)

Вот дополнительная информация о команде вакуума . В качестве примечания вы можете использовать coalesce вместо repartition при уплотнении, , как описано здесь .

EDIT: Delta issue: https://github.com/delta-io/delta/issues/395 и PR: https://github.com/delta-io/delta/pull/416

...