如何彻底驱逐Spark中持久的“流块”

问题描述 投票:1回答:1

- 更新 - 我们发现当遇到“com.amazonaws.services.kinesis.clientlibrary.exceptions.ShutdownException时无法更新检查点 - 实例不保存此分片的租约”https://github.com/awslabs/amazon-kinesis-client/issues/108我们使用s3目录时发生以下情况(和dynamodb)存储检查点,但如果发生这种情况,块不应该卡住但继续从内存中优雅地逐出,显然kinesis库竞争条件是一个问题本身...

遇到问题(也提交了关于下面主题的火花jira任务)“块流”(有些不是全部)持续导致OOM

App是用java编写的标准kinesis / spark流媒体应用程序(spark版本是2.0.2)

最初运行良好,自动SparkCleaner完成其工作,很好地回收流媒体作业(通过查看管理员中的存储选项卡进行验证)

然后一段时间后,一些块卡在内存上,例如其中一个执行器节点上的这个块

输入-0-1485362233945 1 ip - <>:34245内存序列化1442.5 KB

经过更长时间后,更多的块被卡住并且从未被释放

据我所知,SparkContext清理器将触发删除或更旧的块,并以给定的间隔触发System.gc,默认为30分钟

感谢对此的任何反馈,因为此问题可以防止应用程序的100%正常运行时间

如果这可能有价值,我们使用StorageLevel.MEMORY_AND_DISK_SER()

Spark Jira

java scala apache-spark streaming rdd
1个回答
0
投票

您可以尝试手动执行驱逐:

  1. 获取KinesisInputDStream.generatedRDDs(使用反射)
  2. 对于每个生成的RDD(它应该包含BlockRDD)执行类似DStream.clearMetadata的操作。

我已经为mapWithState和其他使用内存的东西使用了类似的hack。

© www.soinside.com 2019 - 2024. All rights reserved.