Flink源码本身比较复杂,我打算以Flink的Standalone模式为入口,研究当一个jar包被提交进Flink后,flink如何处理的过程。
搭建过程可以参考官方文档
https://ci.apache.org/projects/flink/flink-docs-release-1.8/ops/deployment/cluster_setup.htm
启动 JobManager: bin/jobmanager.sh start
启动 TaskManager: bin/taskmanager.sh start
主要关注上面两个脚本,通过阅读脚本,可以知道底层调用的是 flink-daemon.sh,点进去可以发现,主要是下面几个类
如果shell脚本扎实,可以阅读shell脚本,明确知道红圈圈是两个入口类,但如果像我一样,对shell脚本一知半解,可以在启动集群后,使用jps命令也能定位到入口类。
知道入口类后,可以抛弃flink提供的二进制发行包,考虑在eclipse中debug启动集群。我使用的版本是 flink1.7.2
导入Flink源代码
参照官方文档的教程,官网推荐使用idea,所以改用idea导入,maven使用 3.2版本的,没有修改maven的配置
idea下载地址(2016.2.5):http://www.jetbrains.com/idea/download/previous.html
官方教程: https://ci.apache.org/projects/flink/flink-docs-release-1.8/flinkDev/ide_setup.html
耐心挂一个晚上,可以下载好所有的jar包。
碰到的一些问题
问题1:
如果直接启动JobManager,会报错,
org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
usage: StandaloneSessionClusterEntrypoint -c [-D
] [-h ] [-r ] [-x ]
-c,--configDir Directory which contains the
configuration file
flink-conf.yml.
-D use value for given property
-h,--host Hostname for the RPC service.
-r,--webui-port Port for the rest endpoint and
the web UI.
-x,--executionMode Deprecated option
可以联想到shell脚本中并不是直接运行main方法的,还带有一些参数,在shell脚本中增加echo输出,可以得到JobManager和TaskManager的完整启动脚本。
TaskManager
/home/jkapp/software/jdk1.8.0_161/bin/java -XX:+UseG1GC -Xms922M -Xmx922M -XX:MaxDirectMemorySize=8388607T -Dlog.file=/home/jkapp/flink-1.7.2/log/flink-jkapp-taskexecutor-14-wangzhe.log -Dlog4j.configuration=file:/home/jkapp/flink-1.7.2/conf/log4j.properties -Dlogback.configurationFile=file:/home/jkapp/flink-1.7.2/conf/logback.xml -classpath /home/jkapp/flink-1.7.2/lib/flink-python_2.12-1.7.2.jar:/home/jkapp/flink-1.7.2/lib/log4j-1.2.17.jar:/home/jkapp/flink-1.7.2/lib/slf4j-log4j12-1.7.15.jar:/home/jkapp/flink-1.7.2/lib/flink-dist_2.12-1.7.2.jar::: org.apache.flink.runtime.taskexecutor.TaskManagerRunner --configDir /home/jkapp/flink-1.7.2/conf > /home/jkapp/flink-1.7.2/log/flink-jkapp-taskexecutor-14-wangzhe.out 200<&- 2
JobManager
/home/jkapp/software/jdk1.8.0_161/bin/java -Xms1024m -Xmx1024m -Dlog.file=/home/jkapp/flink-1.7.2/log/flink-jkapp-standalonesession-1-wangzhe.log -Dlog4j.configuration=file:/home/jkapp/flink-1.7.2/conf/log4j.properties -Dlogback.configurationFile=file:/home/jkapp/flink-1.7.2/conf/logback.xml -classpath /home/jkapp/flink-1.7.2/lib/flink-python_2.12-1.7.2.jar:/home/jkapp/flink-1.7.2/lib/log4j-1.2.17.jar:/home/jkapp/flink-1.7.2/lib/slf4j-log4j12-1.7.15.jar:/home/jkapp/flink-1.7.2/lib/flink-dist_2.12-1.7.2.jar::: org.apache.flink.runtime.entrypoint.StandaloneSessionClusterEntrypoint --configDir /home/jkapp/flink-1.7.2/conf --executionMode cluster > /home/jkapp/flink-1.7.2/log/flink-jkapp-standalonesession-1-wangzhe.out 200<&- 2
参考脚本的配置,只需要引入额外的jar包并关联配置目录,jar包和配置文件可以通过flink的二进制发行包获得。
问题2:
没有日志:
修改 flink-runtime下 src/main/resources 目录 log4j.properties文件
启动JobManager和TaskManager
访问 http://127.0.0.1:8081/ 页面如下图所示
源码编译
这块并不是我学习的重点,所以就贴一个网址吧!
https://ci.apache.org/projects/flink/flink-docs-release-1.8/flinkDev/building.html