流工作使用动作连接失败

流工作写入动作水槽与内存不足错误失败,因为HTTP客户端没有得到终止。

写的阿施施

去年发表在:2022年5月19日

问题

你有流工作写入动作水槽,并没有与内存不足错误消息。

. 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 ()}


这篇文章有用吗?