我正在尝试使用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)
答案 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。