我尝试在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:576mb,然后是1024mb。两次都失败了:
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
它在内存大小为2048MB时运行成功
我想知道在aws lambda中使用spark所需要的实际内存大小是多少。图书馆有没有更轻的版本。我使用这个库来创建Parquet文件并上传到s3。
谢谢。
2条答案
按热度按时间xdnvmnnf1#
分配给java lambda函数的内存量由堆、元和保留代码内存共享。
你可以考虑只增加
-XX:MaxMetaspaceSize
大小,因为根据异常日志metaspace:java.lang.outofmemoryerror java.lang.outofmemoryerror:metaspace问题与metaspace相关您可以通过只增加元空间而不更改堆和缓冲区空间来进行自定义调整(注意:spark可能会加载很多类并利用元空间(metaspace),请考虑在集群模式下运行spark应用程序。
你可以检查这根线
有关堆内存、元空间和保留代码内存的更多信息。
p5cysglq2#
您肯定不希望在lambda函数中包含spark作为依赖项。Spark对兰博达来说太重了。spark应该在集群上运行,而lambda不是集群。
如果你想运行无服务器的spark代码,请检查aws胶水。。。或者不要因为aws胶水使用起来比较复杂。
如果您的文件足够小,可以在lambda函数中转换为parquet,请查看aws data wrangler。发行版包含预构建层,因此您不必担心构建层的所有低级细节(弄清楚numpyarrow和pyarrow真的很烦人-只需使用lib)。
下面是写出Parquet地板文件的代码: