使用 lambda 函数通过 s3 存储桶将巨大的 .csv 文件上传到 dynamodb 时出错

Posted

技术标签:

【中文标题】使用 lambda 函数通过 s3 存储桶将巨大的 .csv 文件上传到 dynamodb 时出错【英文标题】:Error while uploading a huge .csv file to dynamodb through s3 bucket using lambda function 【发布时间】:2021-01-28 19:37:53 【问题描述】:

我的功能是

导入 boto3 导入 csv s3 = boto3.client('s3') dynamodb = boto3.resource('dynamodb')

def lambda_handler(事件,上下文):

bucket='bucketname'
file_name='filename.csv'
obj = s3.get_object(Bucket=bucket,Key=file_name)
rows = obj['Body'].read()
lines = rows.splitlines()
# print(lines)
reader = csv.reader(lines)
parsed_csv = list(reader)
num_rows = (len(parsed_csv))
table = dynamodb.Table('table_name')
with table.batch_writer() as batch:
    for i in range(1,num_rows):
        Brand_Name= parsed_csv[i][0]
        Assigned_Brand_Name= parsed_csv[i][1]
        Brand_URL= parsed_csv[i][2]
        Generic_Name= parsed_csv[i][3]
        HSN_Code= parsed_csv[i][4]
        GST_Rate= parsed_csv[i][5]
        Price= parsed_csv[i][6]
        Dosage= parsed_csv[i][7]
        Package= parsed_csv[i][8]
        Size= parsed_csv[i][9]
        Size_Unit= parsed_csv[i][10]
        Administration_Form= parsed_csv[i][11]
        Company= parsed_csv[i][12]
        Uses= parsed_csv[i][13]
        Side_Effects= parsed_csv[i][14]
        How_to_use= parsed_csv[i][15]
        How_to_work= parsed_csv[i][16]
        FAQs_Downloaded= parsed_csv[i][17]
        Alternate_Brands= parsed_csv[i][18]
        Prescription_Required= parsed_csv[i][19]
        Interactions= parsed_csv[i][20]


        batch.put_item(Item=
            'Brand Name':Assigned_Brand_Name 
             'Brand URL':Brand_URL,
             'Generic Name':Generic_Name,
             'Price':Price,
             'Dosage':Dosage,
             'Company':Company,
             'Uses':Uses,
             'Side Effects':Side_Effects,
             'How to use':How_to_use,
             'How to work':How_to_work,
             'FAQs Downloaded?':FAQs_Downloaded,
             'Alternate Brands':Alternate_Brands,
             'Prescription Required':Prescription_Required,
             'Interactions':Interactions



            
        )

回应: “errorMessage”:“2020-10-14T11:40:56.792Z ecd63bdb-16bc-4813-afed-cbf3e1fa3625 任务在 3.00 秒后超时”

【问题讨论】:

这里我正在处理 21 列和 7000 行数据。 我以同样的方式使用批处理写入器,我没有遇到任何问题。如果您有权访问 cloudtrail,则可以从 ecd63bdb-16bc-4813-afed-cbf3e1fa3625 获得更多信息。我建议的一种方法是尽可能使用生成器。例如,我会直接使用for row in parsed_csv,而不是for i in range(1,num_rows):。或者for row in csv.reader(obj['Body']),尤其是知道记录很大。 【参考方案1】:

您尚未指定 CSV 文件有多少行。 “巨大”非常主观,因此您的任务可能由于 DynamoDB 表的限制而超时。

如果您在要加载的表上使用预置容量,请确保分配了足够的容量。如果您使用的是按需容量,那么这可能是由于表需要扩展时发生的按需分区。

无论哪种方式,您都可能希望为此类情况添加一些错误处理,并在超时时添加延迟,然后再重试和恢复。

需要记住的是,写入 Dynamo 始终占用 1 个 WCU,单个分区可以拥有的最大容量为 1000 个 WCU,因此随着写入吞吐量的增加,表可能会在后台进行多次拆分点播模式。对于预置模式,您必须首先分配足够的容量,否则您将被限制为每秒写入多少项目,无论您分配了多少写入容量。

【讨论】:

以上是关于使用 lambda 函数通过 s3 存储桶将巨大的 .csv 文件上传到 dynamodb 时出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 cloudformation 为 S3 存储桶启用 Lambda 函数

使用nodejs中的AWS Lambda函数上传音频文件

允许 lambda 函数访问 S3 存储桶但阻止外部 IP

[AWS][Serverless] 无服务器Serverless 图像缩略图应用

使用 CloudFormation 在 S3 存储桶中创建 Lambda 通知

使用 Bref Laravel Lambda 函数从 S3 执行 Listobjects 时出错