好胖子带你学Flink:Flink源码剖析第一集Standalone启动脚本分析
1、前言
各位朋友们大家好,接下来我会为大家带来一整套的Flink源码学习教程其中会囊括一下几个知识点:
- Flink 内核流程的学习
- 学习Flink这种顶级开源框架的学习
- 同时会给大家提供一些小的issue,能不能成为commiter就看大家的了。
2、内容
1. start-cluster.sh
此时各位大佬,可以打开自己的flink源码,或者是下载好的Flink包以及centos上面的Flink软件中的bin目录。
在flink源码中,脚本所在的项目为flink-dist下的flink-bin目录,此时我们分析的就是start-cluster。
肯定很多朋友说为什么不看yarn提交,要看Standalone启动集群的方式,因为Standalone是每个计算框架都会存在的,例如yarn等都是为了兼容而做的,standalone这种方式才会真正的体现flink内部的一些核心框架的一些用法(因为比较简单容易分析。。。),我们就来分析一下,启动脚本把,其实很多同学在分析一个框架源码的时候,往往为了找不到入口而烦恼,在工作中,也是这样的情况,例如看一个不是springboot的程序,就看他的main方法。
如果是springboot的话就看他的页面展示效果,debug接口,这么看会让你很快的熟悉源码,之后等熟悉了再看一些内部的一些异步的、定时的一些方法。
那么我们就来分析一下这个脚本。
首先他会执行一个很重要的脚本config.sh
这个脚本真的很重要,他是一个获取配置,以及获取一些参数的重要脚本,在我们公司项目中为了兼容华为云,往往会修改这个脚本,在这个脚本中添加一些内容。
继续往下走可以看到
# 是不是高可用
if [[ $HIGH_AVAILABILITY == "zookeeper" ]]; then
# 获取mater的地址
readMasters
# 远程执行
ssh -n $FLINK_SSH_OPTS $master -- "nohup /bin/bash -l \"${FLINK_BIN_DIR}/jobmanager.sh\" start ${master} ${webuiport} &"
fi
done
此时很多同学就蒙了readMasters
这个是什么东西?其实这个影响我们观看脚本吗,不影响,我也不是很懂shell,但是大概能理解 这是一个shell的方法,根据方法名来看 他是读取master的地址。然后ssh到这个master的机器上来启动jobmanager。为什么一定要在固定机器上启动jobmanager,因为他内部有一个commonRpcService,其他的组件会找这个service。所以必须的是固定的,你配置那个机器就在那个机器执行,如果错误,访问不到service的。
因为所有节点的通过很大一部分都是依赖于配置文件来生成服务,以供其他组件来进行通信。
说了这么多,这个方法在哪里呢?这个方法其实就在config.sh
我们假设我们目前不是高可用集群,我们肯定走的是 else,那么他调用的肯定是 "$FLINK_BIN_DIR"/jobmanager.sh start
这个脚本,我们就去看一下吧。
2. Jobmanager启动类分析
此时我们打开了,这个脚本,我们看到最下面,看一下 他写的是什么
我们传入的是start,此时这里肯定不走if,走的是else,执行的也就是
"${FLINK_BIN_DIR}"/flink-daemon.sh $STARTSTOP $ENTRYPOINT "${args[@]}"
这个命令,那么$ENTRYPOINT是什么,在上面也就有定义了
这个脚本完整的写的话,可以写成
flink-daemon.sh start standalonesession "${args[@]}"
我们进入flink-daemon.sh 很简单的我们就发现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N8V6unT4-1655545235858)(https://gitee.com/wuqingzhi128/blogImg/raw/master/image-20220618172152405.png)]
这里就是常识了,我都不用往下看了,就知道jobmanager肯定是走的这个类的main方法。启动 JobManager走的StandaloneApplicationClusterEntryPoint这个类main方法
3. TaskManager启动类分析
我们这个时候,已经找到了,JobManager的入口了,但是此时我们还没有找到Taskmanager的入口,我们再回到 start-cluster.sh 。
在下方我们就可以看到一个方法 启动,我们找到这个方法,这个方法在config.sh中。
可以看到是本地就本地启动,不是本地就远程启动taskmanager,当然可能有多台,也就是for循环进行启动。
我们看到内部调用了taskmanager.sh start
,我们再去看看 taskmanager.sh这个脚本,别说啊,一层套一层的。
我们找啊找啊,我们发现了这一块,是不是和JobManager启动十分相似。
这里就类似于
/flink-daemon.sh start taskexecutor "${ARGS[@]}"
再进入到flink-daemon.sh查看,我们也就发现了,Taskmanager最后执行的类是 TaskManagerRunner这个类的main方法。
此时入口我们就全部找到了,剩下的就是看源码就可以了。
3、总结
1、我们分析了start-cluster.sh的脚本,这个脚本中,他会首先调用config.sh获取配置。
2、会根据JobManager是不是Ha来进行判断执行不同的分支来确定是否远程执行启动JobManager
3、我们确定了JobManager的启动类是StandaloneApplicationClusterEntryPoint
4、我们确定了TaskManager的启动类是TaskManagerRunner这个类。
假如面试问你是否看过flink源码,可以说我们的脚本分析的这个总结,当然这不是重点,下一期我们分析JobManager的启动源码。