带有 spark 库的 AWS Lambda 给出了 OutOfMemoryError

AWS Lambda with spark library gives OutOfMemoryError

我正在尝试在我的 aws lambda 中使用以下 spark 库:

implementation "org.apache.spark:spark-core_2.12:2.4.6"
implementation "org.apache.spark:spark-sql_2.12:2.4.6"

I 运行 Lambda 初始内存:576 MB,然后是 1024 MB。两次都失败了:

Metaspace: java.lang.OutOfMemoryError java.lang.OutOfMemoryError: Metaspace
Exception in thread "main" java.lang.Error: java.lang.OutOfMemoryError: Metaspace
at lambdainternal.AWSLambda.<clinit>(AWSLambda.java:65)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at lambdainternal.LambdaRTEntry.main(LambdaRTEntry.java:150)
Caused by: java.lang.OutOfMemoryError: Metaspace
Exception in thread "Thread-3" java.lang.OutOfMemoryError: Metaspace

当 运行 内存大小:2048 MB

时,它 运行 成功

我想知道在 AWS lambda 中使用 spark 所需的实际内存大小是多少。是否有任何较轻版本的库。我正在使用这个库创建 Parquet 文件并将其上传到 S3。

谢谢。

分配给 java lambda 函数的内存量由 堆、元和保留代码内存共享。

您可以考虑仅增加 -XX:MaxMetaspaceSize 大小,因为根据您的异常日志 Metaspace: java.lang.OutOfMemoryError java.lang.OutOfMemoryError: Metaspace 问题与 metaspace

有关

您可以通过仅增加 metaspace 而不更改堆和缓冲区 space 来自定义调整。 (注意:spark 可能会加载很多 类 并使用 metaspace)并且请考虑 运行 您在 cluster mode.

中的 spark 应用程序

你可以查看这个thread

有关 heap memory,metaspace and reserved code memory 的更多信息。

您肯定不希望将 Spark 作为 Lambda 函数的依赖项。 Spark 对于 Lambda 来说太重了。 Spark 应该 运行 在集群上,而 Lambda 不是集群。

如果您想 运行 无服务器 Spark 代码,请查看 AWS Glue... 或者不要因为 AWS Glue 使用起来相对复杂。

如果您的文件足够小,可以在 Lambda 函数中转换为 Parquet,请查看 AWS Data Wrangler. The releases 包含 pre-built 层,因此您无需担心所有底层细节用于构建图层(弄清楚 numpy 和 PyArrow 真的很烦人 - 只需使用 lib)。

这是写出 Parquet 文件的代码:

import awswrangler as wr
import pandas as pd

df = pd.DataFrame({"id": [1, 2], "value": ["foo", "boo"]})

# Storing data on Data Lake
wr.s3.to_parquet(
    df=df,
    path="s3://bucket/dataset/",
    dataset=True,
    database="my_db",
    table="my_table"
)