这是我参与「第四届青训营 」笔记创作活动的第8天
第 1 章 初识 Flink
Flink 是 Apache 基金会旗下的一个开源大数据处理框架。目前,Flink 已经成为各大公司 大数据实时处理的发力重点,特别是国内以阿里为代表的一众互联网大厂都在全力投入,为 Flink 社区贡献了大量源码。
Flink 是一个大数据流处理引擎,它可以为不同的行业提供大数据实时处理的解决方案。随着 Flink 的快速发展完善,如今在世界范围许多公司都可以见到 Flink 的身影。
Flink 主要的应用场景
- 电商和市场营销 在电商行业中,网站点击量是统计 PV、UV 的重要来源,也是如今“流量经济”的最主要数据指标。很多公司的营销策略,比如广告的投放,也是基于点击量来决定的。另外,在网站上提供给用户的实时推荐,往往也是基于当前用户的点击行为做出的。
- 物联网(IOT)传感器实时数据采集和显示、实时报警,交通运输业
- 订单状态实时更新、通知信息推送
- 实时结算和通知推送,实时检测异常行为。
Flink 的特性总结
Flink 区别与传统数据处理框架的特性如下。
⚫ 高吞吐和低延迟。每秒处理数百万个事件,毫秒级延迟。
⚫ 结果的准确性。Flink 提供了事件时间(event-time)和处理时间(processing-time)语义。对于乱序事件流,事件时间语义仍然能提供一致且准确的结果。
⚫ 精确一次(exactly-once)的状态一致性保证。
⚫ 可以连接到最常用的存储系统,如 Apache Kafka、Apache Cassandra、Elasticsearch、JDBC、Kinesis 和(分布式)文件系统,如 HDFS 和 S3。
⚫ 高可用。本身高可用的设置,加上与 K8s,YARN 和 Mesos 的紧密集成,再加上从故 障中快速恢复和动态扩展任务的能力,Flink 能做到以极少的停机时间 7×24 全天候 运行。
⚫ 能够更新应用程序代码并将作业(jobs)迁移到不同的 Flink 集群,而不会丢失应用 程序的状态。
Flink vs Spark
- 批处理针对的是有界数据集,非常适合需要访问海量的全部数据才能完成的计算工作,一 般用于离线统计。
- 流处理主要针对的是数据流,特点是无界、实时, 对系统传输的每个数据依次执行操作, 一般用于实时统计。
- 无界数据流(Unbounded Data Stream)
- 有界数据流(Bounded Data Stream)
从根本上说,Spark 和 Flink 采用了完全不同的数据处理方式。可以说,两者的世界观是
截然相反的
Flink的优点(或者我们为什么选择Flink)
⚫ Flink 的延迟是毫秒级别,而 Spark Streaming 的延迟是秒级延迟。
⚫ Flink 提供了严格的精确一次性语义保证。
⚫ Flink 的窗口 API 更加灵活、语义更丰富。
⚫ Flink 提供事件时间语义,可以正确处理延迟数据。
⚫ Flink 提供了更加灵活的对状态编程的 API。
第二章 Flink 部署
3.1.1 环境配置
Flink 是一个分布式的流处理框架,所以实际应用一般都需要搭建集群环境。我们在进行
Flink 安装部署的学习时,需要准备 3 台 Linux 机器。具体要求如下:
⚫ 系统环境为 CentOS 7.5 版本。
⚫ 安装 Java 8。
⚫ 安装 Hadoop 集群,Hadoop 建议选择 Hadoop 2.7.5 以上版本。
⚫ 配置集群节点服务器间时间同步以及免密登录,关闭防火墙。三台服务器的具体设置如下(具体配置环节可以参考之前的文章):
⚫ 节点服务器 1,IP 地址为 192.168.10.102,主机名为 hadoop102。
⚫ 节点服务器 2,IP 地址为 192.168.10.103,主机名为 hadoop103。
⚫ 节点服务器 3,IP 地址为 192.168.10.104,主机名为 hadoop104。
本地启动
- 下载安装包
进入 Flink 官网,下载 1.13.0 版本安装包 flink-1.13.0-bin-scala_2.12.tgz,注意此处选用对应 scala 版本为 scala 2.12 的安装包。
- 解压
在 hadoop102 节点服务器上创建安装目录/opt/module,将 flink 安装包放在该目录下,并执行解压命令,解压至当前目录。
$ tar -zxvf flink-1.13.0-bin-scala_2.12.tgz -C /opt/module/
flink-1.13.0/
flink-1.13.0/log/
flink-1.13.0/LICENSE
flink-1.13.0/lib/
- 启动
进入解压后的目录,执行启动命令,并查看进程。
$ cd flink-1.13.0/
$ bin/start-cluster.sh
Starting cluster.
Starting standalonesession daemon on host hadoop102.
Starting taskexecutor daemon on host hadoop102.
$ jps
10369 StandaloneSessionClusterEntrypoint
10680 TaskManagerRunner
10717 Jps
- 访问 Web UI
启动成功后,访问 http://hadoop102:8081, 可以对 flink 集群和任务进行监控管理,如x下图所示
5. 关闭集群
如果想要让 Flink 集群停止运行,可以执行以下命令:
$ bin/stop-cluster.sh
Stopping taskexecutor daemon (pid: 10680) on host hadoop102.
Stopping standalonesession daemon (pid: 10369) on host hadoop102.
第三章 系统架构
Flink 的运行时架构中,最重要的就是两大组件:作业管理器(JobManger)和任务管理器 (TaskManager)。对于一个提交执行的作业,JobManager 是真正意义上的“管理者”(Master),负责管理调度,所以在不考虑高可用的情况下只能有一个;而 TaskManager 是“工作者”(Worker、Slave),负责执行任务处理数据,所以可以有一个或多个。
TaskManager 启动之后,JobManager 会与它建立连接,并将作业图(JobGraph)转换成可
执行的“执行图”(ExecutionGraph)分发给可用的 TaskManager,然后就由 TaskManager 具体执行任务。
1.作业管理器(JobManager)
JobManager 是一个 Flink 集群中任务管理和调度的核心,是控制应用执行的主进程。也就 是说,每个应用都应该被唯一的 JobManager 所控制执行。当然,在高可用(HA)的场景下,可能会出现多个 JobManager;这时只有一个是正在运行的领导节点(leader),其他都是备用节点(standby)。JobManger 又包含 3 个不同的组件,下面我们一一讲解。
- JobMaster JobMaster 是 JobManager 中最核心的组件,负责处理单独的作业(Job)。所以JobMaster和具体的 Job 是一一对应的,多个 Job 可以同时运行在一个 Flink 集群中, 每个 Job 都有一个自己的 JobMaster。在作业提交时,JobMaster 会先接收到要执行的应用。这里所说“应用”一般是客户端提交来的,包括:Jar 包,数据流图(dataflow graph),和作业图(JobGraph)。
- 资源管理器(ResourceManager) ResourceManager 主要负责资源的分配和管理,在 Flink 集群中只有一个。所谓“资源”, 主要是指 TaskManager 的任务槽(task slots)。任务槽就是 Flink 集群中的资源调配单元,包含了机器用来执行计算的一组 CPU 和内存资源。每一个任务(Task)都需要分配到一个 slot 上执行。 Flink 的 ResourceManager,针对不同的环境和资源管理平台(比如 Standalone 部署,或者YARN),有不同的具体实现
- 分发器(Dispatcher) Dispatcher 主要负责提供一个 REST 接口,用来提交应用,并且负责为每一个新提交的作 业启动一个新的 JobMaster 组件。Dispatcher 也会启动一个 Web UI,用来方便地展示和监控作业执行的信息。
任务管理器(TaskManager)
TaskManager 是 Flink 中的工作进程,数据流的具体计算就是它来做的,所以也被称为 “Worker”。Flink 集群中必须至少有一个 TaskManager;当然由于分布式计算的考虑,通常会有多个 TaskManager 运行,每一个 TaskManager 都包含了一定数量的任务槽(task slots)。Slot是资源调度的最小单位,slot 的数量限制了 TaskManager 能够并行处理的任务数量。启动之后,TaskManager 会向资源管理器注册它的 slots;收到资源管理器的指令后,TaskManager 就会将一个或者多个槽位提供给 JobMaster 调用,JobMaster 就可以分配任务来执行了。