Как явные разделы таблиц в Databricks влияют на производительность записи? - PullRequest
0 голосов
/ 23 февраля 2019

У нас есть следующий сценарий:

  • У нас есть существующая таблица, содержащая ок.15 миллиардов записей.Он не был явно разделен при создании.
  • Мы создаем копию этой таблицы с разделами, надеясь на более быстрое время чтения для определенных типов запросов.
  • Наши таблицы находятся в облаке Databricks Cloud, имы используем Databricks Delta.
  • Обычно мы фильтруем по двум столбцам, один из которых является идентификатором сущности (350 000 различных значений), а один - датой, когда произошло событие (на данный момент 31 отдельное значение)., но увеличивается с каждым днем!).

Итак, при создании нашей новой таблицы мы запустили такой запрос:

CREATE TABLE the_new_table
USING DELTA
PARTITIONED BY (entity_id, date)
AS SELECT
  entity_id,
  another_id,
  from_unixtime(timestamp) AS timestamp,
  CAST(from_unixtime(timestamp) AS DATE) AS date
FROM the_old_table

Этот запрос выполнялся в течение 48 часов и подсчитывал,Мы знаем, что он делает успехи, потому что мы нашли около 250 тыс. Префиксов, соответствующих первому ключу раздела в соответствующем префиксе S3, и, конечно, в префиксах существуют большие файлы.

Однако мы 'У нас возникли некоторые трудности с отслеживанием того, сколько именно прогресса было достигнуто и как долго мы можем ожидать, что это займет.

Пока мы ждали, мы опробовали такой запрос:

CREATE TABLE a_test_table (
  entity_id STRING,
  another_id STRING,
  timestamp TIMESTAMP,
  date DATE
)
USING DELTA
PARTITIONED BY (date);

INSERT INTO a_test_table
SELECT
  entity_id,
  another_id,
  from_unixtime(timestamp) AS timestamp,
  CAST(from_unixtime(timestamp) AS DATE) AS date
FROM the_old_table
  WHERE CAST(from_unixtime(timestamp) AS DATE) = '2018-12-01'

Обратите внимание, что главное отличие в схеме новой таблицы заключается в том, что мы разбили раздел только на дату, а не на идентификатор объекта.Выбранная нами дата содержит почти ровно четыре процента данных старой таблицы, на которые я хочу указать, потому что она намного больше 1/31.Конечно, поскольку мы выбираем по единственному значению, которое оказывается тем же самым, на которое мы разбили раздел, мы фактически пишем только один раздел, по сравнению с, вероятно, сотнями тысяч или около того.

Создание этоготестовая таблица заняла 16 минут с использованием того же количества рабочих узлов, поэтому мы ожидаем (исходя из этого), что создание таблицы в 25 раз больше займет около 7 часов .

Этот ответ , по-видимому, частично подтверждает, что использование слишком большого количества разделов может вызвать проблему, но основные причины, по-видимому, сильно изменились за последние пару лет, поэтому мы стремимся понять, какими могут быть текущие проблемы;документы Databricks не были особенно освещены.

На основании опубликованных рекомендаций по скорости запросов для S3 кажется, что увеличение количества разделов (ключевых префиксов) должно улучшить производительность.Пагубные разделы кажутся нелогичными.

В итоге: мы ожидаем записать тысячи записей в каждый из тысяч разделов.Похоже, что сокращение количества разделов значительно сокращает время, необходимое для записи данных таблицы.Почему это так?Существуют ли общие рекомендации по количеству разделов, которые должны быть созданы для данных определенного размера?

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вы должны разделить ваши данные на date, потому что звучит так, будто вы постоянно добавляете данные с течением времени в хронологическом порядке.Это общепринятый подход к разделению данных временных рядов.Это означает, что вы будете писать в один раздел даты каждый день, и ваши предыдущие разделы даты не будут обновляться снова (хорошо).

Вы, конечно, можете использовать дополнительный ключ раздела, если ваш сценарий использования выигрывает отэто (то есть PARTITIONED BY (date, entity_id))

Секционирование по дате потребует, чтобы ваше чтение этих данных всегда было выполнено также по дате, чтобы получить наилучшую производительность.Если это не ваш вариант использования, то вам придется уточнить свой вопрос.

Сколько разделов?

Никто не может дать вам ответ о том, сколько разделов выследует использовать, потому что каждый набор данных (и кластер обработки) отличается.Чего вы хотите избежать, так это «искажения данных», когда одному работнику приходится обрабатывать огромные объемы данных, в то время как другие не работают.В вашем случае это произошло бы, например, если бы один clientid составлял 20% от вашего набора данных.Разделение по дате должно предполагать, что каждый день содержит примерно одинаковый объем данных, поэтому каждый работник одинаково занят.

Я не знаю конкретно о том, как Databricks записывает на диск, но в Hadoop мне бы хотелосьчтобы каждый рабочий узел записывал свою собственную файловую часть, и, следовательно, ваша производительность записи была параллельной на этом уровне.

0 голосов
/ 01 марта 2019

Я вообще не эксперт по данным, но надеюсь, что эти маркеры могут помочь

Количество разделов

Количество созданных разделов и файлов повлияет на производительностьВаша работа, несмотря ни на что, особенно с использованием s3 в качестве хранилища данных, однако это число файлов должно легко обрабатываться кластером с размером спуска

Динамический раздел

СуществуетОгромная разница между разделами динамически с помощью двух ключей вместо одного, позвольте мне попытаться рассмотреть это более подробно.

Когда вы динамически разбиваете данные, в зависимости от количества задач и размера данных, можно создать большое количество небольших файлов на раздел , это может (и, вероятно, будет)повлиять на производительность следующих заданий, которые потребуют использования этих данных, особенно если ваши данные хранятся в ORC, паркетном или любом другом столбцовом формате.Обратите внимание, что для этого потребуется только задание только для карты .

Проблема, описанная выше, решается по-разному, и является наиболее распространенной при консолидации файлов.Для этого данные перераспределяются с целью создания больших файлов.В результате потребуется перетасовка данных.

Ваши запросы

Для вашего первого запроса число разделов будет 350k * 31 (около 11 ММ!), Что очень большое, учитывая количество перемешивания изадача, необходимая для выполнения работы.

Для вашего второго запроса (который занимает всего 16 минут) количество требуемых задач и требуемых перетасовок намного меньше.

Количество разделов (перемешивание / сортировка / планирование задач / и т. Д.) И время выполнения вашей работы не имеют линейной зависимости, поэтому математика в этом случае не складывается.

Рекомендация

Я думаю, что вы уже получили это, вы должны разделить вашу работу etl на 31 один запрос, что позволит оптимизировать время выполнения

...