Flink源码阅读环境搭建并调试FlinkClients模块

本文大纲

image.png

一、Flink 官方文档这么全面,为什么还要读 Flink 源码

读文档和读源码的目的是不一样的,就拿 Apache Flink 这个项目来说,如果你想知道 Flink 的使用功能,设计思想,实现原理,看官方文档就足够了;如果你想了解的就是具体细节,比如说 StreamGraph 是怎么生成的或者是 Exactly Once 究竟如何实现的,那么就需要去阅读源码了。

关键是看你的目的是什么,如果你想了解思想,经验等看文档就够了,因为文档是人写给人的;如果你想了解具体细节,那应该去看源码,因为源码是人写给机器的,源码里有到底做了什么这些事情。

那么我写这篇的文章目的是什么?我的目的是,万一你已经在生产上身经百战了,对 Flink 的原理都把握住了,那么看源码是对你来说最好的进阶方式,所以我为你准备了这篇搭建环境的教程,为你节约宝贵的时间陪家人陪孩子不香吗?

二、Flink 源码几百万行,该如何下手

通常对于阅读源码这件事情来说是有方法论可循的。

1、首先得具备前提条件

  • 相关语言和基础技术知识。比如 Java,Maven,Git,设计模式等等。如果你只会 C++,哪天心血来潮去阅读 Flink 源码,那是不现实的;
  • 开源项目的功能。需要知道这个项目是为了解决什么问题,完成什么功能,有哪些特性,如何启动,有哪些配置项。先把这个项目跑起来,能运行简单的 Demo;
  • 相关的文档。也就是庞大的工程中,有哪些模块,每个模块大概的功能是干嘛的;

这些前提知识准备好了之后,你就对这个项目有了一个感性的认识,再去阅读它的代码就轻松一些了。

在阅读代码过程中,不是说拿到源码就直接从第一个模块一行行的开始读,这样很容易迷失方向,陷入到代码细节中无可自拔。

2、其次需要关注这些重点东西

  • 接口抽象定义。任何项目代码都会有很多接口,接口的继承关系和方法,描述了它处理的数据结构,业务实体以及和其他模块的关系,理清楚这些关系是非常重要的。
  • 模块粘合层。代码中很多的设计模式,都是为了解耦各个模块的,好处就是灵活扩展,坏处就是让本来平铺直述的代码割裂成一个个模块,不那么方便阅读。
  • 业务流程。在代码一开始,不要进入细节,一方面会打消你的积极性,一方面也看不过来。要站在一定的高度,搞清楚整个的业务流程是怎样的,数据是怎么被传递的。最好可以画流程图或者时序图,方便理解和记忆。
  • 具体实现。在具体实现中,仍然需要弄清楚一些重要的点(1)代码逻辑。在代码中,有业务逻辑,是真正的业务处理逻辑;还有控制逻辑,像流程流转之类的;(2)出错处理。其实很多地方都是在处理出错的逻辑,可以忽略掉这部分逻辑,排除干扰因素;(3)数据处理。属性转换,JSON 解析,XML 解析,这些代码都比较冗长和无聊,可以忽略;(4)重要的算法。这是比较核心的地方,也是最有技术含量的地方;(5)底层交互。有一些代码是和底层操作系统或者是和 JVM 交互的,需要知道一些底层的东西;
  • 运行时调试。这是最直接的方式,可以看到代码究竟是如何跑起来的,数据是怎么样的,是了解代码最重要的方式。

总结成一句话:高屋建瓴,提纲挈领,把握方向

好了,有了这些内容心法,下面开始实战吧!

三、安装 Git 环境

我就不具体演示了,说一下大致流程,可以自行百度,相关的文章很多的。

1、下载 Git

下载对应平台(Windows,Mac)的 Git 客户端,并安装

下载地址: https://git-scm.com/downloads

2、初始配置

$ git config --global user.name "Your Name"
$ git config --global user.email yourEmail@example.com

3、生成秘钥,并上传到 Gitee 上

ssh-keygen -t rsa

登陆 Gitee,在头像 - 设置 - 安全设置 - SSH 公钥 添加一个公钥

四、Github 龟速如何解决

GitHub 很慢如何下载好几十 M 的源码文件呢?

你想下载任意 GitHub 项目,都可以在 Gitee 上导入这个 Github 项目:

Flink源码阅读环境搭建并调试FlinkClients模块

导入之后,就可以下载了。当然 Apache Flink 活跃度前几的项目,Gitee 肯定是会同步的了,直接搜索即可。

https://gitee.com/apache/flin...

然后打开 Git Bash,克隆这个项目

git@gitee.com:apache/flink.git

获取所有的分支

git fetch --tags

切换到 1.12.0 分支

git checkout release-1.12.0

