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

3

我正在尝试使用以下代码从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 records:
         batch.put_item(Item=rec)

5
提醒任何查看此贴的人,无论出于何种原因,RK已更改了他的问题以符合John Rotenstein的答案,这使得此帖子阅读起来令人困惑。 - Marc Frame
1个回答

5
首先,您应该使用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也加载得非常快。因此,我想知道在加载大量数据时哪个更好。 - RK.
1
我不知道。试试两种方法,然后告诉我们你发现了什么! - John Rotenstein
示例代码仅使用范围来演示批处理中可以有多个项目。您的代码将在 with 中简单使用 for rec in records - John Rotenstein
不需要使用range。你的for循环更合适。 - John Rotenstein
批量导入和逐个导入的速度是相同的。 - Andrey Nikishaev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接