好胖子带你学Flink系列-Flink源码剖析第一集Standalone启动脚本分析

好胖子带你学Flink:Flink源码剖析第一集Standalone启动脚本分析

1、前言

各位朋友们大家好,接下来我会为大家带来一整套的Flink源码学习教程其中会囊括一下几个知识点:

  1. Flink 内核流程的学习
  2. 学习Flink这种顶级开源框架的学习
  3. 同时会给大家提供一些小的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是什么,在上面也就有定义了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gSP8fuOr-1655545235857)(https://gitee.com/wuqingzhi128/blogImg/raw/master/image-20220618171729945.png)]

这个脚本完整的写的话,可以写成

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 。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YrzS3vQi-1655545235858)(https://gitee.com/wuqingzhi128/blogImg/raw/master/image-20220618172438233.png)]

在下方我们就可以看到一个方法 启动,我们找到这个方法,这个方法在config.sh中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qx3f0JyZ-1655545235859)(https://gitee.com/wuqingzhi128/blogImg/raw/master/image-20220618172617129.png)]

可以看到是本地就本地启动,不是本地就远程启动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的启动源码。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值