Debezium 刷新超时和 OutOfMemoryError 错误 MySQL
Debezium flush timeout and OutOfMemoryError errors with MySQL
使用 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'
这是一个非常复杂的问题 - 首先,Debezium Docker 图像的默认内存设置非常低,因此如果您正在使用它们,可能需要增加它们。
接下来,有多种因素在起作用。我建议执行以下步骤。
- 增加
max.batch.size
和 max.queue.size
- 减少提交次数
- 增加
offset.flush.timeout.ms
- 给予 Connect 处理累积记录的时间
- 减少
offset.flush.interval.ms
- 应该减少累积偏移量
可惜有一个issue KAFKA-6551潜伏在后台,还能大闹
补充 Jiri 所说的话:
Debezium bugtracker 中现在有一个未解决的问题,如果您有任何关于根本原因、日志或复制的更多信息,请随时提供。
对我来说,更改 Jiri 在他的评论中提到的值并没有解决问题。唯一可行的解决方法是在同一个 worker 上创建多个连接器,每个连接器负责所有表的一个子集。为此,您需要启动连接器 1,等待快照完成,然后启动连接器 2,依此类推。在某些情况下,当较晚的连接器开始快照时,较早的连接器将无法刷新。在这些情况下,您可以在所有快照完成后重新启动 worker,连接器将再次从 binlog 中获取(确保您的快照模式为“when_needed”!)。
我可以确认 Jiri Pechanec 上面发布的答案解决了我的问题。这是我使用的配置:
kafka connect 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
我们没有 运行 使用暂存 MySQL 数据库 (~8GB) 解决这个问题,因为数据集要小得多。对于生产数据集 (~80GB),我们必须调整这些配置。
希望对您有所帮助。
使用 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'
这是一个非常复杂的问题 - 首先,Debezium Docker 图像的默认内存设置非常低,因此如果您正在使用它们,可能需要增加它们。
接下来,有多种因素在起作用。我建议执行以下步骤。
- 增加
max.batch.size
和max.queue.size
- 减少提交次数 - 增加
offset.flush.timeout.ms
- 给予 Connect 处理累积记录的时间 - 减少
offset.flush.interval.ms
- 应该减少累积偏移量
可惜有一个issue KAFKA-6551潜伏在后台,还能大闹
补充 Jiri 所说的话:
Debezium bugtracker 中现在有一个未解决的问题,如果您有任何关于根本原因、日志或复制的更多信息,请随时提供。
对我来说,更改 Jiri 在他的评论中提到的值并没有解决问题。唯一可行的解决方法是在同一个 worker 上创建多个连接器,每个连接器负责所有表的一个子集。为此,您需要启动连接器 1,等待快照完成,然后启动连接器 2,依此类推。在某些情况下,当较晚的连接器开始快照时,较早的连接器将无法刷新。在这些情况下,您可以在所有快照完成后重新启动 worker,连接器将再次从 binlog 中获取(确保您的快照模式为“when_needed”!)。
我可以确认 Jiri Pechanec 上面发布的答案解决了我的问题。这是我使用的配置:
kafka connect 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
我们没有 运行 使用暂存 MySQL 数据库 (~8GB) 解决这个问题,因为数据集要小得多。对于生产数据集 (~80GB),我们必须调整这些配置。
希望对您有所帮助。