Aws lambda 如何使用AWS Lambda解压和读取大型(1-10GB)压缩文件(gzip、zip、拼花)?

Aws lambda 如何使用AWS Lambda解压和读取大型(1-10GB)压缩文件(gzip、zip、拼花)?,aws-lambda,gzip,parquet,large-files,Aws Lambda,Gzip,Parquet,Large Files,类似的问题已经发布了好几次,但不是因为AWS Lambdas的内存、存储和寿命已经增加/改进,这可能会打开其他解决方案,所以我再次提问 我们在S3中有100 TB的数据,需要大规模读取文件以查找特定值。其中一些文件是用.zip、.gzip、Parquet等压缩的,大小可以是1-10gb或更大 出于安全和性能方面的考虑,我们正在考虑AWS Lambda,但我正在考虑如何处理这些大型压缩文件。我知道EC2或ECS在某些方面可能是一个更好的解决方案,但出于这个问题的目的,我只想讨论Lambdas的选项

类似的问题已经发布了好几次,但不是因为AWS Lambdas的内存、存储和寿命已经增加/改进,这可能会打开其他解决方案,所以我再次提问

我们在S3中有100 TB的数据,需要大规模读取文件以查找特定值。其中一些文件是用.zip、.gzip、Parquet等压缩的,大小可以是1-10gb或更大

出于安全和性能方面的考虑,我们正在考虑AWS Lambda,但我正在考虑如何处理这些大型压缩文件。我知道EC2或ECS在某些方面可能是一个更好的解决方案,但出于这个问题的目的,我只想讨论Lambdas的选项

Lambdas的寿命为15分钟,因此任何长时间运行的作业都是有问题的。有些文件可能太大,甚至无法在15分钟内从S3下载。其他的可以下载,然后可以在其他lambda中拆分以进行处理。但是许多压缩文件在解压之前无法拆分。一些压缩算法,如允许并行解压缩,但我们无法控制文件的编写方式,可以使用多种算法编写。通过读取页眉和页脚,可以将拼花地板文件分割成足够小的块,可以在不到15分钟的时间内可靠地读取,但对于大型.gzip文件,情况并非如此

如果文件被一个lambda解压并拆分,然后以某种方式发送或流式传输到其他车队,则原始lambda将超时,因此未压缩的数据必须存储在某个地方。这将需要从无状态体系结构转移到有状态体系结构,在这种体系结构中,未压缩的数据必须写入EFS之类的地方。这使体系结构复杂化,并减轻了无服务器的一些安全好处,因为数据存储更持久。lambda基本上是在数据的解压缩副本上操作的,临时操作直到处理完成并且可以删除它们,就像解压缩的本地缓存一样

即便如此,解压缩一个巨大的文件可能需要15分钟以上的时间,而您通常无法在中途完成部分解压缩。解压缩一个巨大的文件需要大量的存储,至少是暂时的,以及相关的成本。我们可能只是将压缩文件复制到EFS中,如果需要的话,分块进行,然后从那里解压,但即使这样,超过一定大小的文件也无法以这种方式解压


我们可以简单地排除超过一定大小的文件,但我正在尝试思考是否有我没有考虑过的选项。

我建议使用Athena进行转换,并使用Lambda和可能的步骤函数来协调该过程

我认为您不应该在Lambda上构建自己的map/reduce平台,这将需要大量的工作,而且它也不是完成这项工作的最佳工具。然而,Lambda是控制其他AWS服务的一种很好的方式

Athena有一个名为(createtableas的缩写)的功能,可用于使用SQL将数据集转换为新的数据集。新的数据集可以是雅典娜支持的任何文件格式,包括拼花地板

您可以做的是为现有的“原始”数据创建表,然后运行CTAS操作以获得新的干净和列数据集。完成后,您可以扔掉Athena表,它们只是元数据——删除Athena表会将数据保留在S3上

由于转换几GB可能需要相当长的时间,因此您可能希望查看阶跃函数,以避免在Athena工作时必须使Lambda函数处于空闲状态。您可以创建一个状态机,其中一个步骤通过设置原始表启动转换,并生成CTAS SQL,然后使用等待步骤轮询完成,最后一个步骤清理并通知转换已完成


不幸的是,ZIP文件存在一个问题:Athena不支持ZIP存档(它支持压缩文件,但ZIP和TAR一样都是存档格式)。在转换之前,您必须解压缩档案。这在Lambda中也应该可以实现,但您需要一个好的库,它允许您在不必将整个ZIP复制到Lambda环境中的情况下实现这一点,因为这可能会耗尽内存和磁盘空间。

我不认为Lambda是一种可行的方法。如果您不想走EC2路线,请查看。你有一个工作流程,这就是他们真正的目的。最长运行时间为1年。我不清楚如何使用step函数协调lambdas,以缓解或解决与lambdas 15分钟寿命相关的问题?@UncleLongHair请参阅我对您在我的答案下有关step函数如何帮助的评论的评论。问题是,在一定大小以上,读取文件所花费的时间超过lambda的使用寿命。假设我有一个500GB的拼花地板文件,需要60分钟阅读。lambda只能活15分钟。如果我用CTA创建一个雅典娜数据集,我仍然需要将相同的数据读入相同的Lambda。即使雅典娜的速度是原来的两倍,lambda仍然会在它完成读取之前消失。在查询运行时,你的lambda不需要运行,这就是在编排中使用步骤函数的美妙之处。该函数启动查询,然后使用步骤函数轮询是否完成,并在查询完成时调用另一个函数。由于我编写了我的答案步骤函数,它甚至获得了Athena的原生支持,因此您可以直接作为步骤启动查询:也许我最初的问题中不清楚,但基本任务是读取文件的内容以查找某些值。所以每个文件的每个字节都必须通过regex/ML/lookup逻辑读取和运行,而不仅仅是一个m