读文档和读源码的目的是不同的,就拿 Apache Flink 这个项目来讲,若是你想知道 Flink 的使用功能,设计思想,实现原理,看官方文档就足够了;若是你想了解的就是具体细节,好比说 StreamGraph 是怎么生成的或者是 Exactly Once 究竟如何实现的,那么就须要去阅读源码了。java
关键是看你的目的是什么,若是你想了解思想,经验等看文档就够了,由于文档是人写给人的;若是你想了解具体细节,那应该去看源码,由于源码是人写给机器的,源码里有到底作了什么这些事情。git
那么我写这篇的文章目的是什么?个人目的是,万一你已经在生产上身经百战了,对 Flink 的原理都把握住了,那么看源码是对你来讲最好的进阶方式,因此我为你准备了这篇搭建环境的教程,为你节约宝贵的时间陪家人陪孩子不香吗?github
一般对于阅读源码这件事情来讲是有方法论可循的。算法
这些前提知识准备好了以后,你就对这个项目有了一个感性的认识,再去阅读它的代码就轻松一些了。shell
在阅读代码过程当中,不是说拿到源码就直接从第一个模块一行行的开始读,这样很容易迷失方向,陷入到代码细节中无可自拔。apache
接口抽象定义。任何项目代码都会有不少接口,接口的继承关系和方法,描述了它处理的数据结构,业务实体以及和其余模块的关系,理清楚这些关系是很是重要的。设计模式
模块粘合层。代码中不少的设计模式,都是为了解耦各个模块的,好处就是灵活扩展,坏处就是让原本平铺直述的代码割裂成一个个模块,不那么方便阅读。安全
业务流程。在代码一开始,不要进入细节,一方面会打消你的积极性,一方面也看不过来。要站在必定的高度,搞清楚整个的业务流程是怎样的,数据是怎么被传递的。最好能够画流程图或者时序图,方便理解和记忆。数据结构
具体实现。在具体实现中,仍然须要弄清楚一些重要的点ssh
(1)代码逻辑。在代码中,有业务逻辑,是真正的业务处理逻辑;还有控制逻辑,像流程流转之类的;
(2)出错处理。其实不少地方都是在处理出错的逻辑,能够忽略掉这部分逻辑,排除干扰因素;
(3)数据处理。属性转换,JSON 解析,XML 解析,这些代码都比较冗长和无聊,能够忽略;
(4)重要的算法。这是比较核心的地方,也是最有技术含量的地方;
(5)底层交互。有一些代码是和底层操做系统或者是和 JVM 交互的,须要知道一些底层的东西;
运行时调试。这是最直接的方式,能够看到代码到底是如何跑起来的,数据是怎么样的,是了解代码最重要的方式。
总结成一句话:高屋建瓴,提纲挈领,把握方向
好了,有了这些内容心法,下面开始实战吧!
我就不具体演示了,说一下大体流程,能够自行百度,相关的文章不少的。
下载对应平台(Windows,Mac)的 Git 客户端,并安装
下载地址:https://git-scm.com/downloads
$ git config --global user.name "Your Name" $ git config --global user.email yourEmail@example.com
ssh-keygen -t rsa
登录 Gitee,在头像 - 设置 - 安全设置 - SSH 公钥 添加一个公钥
GitHub 很慢如何下载好几十 M 的源码文件呢?
你想下载任意 GitHub 项目,均可以在 Gitee 上导入这个 Github 项目:
导入以后,就能够下载了。固然 Apache Flink 活跃度前几的项目,Gitee 确定是会同步的了,直接搜索便可。
https://gitee.com/apache/flink?_from=gitee_search
而后打开 Git Bash,克隆这个项目
git@gitee.com:apache/flink.git
获取全部的分支
git fetch --tags
切换到 1.12.0 分支
git checkout release-1.12.0
这样最新发布的 1.12.0 版本源码就在本地了。
在导入 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,直接打开便可,等待它下载好全部的依赖
导入后,能够看到有不少模块,可是各个模块的功能见名知意,很是清晰,这里我就不挨个介绍了。直接开始 Debug Flink-Clients 模块。
首先想强调一下,为何要调试这个模块。由于这个模块是提交 Flink 做业的入口模块,代码流程相对比较清晰,调试完,就能够知道 Flink 做业是怎么提交的了。
回忆下,大数据的 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
这个类就是咱们要运行的对象了
能够看到 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 代码,大体清楚,一个实时做业在提交前要通过这么多的转换逻辑。里面的实现细节咱们在下一次再讲!你们必定要把环境装好了!
下次见!
关注公众号,回复,加群,海量资料等着你