如何解决带有Spark库的AWS Lambda提供了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"
我最初使用内存运行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
的大小,因为根据您的异常日志元空间:java.lang.OutOfMemoryError java.lang.OutOfMemoryError:元空间问题与元空间有关
您可以通过仅增加元空间而不更改堆和缓冲区空间来自定义调整。 (注意:spark可能正在加载很多类并利用元空间),并且还请考虑在cluster mode中运行spark应用。
您可以检查此thread
有关heap memory,metaspace and reserved code memory的更多信息。
,您绝对不希望在Lambda函数中包含Spark作为依赖项。对于Lambda来说,Spark太重了。 Spark应该在群集上运行,而Lambda不是群集。
如果您要运行无服务器Spark代码,请签出AWS Glue ...或不要导致AWS Glue使用起来相对复杂。
如果文件足够小,无法通过Lambda函数转换为Parquet,请签出AWS Data Wrangler。 releases包含预构建的图层,因此您无需担心构建图层的所有底层细节(弄清楚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"
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。