继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Apache Flink 源码解析(一)入口,bash脚本

慕的地10843
关注TA
已关注
手记 1081
粉丝 201
获赞 962

概述

因为自己在阅读源码的过程中曾经遇到过很多问题,现在稍微有一点点的经验希望分享给很多从零开始的人。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的代码很简单


webp

start-local.sh代码片段

就是调用同文件夹下的jobmanager.sh脚本,因为是本地模式,所以输入参数是local。其中taskmanager的启动时嵌入在同一个jvm中,后面会做解析。

而start-cluster集群模式下的运行就较为复杂


webp

start-cluster.sh代码片段

在这里不会对Zookeeper下的高可用模式进行介绍,只介绍普通集群模式,所以直接参考else后面的语句,同样是运行jobmanager脚本,只是第二个命令行参数变成了cluster。所以接下来去看jobmanager.sh。jobmanager.sh在对入参进行了一系列判断之后,会到以下代码块。


webp

jobmanager.sh代码片段


不管是前台运行还是后台运行,都会调用flink-daemon.sh脚本,下面就是启动脚本的核心。


webp

flink-daemon.sh代码片段判断部分

在flink中,他会根据先前运行的脚本调用daemon脚本,所以需要运行的可能不只是jobmanager,在这儿因为我们是从jobmanager.sh中进入daemon,所以需要运行的class是org.apache.flink.runtime.jobmanaer.JobManager,所以我们看源码的入口也就在这个类。

以下是启动jvm将该类作为主程序的运行,其中很多事jvm的启动参数,不做细讲。


webp

flink-daemon.sh代码片段运行部分

总结

至此,flink的local与cluster启动脚本应该已经比较清晰,如果想开始阅读源码的话就从org.apache.flink.runtime.jobmanaer.JobManager这个类开始看起。因为flink中基于akka的部分大部分是使用scala实现,所以建议可以先去看scala文档,或者runoob.com的scala入门教程,后续还可以研读Scala In Depth这本书。



作者:铛铛铛clark
链接:https://www.jianshu.com/p/5903f6c8667c


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP