问题
你有流工作写入动作水槽,并没有与内存不足错误消息。
. lang。OutOfMemoryError: GC开销限制超过
. lang。OutOfMemoryError: Java堆空间。
症状包括:
- Ganglia显示逐步增加JVM内存使用。
- Microbatch分析显示输入和处理速率是一致的,这意味着源或处理没有问题。
- 堆转储显示Java hashmap JVM堆上占据很大的空间和增加。
导致
最常见的原因为这个错误是你关闭动作的客户,但你不关闭HTTP客户端。
例如,一个新的运动客户通常为每个分区创建。
% scala类KinesisSink延伸ForeachWriter [SinkInput]{私人var kinesisClient: kinesisClient = _覆盖def开放(partitionId:长,版本:长):布尔= {val httpClient = ApacheHttpClient .builder () .build () kinesisClient = kinesisClient .builder () .region (Region.of(地区).httpClient (httpClient) .build()真}覆盖def过程(价值:KinesisSinkInput):单位={/ /主要过程。}覆盖def关闭(errorOrNull: Throwable):单位= {kinesisClient.close ()}}
这个示例代码调用kinesisClient.close ()但它不是httpClient.close ()。
这意味着HTTP客户端被创建,打开TCP连接和使用资源,但没有得到终止。
解决方案
确保你在不再需要时关闭HTTP客户端。
% scala覆盖def关闭(errorOrNull: Throwable):单位= {client.close () httpClient.close ()}