AWS Lambda(Python)无法在S3中解压缩和存储文件

皮尔

目前,项目维护着S3存储桶,该存储桶包含一个1.5 GB的大型zip文件,其中包含.xpt和.sas7dbat文件。解压缩的文件大小为20 GB。

尝试解压缩文件并将相同的文件夹结构推送到S3

以下代码适用于小型zip文件,但不适用于大型Zip文件(1.5GB):

for obj in bucket.objects.all():
    #file_name = os.path.abspath(obj.key) # get full path of files
    key = urlparse(obj.key.encode('utf8'))
    obj = client.get_object(Bucket='my-zip-bucket', Key=obj.key)

    with io.BytesIO(obj["Body"].read()) as tf:
        # rewind the file
        tf.seek(0)

        with zipfile.ZipFile(tf, mode='r') as zipf:
            for file in zipf.infolist():
                fileName = file.filename
                putFile = client.put_object(Bucket='my-un-zip-bucket-', Key=fileName, Body=zipf.read(file))
                putObjects.append(putFile)

错误:内存大小:3008 MB使用的最大内存:3008 MB

我想验证一下:

  1. AWS-Lambda不是适合大文件的解决方案吗?
  2. 我应该使用其他库/方法,而不是读取内存中的所有内容吗?
加农多夫

有使用AWS Glue的无服务器解决方案!(弄清楚了,我差点死了)

此解决方案分为两个部分:

  1. Lambda函数,由S3在上载ZIP文件时触发,并创建GlueJobRun-将S3对象键作为参数传递给Glue。
  2. 一个将文件解压缩(在内存中!)并上传回S3的胶水作业。

请参阅下面的代码,该文件将ZIP文件解压缩并将内容放回同一存储桶(可配置)中。

如果有帮助,请投票:)

Lambda脚本(python3)调用名为YourGlueJob的Glue作业

import boto3
import urllib.parse

glue = boto3.client('glue')

def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    print(key)    
try:
    newJobRun = glue.start_job_run(
        JobName = 'YourGlueJob',
        Arguments = {
            '--bucket':bucket,
            '--key':key,
        }
        )
    print("Successfully created unzip job")    
    return key  
except Exception as e:
    print(e)
    print('Error starting unzip job for' + key)
    raise e         

AWS Glue作业脚本以解压缩文件

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME','bucket','key'],)

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

import boto3
import zipfile
import io
from contextlib import closing

s3 = boto3.client('s3')
s3r = boto3.resource('s3')

bucket = args["bucket"]
key = args["key"]

obj = s3r.Object(
    bucket_name=bucket,
    key=key
)

buffer = io.BytesIO(obj.get()["Body"].read())
z = zipfile.ZipFile(buffer)
list = z.namelist()
for filerr in list:
    print(filerr)
    y=z.open(filerr)
    arcname = key + filerr
    x = io.BytesIO(y.read())
    s3.upload_fileobj(x, bucket, arcname)
    y.close()
print(list)


job.commit()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Boot + AWS S3:无法删除存储桶中的文件

AWS Lambda Java:Lambda无法解压缩文件

在发布到AWS S3之前,如何压缩/ gzip我缩小的.js和.css文件?

AWS Lambda无法从S3获取文件

AWS Lambda错误:无法解压缩上传的文件

如何在AWS Lambda(python)中上传zip文件夹而不存储在S3中

在AWS Lambda上运行IronPDF-无法将二进制文件解压缩到/ tmp(.NET / C#)

AWS Lambda将列出文件版本控制中的S3存储桶对象和子目录

在AWS Glue中解压缩zip文件

使用AWS Lambda在S3中更改CSV文件

Python-无法将文件上传到AWS S3存储桶中的已定义文件夹

使用Jupyter Notebook中的PySpark从AWS EMR集群读取存储在AWS S3中的未压缩Shapefile

AWS Lambda函数循环s3存储桶中的所有文件

解压缩.zip文件并使用python和boto 3传输到s3存储桶

如何从AWS Lambda的s3存储桶中读取csv文件?

Dataproc无法解压缩AWS Kinesis压缩的.gz文件

AWS Lambda python函数可从S3解析json并将其存储在DynamoDB中

AWS Lambda:如何在S3存储桶中读取CSV文件,然后将其上传到另一个S3存储桶?

将文件从AWS Lambda(Python)中的多部分/表单数据上传到S3

如何使用C#压缩AWS S3存储桶中的目录

检查 AWS S3 存储桶中的文件数

Python 中的 AWS Lambda 将新文件复制到另一个 s3 存储桶

如何在 AWS lambda 函数执行期间在 AWS S3 存储桶中写入文件?

无法使用 Python 脚本和通配符将多个文件上传到 AWS S3

通过 Python 从 AWS S3 解压缩文件

如何使用 Lambda 和 Python 在 AWS s3 中读取和覆盖文件?

从 S3 解压缩文件并将其写回 S3 的 AWS Glue 作业

AWS:使用 lambda 函数读取 Amazon S3 存储桶中的所有文件

AWS Lambda 使用 Python,从 S3 Bucket 中获取 .json 文件数据并放入 DynamoDB