Лямбда с триггером DynamoDB для ключа раздела таблицы с более чем 500000 различных значений

В настоящее время мы разрабатываем таблицу Dynamodb для хранения определенных атрибутов файла. Есть 2 основных столбца

  1. Дата: - содержит дату в формате ГГММДД, например: -20190618.
  2. Имя файла: - xxxxxxxxxxx.json

В настоящее время ключом раздела является дата, а ключом сортировки - имя файла. Мы ожидаем около 500000 файлов с разными именами каждый день (со временем это число может увеличиваться). Имена файлов будут повторяться каждый день одинаково, т.е. типичная схема показана ниже.

Дата Имя файла 20190617 abcd.json 20190618 abcd.json

У нас есть серия запросов, основанная на дате и триггере Dynamodb. Запросы работают отлично. В настоящее время мы наблюдаем, что количество одновременных выполнений лямбда-выражения ограничено до 2, поскольку мы разбиваем по дате. Пытаясь улучшить параллелизм лямбда-выражения, мы нашли 2 решения.

1) Ссылаясь на следующую ссылку (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-sharding.html), одна идея - добавить фиксированное количество случайных суффиксов для поля даты, то есть (с 20190617.1 по 20190617.500) в разделите данные на 500 разделов по 1000 записей в каждом. Это обеспечит определенный уровень параллелизма, а также минимальные изменения в запросе.

2) Второй вариант - изменить разделение таблицы следующим образом: ключ раздела: - имя файла и ключ сортировки: - дата. В результате получится около 500000 разделов (которые могут увеличиваться). Для запроса по дате нам нужно будет добавить GSI, но мы добьемся большего параллелизма в Lambda.

мы не создали таблицу с 500000 разделов (которые могут увеличиваться). У любого человека есть такой опыт ... Если да, то прокомментируйте

Любая помощь приветствуется


person Sabarish Sathasivan    schedule 19.06.2019    source источник
comment
Как вы думаете, почему будет создано 500000 разделов?   -  person Kirk    schedule 19.06.2019
comment
За один день может быть 500000 файлов с разными именами   -  person Sabarish Sathasivan    schedule 19.06.2019
comment
Это не так. Разделы разделяются и расширяются в зависимости от размера раздела (10 ГБ) или пропускной способности. например В настоящее время каждый раздел может поддерживать 3000 операций ввода-вывода в секунду. Чтение составляет 1 IOPS, а запись - 3 IOPS. Если вы превысите эти 3000 операций ввода-вывода в секунду для любого раздела или предоставите больше емкости, чем могут обрабатывать текущие разделы, то за кулисами DynamoDB создаст необходимые разделы для обработки этой нагрузки.   -  person Kirk    schedule 19.06.2019


Ответы (2)


Кажется, у вас сложилось ошибочное впечатление, что между ключами разделов и разделами существует однозначное соответствие.

Это не тот случай.

Количество разделов зависит от размера стола и пропускной способности. Ключ раздела хешируется DDB, и данные хранятся в определенном разделе.

У вас может быть 100k ключей разделов и только один раздел.

Если вы выходите за пределы DDB, то да, вы можете получить только один ключ раздела в разделе ... но это не типично.

Белая книга DDB содержит некоторые подробности того, как работает DDB ...

person Charles    schedule 19.06.2019
comment
Большое спасибо. Этот документ вместе со следующей ссылкой - shinesolutions.com / 2016/06/27 / помогли развеять многие сомнения - person Sabarish Sathasivan; 20.06.2019

Разделение по имени файла не имеет большого смысла, если ваш шаблон доступа - запрос по дате.

Вместо этого идея увеличения количества разделов для каждой даты путем добавления суффикса кажется прекрасной. Но вместо добавления случайного суффикса вы можете подумать о добавлении стабильного суффикса на основе имени файла:

Вы можете использовать первую букву имени файла, чтобы получить около 30 разделов - при условии, что имена файлов случайны. Единственная проблема в том, что одна буква может быть более распространенной, чем другие, что дает искаженные подразделения.

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

Если у вас будет около 10000-50000 элементов на раздел, это, вероятно, будет здорово.

Надеюсь это поможет

person Mike Dinescu    schedule 19.06.2019
comment
Спасибо за ваши комментарии. Это помогает ... Один вопрос - таблица Dynamodb с ключом раздела FileName, хороший дизайн. В первый день будет одна запись на раздел, однако с течением времени данные будут расти - person Sabarish Sathasivan; 19.06.2019
comment
Если вы используете FileName в качестве ключа раздела, вы теряете возможность запроса по дате. Это имеет смысл только в том случае, если ваш шаблон доступа в основном основан на FileName. Так что ответ - это зависит .. - person Mike Dinescu; 19.06.2019