使用boto3将大量数据加载到Dynamodb的过程非常缓慢

时间:2019-04-19 13:13:17

标签: python-3.x amazon-web-services amazon-dynamodb boto3

我正在尝试使用EMR 5节点群集中的以下代码将超过2000万条记录加载到我的Dynamodb表中。但是,完全加载需要花费更多的时间。我要加载的海量数据要多得多,但是我想在几分钟内加载它。如何实现呢?

下面是我的代码。我只是更改了原始列名,所以要插入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 个答案:

答案 0 :(得分:2)

首先,您应该使用Amazon CloudWatch来检查是否达到表上配置的写入容量单位的限制。如果是这样,则可以至少在负载期间增加容量。

第二,代码正在创建一条记录的批处理,这并不是很有效。 batch_writer()可用于处理多个记录,例如batch_writer() documentation中的示例代码:

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

注意for循环在batch_writer()内部吗?这样,将多个记录存储在一个批次中。但是,您的代码示例具有for的{​​{1}} 外部,导致批处理大小为1。