5

使用 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]

想知道对于大型数据库 (>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'
4

3 回答 3

10

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

其次,有多种因素在起作用。我建议执行以下步骤。

  1. 增加max.batch.sizemax.queue.size- 减少提交次数
  2. 增加offset.flush.timeout.ms- 让 Connect 有时间处理累积的记录
  3. 减少offset.flush.interval.ms- 应该减少累积的偏移量

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

于 2018-04-17T07:24:36.433 回答
2

我可以确认 Jiri Pechanec 上面发布的答案解决了我的问题。这是我正在使用的配置:

kafka 连接 worker 配置在 worker.properties 配置文件中设置:

offset.flush.timeout.ms=60000
offset.flush.interval.ms=10000
max.request.size=10485760

Debezium 配置通过 curl 请求进行初始化:

max.queue.size = 81290
max.batch.size = 20480

我们的 staging MySQL db (~8GB) 没有遇到这个问题,因为数据集要小得多。对于生产数据集(~80GB),我们必须调整这些配置。

希望这可以帮助。

于 2019-09-19T20:09:54.417 回答
2

补充一下 Jiri 所说的话:

Debezium bugtracker现在有一个未解决的问题,如果您有更多关于根本原因、日志或复制的信息,请随时在此处提供。

对我来说,改变 Jiri 在他的评论中提到的价值观并没有解决问题。唯一可行的解​​决方法是在同一个工作人员上创建多个连接器,每个连接器负责所有表的一个子集。为此,您需要启动连接器 1,等待快照完成,然后启动连接器 2,依此类推。在某些情况下,当较晚的连接器开始快照时,较早的连接器将无法刷新。在这些情况下,您可以在所有快照完成后重新启动工作程序,并且连接器将再次从 binlog 中获取(确保您的快照模式为“when_needed”!)。

于 2018-04-23T07:45:03.830 回答