Debezium刷新超时和MySQL出现OutOfMemoryError错误

ksi*_*ndi 3 java mysql apache-kafka apache-kafka-connect debezium

使用Debezium 0.7读取MySQL,但在初始快照阶段出现刷新超时和OutOfMemoryError错误。查看下面的日志,似乎连接器试图一次写太多消息:

WorkerSourceTask{id=accounts-connector-0} flushing 143706 outstanding messages for offset commit   [org.apache.kafka.connect.runtime.WorkerSourceTask]
WorkerSourceTask{id=accounts-connector-0} Committing offsets   [org.apache.kafka.connect.runtime.WorkerSourceTask]
Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: Java heap space
WorkerSourceTask{id=accounts-connector-0} Failed to flush, timed out while waiting for producer to flush outstanding 143706 messages   [org.apache.kafka.connect.runtime.WorkerSourceTask]
Run Code Online (Sandbox Code Playgroud)

对于大型数据库(> 50GB),想知道什么是正确的设置http://debezium.io/docs/connectors/mysql/#connector-properties。对于较小的数据库,我没有这个问题。简单地增加超时时间似乎不是一个好的策略。我目前正在使用默认的连接器设置。

更新资料

按照以下建议更改设置,并解决了问题:

OFFSET_FLUSH_TIMEOUT_MS: 60000  # default 5000
OFFSET_FLUSH_INTERVAL_MS: 15000  # default 60000
MAX_BATCH_SIZE: 32768  # default 2048
MAX_QUEUE_SIZE: 131072  # default 8192
HEAP_OPTS: '-Xms2g -Xmx2g'  # default '-Xms1g -Xmx1g'
Run Code Online (Sandbox Code Playgroud)

Jir*_*nec 7

这是一个非常复杂的问题-首先,Debezium Docker映像的默认内存设置非常低,因此,如果您使用它们,可能有必要增加它们。

接下来,有多个因素在起作用。我建议执行以下步骤。

  1. 增加max.batch.sizemax.queue.size减少提交次数
  2. 增加offset.flush.timeout.ms-提供连接时间来处理累积的记录
  3. 减少offset.flush.interval.ms-应减少累计抵消额

不幸的是,KAFKA-6551在后台潜伏着一个问题,但仍然会造成严重破坏。

  • 请注意,必须将Debezium的选项(“ max.batch.size”,“ max.queue.size”)作为连接器选项提供;将它们指定为env变量将不起作用(仅支持Kafka(连接)定义的设置。 (2认同)