Загрузка больших данных в Dynamodb очень медленная с использованием boto3 - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь загрузить более 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 Ответ

2 голосов
/ 20 апреля 2019

Во-первых, вы должны использовать 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(), в результате чего размер пакета равен единице.

...