带有 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
您肯定不希望将 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"
)
我正在尝试在我的 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
您肯定不希望将 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"
)