彻底搞定Flink系列-快速理解Flink架构与HelloWorld

1,164 阅读6分钟

大家好,我是你们的建哥,一个始终站在技术一线的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模式),其模式架构如下: image.png

关于分布式架构模式,后面会专门抽时间讲解。

Flink 集群关键角色

Flink 运行时由两种类型的进程组成:一个 JobManager 和一个或者多个 TaskManagerimage.png

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。注意,不是下载源码:

image.png

解压,运行bin目录下的./start-cluster.sh文件(前提是Java 8安装好,尽量安装Java8,JDK11也可以,但是更高版本就不保证)。如果端口没有被占用,那么基本上都会启动成功。

进入到http://localhost:8081/#/overview 页面如下:

image.png

端口被占用的处理

进入到log目录,查看日志,如果有如下错误,则意味着端口被占用: image.png

通过sudo lsof -i tcp:8081命令查看端口被占用情况(注意,这个时候必须加sudo,否则什么都查不出来):

image.png

如果端口被占用,进入到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.addressJobmanager的IP地址,即master地址。默认是localhost,此参数在HA环境下或者Yarn下无效,仅在local和无HA的standalone集群中有效
jobmanager.rpc.portJobMamanger的通信端口,默认是6123,TaskManager以及各种client(如Sql Client)通过这个端口和JobMamanger通信
rest.portJob Managener网页管理页面地址

运行官方的Sample

进入到Submit New Job,这个是上传jar包的地方:

image.png

在解压的包中examples/streaming/中选择一个典型的流式处理的sample:SocketWindowWordCount.jar 并上传: 企业微信截图_5d15e9e3-d8d6-4eb3-9ade-3a8b15de76ef.png

点击这一行(注意不要点击到Delete上面)设置参数并且运行。

注意,要先运行nc -l 8888 否则,启动任务会报错。因为任务启动以后,会建立socket连接,任务建立不上就会失败。

image.png

成功运行的截图如下:

image.png

这个时候,可能会号好奇很多点:

  • parallelism和savepoint Path是什么?有什么用
  • 为什么运行参数要这么填写?
  • 各个页面的展示信息到底是什么含义?

是的,我们还是先忽略它。在下一章,我们将深入分析这些东西。现在,我们只需要确保能跑起来。

现在,可以在终端进行输入:

bin ajian$ nc -l 8888
q
w
ww
w
ww
w
w
w
hello flink!
hello

在TaskManagers页面可以看到如下的输出: image.png

至此,一个Flink的HelloWorld成功了!还是那句话,目标是Hello World,接下来,我们带着问题一步步的深入其中,探寻Flink的神秘地带。