Apache Flink 源码解析(一)入口,bash脚本
概述
因为自己在阅读源码的过程中曾经遇到过很多问题,现在稍微有一点点的经验希望分享给很多从零开始的人。Apache的项目代码量很大,很难做到彻底通读,我也是一步一步的先从整体的架构来分析。阅读源码的好处有很多,在此就不一一赘述。
介绍
首先介绍以下flink,它是一个分布式,高容错,能保证每条消息只被处理一次的流处理引擎,也是对Google Dataflow模型的一个较好的开源实现,虽然还是有一些不足之处。虽然在runtime中用的是同一个引擎,但是却提供了针对stream和batch的两套api,不过在后续的更新中应该更好地加入了对sql的支持来完成统一。
本次解析参考的代码是flink1.2版本。
另外Flink是使用Scala和Java混编,关于Scala和分布式工具包Akka的学习资料后续我会补充。
入口
首先是找到入口。因为一个项目中可能有几个主函数,而且大数据相关的项目还会兼容Yarn和Mesos,入口的话就更多了。在这里我会用Local模式和Standalone Cluster模式来讲解,一方面对Yarn和Mesos相关的背景就不需要怎么介绍(事实是我还没学 : ( ...),另一方面入门门槛也稍低一些,还省略了很多代码可以以后再分析。
要找入口,那就要去找启动脚本,建议大家可以稍微学一下bash, 不说能写的多好,最起码能看懂启动脚本就行。
Flink的启动脚本源码在flink-dist/src/main/flink-bin/bin文件夹下,其中有start-cluster和start-local。其中start-local的代码很简单
start-local.sh代码片段就是调用同文件夹下的jobmanager.sh脚本,因为是本地模式,所以输入参数是local。其中taskmanager的启动时嵌入在同一个jvm中,后面会做解析。
而start-cluster集群模式下的运行就较为复杂
start-cluster.sh代码片段在这里不会对Zookeeper下的高可用模式进行介绍,只介绍普通集群模式,所以直接参考else后面的语句,同样是运行jobmanager脚本,只是第二个命令行参数变成了cluster。所以接下来去看jobmanager.sh。jobmanager.sh在对入参进行了一系列判断之后,会到以下代码块。
jobmanager.sh代码片段不管是前台运行还是后台运行,都会调用flink-daemon.sh脚本,下面就是启动脚本的核心。
flink-daemon.sh代码片段判断部分在flink中,他会根据先前运行的脚本调用daemon脚本,所以需要运行的可能不只是jobmanager,在这儿因为我们是从jobmanager.sh中进入daemon,所以需要运行的class是org.apache.flink.runtime.jobmanaer.JobManager,所以我们看源码的入口也就在这个类。
以下是启动jvm将该类作为主程序的运行,其中很多事jvm的启动参数,不做细讲。
flink-daemon.sh代码片段运行部分总结
至此,flink的local与cluster启动脚本应该已经比较清晰,如果想开始阅读源码的话就从org.apache.flink.runtime.jobmanaer.JobManager这个类开始看起。因为flink中基于akka的部分大部分是使用scala实现,所以建议可以先去看scala文档,或者runoob.com的scala入门教程,后续还可以研读Scala In Depth这本书。
下一篇解析将探讨Flink的总体架构,与代码中启动的流程