Загрузка огромных данных в Dynamodb происходит очень медленно с использованием boto3

#python-3.x #amazon-web-services #amazon-dynamodb #boto3

#python-3.x #amazon-веб-сервисы #amazon-dynamodb #boto3

Вопрос:

Я пытаюсь загрузить более 20 миллионов записей в свою таблицу Dynamodb, используя приведенный ниже код из кластера EMR 5 узлов. Но для полной загрузки требуется больше часов и часов. У меня гораздо больше данных для загрузки, но я хочу загрузить их в течение нескольких минут. Как этого добиться?

Ниже приведен мой код. Я только что изменил исходные имена столбцов, и мне нужно вставить 20 столбцов. Здесь проблема с медленной загрузкой.

 import boto3
import json
import decimal

dynamodb = boto3.resource('dynamodb','us-west')
table = dynamodb.Table('EMP')

s3 = boto3.client('s3')
obj = s3.get_object(Bucket='mybucket', Key='emp-rec.json')
records = json.loads(obj['Body'].read().decode('utf-8'), parse_float = decimal.Decimal)

with table.batch_writer() as batch:
     for rec in rows:
         batch.put_item(Item=rec)
 

Комментарии:

1. предупреждение для всех, кто просматривает это, по какой-либо причине РК изменил свой вопрос, чтобы он соответствовал ответу Джона Ротенштейна, что делает этот пост запутанным для чтения.

Ответ №1:

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

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

 with table.batch_writer() as batch:
    for _ in xrange(1000000):
        batch.put_item(Item={'HashKey': '...',
                             'Otherstuff': '...'})
 

Обратите внимание, как for цикл находится внутри batch_writer() ? Таким образом, несколько записей хранятся в одном пакете. Однако ваш пример кода имеет for внешний вид batch_writer() , что приводит к размеру пакета, равному единице.

Комментарии:

1. Да, конечно! Большое спасибо за ваш ответ. Я попробую рекомендуемое изменение. Между тем, я обнаружил, что BatchWriteItemInput также загружается очень быстро. Итак, я хотел бы знать, что здесь лучше при загрузке огромных данных.

2. Я не знаю. Попробуйте их оба и дайте нам знать, что вы найдете!

3. Пример кода просто использует диапазон, чтобы продемонстрировать, что у вас может быть много элементов в пакете. Ваш код будет просто использоваться for rec in records внутри with .

4. Нет необходимости использовать диапазон. Ваш for цикл более подходит.

5. скорость пакетного импорта и по одному за раз одинакова (