問題
你有流工作寫入動作水槽,並沒有與內存不足錯誤消息。
. 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 ()}