本篇主要是记一下如何调试 Flink 的源码,以 Standalone 模式为例

一、编译

在GitHub 下载源码并编译:

1
2
git clone git@github.com:apache/flink.git
git checkout release-1.6.3

编译命令:

1
mvn clean install -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -T 4

maven 的 settings.xml 文件的 mirror 添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
 1<mirror>
2 <id>nexus-aliyun</id>
3 <mirrorOf>*,!jeecg,!jeecg-snapshots,!mapr-releases</mirrorOf>
4 <name>Nexus aliyun</name>
5 <url>http://maven.aliyun.com/nexus/content/groups/public</url>
6</mirror>
7
8<mirror>
9 <id>mapr-public</id>
10 <mirrorOf>mapr-releases</mirrorOf>
11 <name>mapr-releases</name>
12 <url>https://maven.aliyun.com/repository/mapr-public</url>
13</mirror

编译命令:

1
mvn clean install -DskipTests -Dmaven.javadoc.skip=true -Dcheckstyle.skip=true -T 4

等了一波时间之后,编译成功就长下图这样:

image-20221227222823158

二、部署

为了部署方便, 简单写了个简陋的一键部署脚本💪~

1
2
3
git clone https://gitee.com/Joccer_admin/chen-utils-manager.git
cd chen-utils-manager
./chen-utils-manager.sh -m flink

三、调试

3.1. Standalone

首先,要启用远程调试, 需要添加一段 jvm 启动参数,这个参数我们可以通过下图中找到

image-20221227222823158

即:

1
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5006

其中端口号根据时间情况而定,如果要从启动方法里开始调试,则需要设置 suspend=y

我们先从启动脚本看,从 start-cluster.sh 找到 config.sh ,可以发现 flink 会将如下 3 个配置项添加到指定的jvm启动参数中:

1
2
3
4
5
6
# jar 包启动时添加的参数,适用于 jobmanager 和 taskmanager;
KEY_ENV_JAVA_OPTS="env.java.opts"
# jobmanager 的启动参数
KEY_ENV_JAVA_OPTS_JM="env.java.opts.jobmanager"
# taskmanager的启动参数
KEY_ENV_JAVA_OPTS_TM="env.java.opts.taskmanager"

这3个配置均可以在 flink-conf.yaml 中配置,远程调试参数应当配置后两者,并且使用不同的端口,如果配置 env.java.opts 中,启动 jobmanager 和 taskmanager 将会出现端口占用冲突。

flink-conf.yaml 中添加:

1
2
env.java.opts.jobmanager: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005"
env.java.opts.taskmanager: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5006"

启动集群

1
start-cluster.sh

standalone cluster 模式下:

  • jobmanager 的入口类是 org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint
  • taskmanager的入口类是 org.apache.flink.runtime.taskexecutor.TaskManagerRunner

找到 main() 方法打上断点就可以开始调试了。

image-20221227222823158