这样最新发布的 1.12.0 版本源码就在本地了。

五、配置 Maven 阿里镜像

在导入 IDEA 之前,我们要配置 Maven 的镜像为阿里云的,这样下载 Jar 包比较快速。

在 Maven 安装目录的 conf 目录的 settings.xml 文件中,加入如下配置到 mirrors 标签中

<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>       
</mirror>

六、导入 IDEA

打开 IDEA,直接打开即可,等待它下载好所有的依赖

Flink源码阅读环境搭建并调试FlinkClients模块

导入后,可以看到有很多模块,但是各个模块的功能见名知意,非常清晰,这里我就不挨个介绍了。直接开始 Debug Flink-Clients 模块。

七、开始调试 Flink-Clients

首先想强调一下,为什么要调试这个模块。因为这个模块是提交 Flink 作业的入口模块,代码流程相对比较清晰,调试完,就可以知道 Flink 作业是怎么提交的了。

1、我们该调试哪个对象

回忆下,大数据的 Hello,World 程序是什么,是不是 WordCount,Flink 发行版自带的例子中,就有 WordCount 程序。

下面的图,我是下载了官网的 Flink-1.12 发行版,放到我的虚拟机上了。

Flink源码阅读环境搭建并调试FlinkClients模块

如何把它运行起来呢?

首先启动一个本机的 Flink 集群,把压缩包解压出来之后,什么都不要做,直接启动

cd /my2/flink/bin
./start-cluster.sh

提交 WordCount 程序到集群

./flink run ../examples/streaming/WordCount.jar

这样就直接把 WordCount 程序提交到集群上了,是怎么做到的呢?可以看看 flink 这个命令里面是什么

vi flink

移动到最后,可以发现

# Add HADOOP_CLASSPATH to allow the usage of Hadoop file systems
exec $JAVA_RUN $JVM_ARGS $FLINK_ENV_JAVA_OPTS "${log_setting[@]}" -classpath "`manglePathList "$CC_CLASSPATH:$INTERNAL_HADOOP_CLASSPATHS"`" org.apache.flink.client.cli.CliFrontend "$@"

原来它就是一个 java -classpath 类名,启动了一个 Java 虚拟机啊

这个类就是

org.apache.flink.client.cli.CliFrontend

这个类就是我们要运行的对象了

2、开始调试

可以看到 CliFrontend 里面有一个 main 方法,二话不说,直接 debug,报错了再说

果然,报错如下:

Flink源码阅读环境搭建并调试FlinkClients模块

说在环境变量中,没有找到 FLINK_CONF_DIR 配置,也就是 flink 配置文件没有找到,就是那个 flink-conf.yml 文件

这个文件其实是在发行目录下:

Flink源码阅读环境搭建并调试FlinkClients模块

然后配置一个

Flink源码阅读环境搭建并调试FlinkClients模块

在这个地方加上这个配置

Flink源码阅读环境搭建并调试FlinkClients模块
FLINK_CONF_DIR=D:\Code\flink\flink\flink-dist\src\main\resources

再运行一遍,报错如下

Flink源码阅读环境搭建并调试FlinkClients模块

原来是因为,我们之前在运行命令的时候,后面还有一坨参数,现在什么参数都没有往 main 方法传,当然报错了。

这里我们还需要一个 WordCount.jar 包,源码都有了,直接从源码打包一个出来,就是这么的任性了。

直接把 Flink : Examples : Streaming 模块打个包

Flink源码阅读环境搭建并调试FlinkClients模块

打完包之后,在 target 目录下,就会有一个 WordCount.jar 包了

Flink源码阅读环境搭建并调试FlinkClients模块

填到这个地方

run D:\Code\flink\flink\flink-examples\flink-examples-streaming\target\WordCount.jar
Flink源码阅读环境搭建并调试FlinkClients模块

然后再 Debug 看一下,发现它在这卡了很久,直到超时(WARNING 先不用管)

Flink源码阅读环境搭建并调试FlinkClients模块

这个是正常的,因为它在最后生成 JobGraph 之后,是要通过 JobClient 客户端,提交到集群上的(还记得我们那个配置文件吗?里面可是配了集群的 JobManager 地址和端口的),而我们在 Windows 本地并没有启动集群。

不过没有关系,我们可以通过调试代码,看到 StreamGraph 是如何生成的,JobGraph 是如何生成的,最后是通过哪个类准备提交到集群的。这些提交前的动作,都可以通过源码看得到!

七、总结

今天通过完整的下载 Flink 代码,配置环境,初步调试了 Flink-Clients 代码,大致清楚,一个实时作业在提交前要经过这么多的转换逻辑。里面的实现细节我们在下一次再讲!大家一定要把环境装好了!

来源:https://www.tuicool.com/articles/vUJrey3

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容