乐趣区

关于大数据:Flink-源码阅读环境搭建并调试-FlinkClients-模块

本文纲要

一、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 我的项目:

导入之后,就能够下载了。当然 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,间接关上即可,期待它下载好所有的依赖

导入后,能够看到有很多模块,然而各个模块的性能见名知意,十分清晰,这里我就不挨个介绍了。间接开始 Debug Flink-Clients 模块。

七、开始调试 Flink-Clients

首先想强调一下,为什么要调试这个模块。因为这个模块是提交 Flink 作业的入口模块,代码流程绝对比拟清晰,调试完,就能够晓得 Flink 作业是怎么提交的了。

1、咱们该调试哪个对象

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

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

如何把它运行起来呢?

首先启动一个本机的 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_CONF_DIR 配置,也就是 flink 配置文件没有找到,就是那个 flink-conf.yml 文件

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

而后配置一个

在这个中央加上这个配置

FLINK_CONF_DIR=D:\Code\flink\flink\flink-dist\src\main\resources

再运行一遍,报错如下

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

这里咱们还须要一个 WordCount.jar 包,源码都有了,间接从源码打包一个进去,就是这么的任性了。

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

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

填到这个中央

run D:\Code\flink\flink\flink-examples\flink-examples-streaming\target\WordCount.jar

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

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

不过没有关系,咱们能够通过调试代码,看到 StreamGraph 是如何生成的,JobGraph 是如何生成的,最初是通过哪个类筹备提交到集群的。这些提交前的动作,都能够通过源码看失去!

七、总结

明天通过残缺的下载 Flink 代码,配置环境,初步调试了 Flink-Clients 代码,大抵分明,一个实时作业在提交前要通过这么多的转换逻辑。外面的实现细节咱们在下一次再讲!大家肯定要把环境装好了!

下次见!

退出移动版