【问题标题】:Debezium postgres kafka connector is failing with java heap space issueDebezium postgres kafka 连接器因 Java 堆空间问题而失败
【发布时间】:2020-08-09 15:08:28
【问题描述】:

我们有 13 个 kafka debezium postgres 连接器在 Strimzi kafkaconnect 集群上运行。其中之一是 Caused by: java.lang.OutOfMemoryError: Java heap space 失败。将 jvm 选项从 2g 增加到 4g,但仍然因同样的问题而失败。

完整的日志:

java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOfRange(Arrays.java:3664)
    at java.lang.String.<init>(String.java:207)
    at com.fasterxml.jackson.core.util.TextBuffer.setCurrentAndReturn(TextBuffer.java:696)
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishAndReturnString(UTF8StreamJsonParser.java:2405)
    at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.getValueAsString(UTF8StreamJsonParser.java:312)
    at io.debezium.document.JacksonReader.parseArray(JacksonReader.java:219)
    at io.debezium.document.JacksonReader.parseDocument(JacksonReader.java:131)
    at io.debezium.document.JacksonReader.parseArray(JacksonReader.java:213)
    at io.debezium.document.JacksonReader.parseDocument(JacksonReader.java:131)
    at io.debezium.document.JacksonReader.parse(JacksonReader.java:102)
    at io.debezium.document.JacksonReader.read(JacksonReader.java:72)
    at io.debezium.connector.postgresql.connection.wal2json.NonStreamingWal2JsonMessageDecoder.processMessage(NonStreamingWal2JsonMessageDecoder.java:54)
    at io.debezium.connector.postgresql.connection.PostgresReplicationConnection$1.deserializeMessages(PostgresReplicationConnection.java:418)
    at io.debezium.connector.postgresql.connection.PostgresReplicationConnection$1.readPending(PostgresReplicationConnection.java:412)
    at io.debezium.connector.postgresql.PostgresStreamingChangeEventSource.execute(PostgresStreamingChangeEventSource.java:119)
    at io.debezium.pipeline.ChangeEventSourceCoordinator.lambda$start$0(ChangeEventSourceCoordinator.java:99)
    at io.debezium.pipeline.ChangeEventSourceCoordinator$$Lambda$464/1759003957.run(Unknown Source)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)```

【问题讨论】:

  • 您在所有白名单表中捕获了多少列?
  • @Gunnar 每个连接器每天大约 10 万条记录
  • 我不是指更改的频率,而是您总共捕获了多少列。连接器需要为每列保留元数据,因此如果您有很多(例如数十万),您可能需要更多内存。
  • @Gunnar 阅读 6 栏
  • 好吧,那就不是这样了。但是,您是否在处理大型记录和/或长事务?值得尝试将wal2json_streaming 用作plugin.name,或者更好的是pgoutputdecoderbufs(取决于您的环境)。

标签: postgresql apache-kafka apache-kafka-connect debezium strimzi


【解决方案1】:

这看起来你有一个非常大的事务消息,由于内存限制,解析失败。 wal2json_streaming 应该将消息分成更小的块来防止这个问题。

如果可能,通常请使用 protobuf 或 pgoutput 解码器,因为它们是每次更改而不是每个事务从数据库流式传输消息。

【讨论】:

  • 更改为 wal2json_streaming 连接器后工作正常,但我看到下面的警告。 WARN Received 10001 events which were all filtered out, so no offset could be committed. This prevents the replication slot from acknowledging the processed WAL offsets, causing a growing backlog of non-removeable WAL segments on the database server. Consider to either adjust your filter configuration or enable heartbeat events (via the heartbeat.interval.ms option) to avoid this situation. (io.debezium.connector.postgresql.PostgresStreamingChangeEventSource)
【解决方案2】:

尝试在 Debezium props 下调优

  • 增加max.batch.size
  • 减少max.queue.size
  • offset.flush.interval.ms 调整为您的应用要求

【讨论】:

  • 我将它们从默认值增加到max.queue.size: 65536 max.batch.size: 16384。但仍然看到同样的问题
猜你喜欢
  • 1970-01-01
  • 2023-02-11
  • 2020-08-28
  • 2020-02-16
  • 2019-02-16
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多