大家好,我是你们的建哥,一个始终站在技术一线的Leader。又到了一天最惬意的时光,泡上一杯绿茶,跟着我一起回顾平时无法系统梳理的知识。
这个是彻底搞定Flink系列的第一篇文章。彻底搞定Flink系列是站在学习者的角度循序渐进地来学习Flink,彻底搞定Flink。一开始了解太多,会产生非常强的畏难情绪,导致“从入门到放弃”。
这一章来快速理解Flink架构模式与运行一个HelloWorld程序。
为什么应该选择Flink?
相比较传统的大数据框架(如Hadoop、Spark),Flink相比较Hadoop和Spark,有三个明显不能比拟的优势:
- 国人(Alibaba)主导的项目,因此中文社区极其活跃,其文档丰富程度和响应速度非常快;
- 架构清晰合理,无论是上手还是使用,其门槛都低于传统的大数据框架;
- 流批一体,是下一代的大数据框架。尤其是拥有强大的ETL的能力!,什么kettle这样古老的ETL工具可以放弃了!
当然,Flink只是计算平台,不会存储数据,所以需要和Hadoop这样偏离线存储性质的大数据平台进行结合,但是对于同为计算平台的Spark,明显是有替代趋势。
Flink的文档地址
Flink通过jira和confluence来管理flink项目,可以在这上面找到最权威的资料。
jira:issues.apache.org/jira/projec…
confluence:cwiki.apache.org/confluence/…
运行Flink之前需要理解的概念
架构模式
Flink是一种典型的主从模式架构(Master-Work模式),其模式架构如下:
关于分布式架构模式,后面会专门抽时间讲解。
Flink 集群关键角色
Flink 运行时由两种类型的进程组成:一个 JobManager 和一个或者多个 TaskManager。
JobManager 其实就是Flink的 master 服务,主要负责自己作业相关的协调工作,包括:向 TaskManager 申请 Slot资源来调度相应的 task 任务、定时触发作业的 checkpoint 和手动 savepoint 的触发、以及作业的容错恢复等。
JobManager还可以细分,但是先忽略它,我们后面会逐步的一步步的学习。现在我们只需要知道他是Master即可。
TaskManagers(也称为 worker)就是真正干活的,执行作业流的 task,并且缓存和交换数据流。很显然,必须始终至少有一个TaskManager(不然谁来干活?)。在TaskManager中资源调度的最小单位是 task slot。
同样的,TaskManagers里面还有更多的角色,先不要太过深入,这样会绕晕,现在我们只需要知道他是Worker即可。
部署模式的说明
可以通过多种方式运行Flink,即启动JobManager和TaskManager:
- 直接在机器上运行的就叫Standalone模式,不依赖任何外部的力量;
- 另外两种运行方式就是在容器中、或者通过YARN 这样的资源框架上启动,由资源管理框架来管理资源。
高可用架构
很多人搞不清楚一个分布式系统架构模式和高可用模式有什么区别。所以这里单独说明:一个分布式系统的架构模式和高可用架构没有任何关系。一个分布式系统完全可以没有高可用。同样的,高可用架构或者说高可用部署是随着分布式系统的本身架构+部署形态来来展开的,不能本末倒置。
回到Flink,其高可用部署主要针对JobManager(真正干活的Worker因为随时要存储执行进度并且通知Master,所以无需高可用):
无论哪种模式启动,始终至少有一个JobManager。高可用配置中会有多个JobManager,但是只能有一个在工作(leader),其他的则是standby,准备随时接替Leader。
因此,对于Standalone模式,需要借助外部的框架,比如说Zookeeper来监听JobManager状态,一旦有问题,备份上; 对于像容器模式或者Yarn部署,一主一备不是必须的,因为如果JobManager挂了,可以直接通过资源管理工具拉起来,当然一主一备是更好的。
值得说明的是,为了适应容器化需要,Flink专门为K8s环境设置了一个高可用模式。因此,Flink官方提供了两种高可用服务实现:
- ZooKeeper:每个 Flink 集群部署都可以使用 ZooKeeper HA 服务。它们需要一个运行的 ZooKeeper 复制组(quorum)。
- Kubernetes:Kubernetes HA 服务只能运行在 Kubernetes 上。
当然,关于高可用的细节非常多,还是那句话,先不要太过深入,这样会绕晕,现在我们只需要知道Flink的高可用是怎么回事即可。
快速启动Flink
从flink.apache.org/downloads.h… 下载最新的Flink,目前最新的是1.6.1。注意,不是下载源码:
解压,运行bin目录下的./start-cluster.sh文件(前提是Java 8安装好,尽量安装Java8,JDK11也可以,但是更高版本就不保证)。如果端口没有被占用,那么基本上都会启动成功。
进入到http://localhost:8081/#/overview 页面如下:
端口被占用的处理
进入到log目录,查看日志,如果有如下错误,则意味着端口被占用:
通过sudo lsof -i tcp:8081
命令查看端口被占用情况(注意,这个时候必须加sudo,否则什么都查不出来):
如果端口被占用,进入到conf目录的 flink-conf.yaml rest.port
取消注释,换成别的端口即可。
其他的端口类似。
flink-conf.yaml配置说明
在1.16版本中,conf目录下有如下配置:flink-conf.yaml 配置、日志的配置文件、zk配置以及master/workers文件。
在flink1.14.0中已经移除sql-client-defaults.yml配置文件了。相关联的参考地址:issues.apache.org/jira/browse… 以及cwiki.apache.org/confluence/… 还是那句话,先不要管它。后
flink-conf.yaml的原文地址在这里,还是那句话,先只关注当下需要的:
配置 | 说明 |
---|---|
jobmanager.rpc.address | Jobmanager的IP地址,即master地址。默认是localhost,此参数在HA环境下或者Yarn下无效,仅在local和无HA的standalone集群中有效 |
jobmanager.rpc.port | JobMamanger的通信端口,默认是6123,TaskManager以及各种client(如Sql Client)通过这个端口和JobMamanger通信 |
rest.port | Job Managener网页管理页面地址 |
运行官方的Sample
进入到Submit New Job,这个是上传jar包的地方:
在解压的包中examples/streaming/中选择一个典型的流式处理的sample:SocketWindowWordCount.jar 并上传:
点击这一行(注意不要点击到Delete上面)设置参数并且运行。
注意,要先运行nc -l 8888
否则,启动任务会报错。因为任务启动以后,会建立socket连接,任务建立不上就会失败。
成功运行的截图如下:
这个时候,可能会号好奇很多点:
- parallelism和savepoint Path是什么?有什么用
- 为什么运行参数要这么填写?
- 各个页面的展示信息到底是什么含义?
是的,我们还是先忽略它。在下一章,我们将深入分析这些东西。现在,我们只需要确保能跑起来。
现在,可以在终端进行输入:
bin ajian$ nc -l 8888
q
w
ww
w
ww
w
w
w
hello flink!
hello
在TaskManagers页面可以看到如下的输出:
至此,一个Flink的HelloWorld成功了!还是那句话,目标是Hello World,接下来,我们带着问题一步步的深入其中,探寻Flink的神秘地带。