【发布时间】:2020-03-04 06:39:49
【问题描述】:
我正在尝试加快将存储在 AWS S3 存储桶中的 JSON 文件中包含的记录传输到 AWS DynamoDB 表的速度。 JSON 文件中的记录存储为[{'id':'123', 'name':'abc'}, {'id':'456','name':'def'}, ...] 形式的字典列表。为了执行记录传输,我在 Boto3 中使用table.batch_writer()。此代码包含在 AWS Lambda 脚本中,这样当 S3 存储桶填充新的 JSON 对象时,记录传输就会开始。我发现即使为 AWS Lambda 设置了最大超时(15 分钟),put_item() 操作也没有针对所有记录完成,平均约为 40K。 put_item() 操作看起来非常慢,这让我认为这不是将记录从 S3 传输到 DynamoDB 的最佳方式。
有没有更快的方法将 JSON 记录从 S3 存储桶传输到 DynamoDB 表?
import json
import boto3
s3_client = boto3.client('s3')
dynamodb = boto3.resource('dynamodb',region_name='us-east-2')
def lambda_handler(event, context, verbose=True):
bucket = event['Records'][0]['s3']['bucket']['name']
json_filename = event['Records'][0]['s3']['object']['key']
json_object = s3_client.get_object(Bucket=bucket, Key=json_filename)
json_file = json_object['Body'].read()
data_dict = json.loads(json_file)
table = dynamodb.Table('the_dynamodb_table_name')
with table.batch_writer() as batch:
for rec in data_dict:
batch.put_item(Item=rec)
【问题讨论】:
-
您如何衡量
put_item操作存在问题?如果您为 Lambda 设置了低内存,那么 CPU 可能是一个问题(解析和序列化 JSON-s 可能不会那么快)。您也可以尝试创建多个 boto 会话并并行运行多个 batch_writers。 -
“所有记录”有多少条?
标签: python amazon-s3 aws-lambda amazon-dynamodb boto3