背景
使用Debezium采集MySQL Binlog 集成到Hive中,采坑(一)(二) 中对问题的猜想还没得到证实,又发现了 Debezium 采集 MySQL 时间转换时间错乱问题,关于时间错乱问题后续文章中会详细分析,于是走上kafka connect的debug之路。
原理
根本原理就是利用远程debug 模式:服务端远程开启debug模式,本地链接远程端口调试集合。但是如何开启呢?下面将细细道来
开启过程
服务端开启debug
哈哈!!!其实开启 debug 模式很简单,在$confluent_home/bin/kafka-run-class 启动文件中,将KAFKA_DEBUG赋值即可,建议配置为 KAFKA_DEBUG=true。
本人使用的是 confluence 包一键搭建的开发环境,对于开发搭建十分简单但对开启debug模式有个小坑,如果简单的将 KAFKA_DEBUG赋值,会有端口冲突问题。 原因是开发者模式模式下启动,zookeeper 、 kafka 、kafka connect 的启动都会调用 $confluent_home/bin/kafka-run-class 去其对应的应用。
## zookeeper
cat zookeeper-server-start
## 此处省略N行,最后
exec $base_dir/kafka-run-class $EXTRA_ARGS org.apache.zookeeper.server.quorum.QuorumPeerMain "$@"
## kafka
cat kafka-server-start
## 此处省略N行,最后
exec $base_dir/kafka-run-class $EXTRA_ARGS io.confluent.support.metrics.SupportedKafka "$@"
## connect
cat connect-distributed
## 此处省略N行,最后
exec $(dirname $0)/kafka-run-class $EXTRA_ARGS org.apache.kafka.connect.cli.ConnectDistributed "$@"
每个应用的启动都开启远程debug 并且端口都是默认的不冲突才怪,知道了原因解决就不是问题了,于是乎做如下小优化,只有在启动connect的时候才启用debug
# Set Debug options if enabled
if [ "$1" = "org.apache.kafka.connect.cli.ConnectDistributed" ]; then
KAFKA_DEBUG=true
fi
重启应用查看connect 日志
...
Listening for transport dt_socket at address: 5005
...
看到如上关键日志说明你服务端debug开启成功了,少年嗨起来吧!
本地开启连接远程debug
需要用的源代码,自行github下载,我使用的是idea将源码导入后直接新建一个运行窗口配置如下:
点击debug后,想断点哪里就断点哪里。
后续
开启debug 成功后,将之前 采坑(一)(二) 猜想走了一遍猜想的没问题,运行是就是这样的,下篇说下时间转换问题。