flink系列文章中,flink版本是1.9.0
什么是flink
引用官网的一句话:数据流上的有状态计算。
优势
Flink 提供了 State、Checkpoint、Time、Window 等,它们为 Flink 提供了容错性、实效性等优势。
部署方式
- Local:直接在 IDE 中运行 Flink Job 时则会在本地启动一个 mini Flink 集群。
- Standalone:在 Flink 目录下执行 bin/start-cluster.sh 脚本则会启动一个 Standalone 模式的集群。
- YARN:YARN 是 Hadoop 集群的资源管理系统,它可以在群集上运行各种分布式应用程序,Flink 可与其他应用并行于 YARN 中。
- Kubernetes:Kubernetes 是 Google 开源的容器集群管理系统,在 Docker 技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性,Flink 也支持部署在 Kubernetes 上,在 GitHub 看到有下面这种运行架构的。
作业提交架构流程
- Job Client:Job Client 不是 Flink 程序执行的内部部分,但它是任务执行的起点。Job Client 负责接受用户的程序代码,然后创建数据流,将数据流提交给 Job Manager 以便进一步执行。执行完成后,Job Client 将结果返回给用户。
- Job Manager:主进程(也称为作业管理器)协调和管理程序的执行。它的主要职责包括安排任务、管理 checkpoint 、故障恢复等。机器集群中至少要有一个 master,master 负责调度 task、协调 checkpoints 和容灾,高可用设置的话可以有多个 master,但要保证一个是 leader,其他是 standby。Job Manager 包含 Actor system、Scheduler、Check pointing 三个重要的组件。
- Task Manager:从 Job Manager 处接收需要部署的 Task。Task Manager 是在 JVM 中的一个或多个线程中执行任务的工作节点。任务执行的并行性由每个 Task Manager 上可用的任务槽(Slot 个数)决定。每个任务代表分配给任务槽的一组资源。例如,如果 Task Manager 有四个插槽,那么它将为每个插槽分配 25% 的内存。可以在任务槽中运行一个或多个线程。同一插槽中的线程共享相同的 JVM。
程序结构
Flink API
- 最底层提供了有状态流。它将通过 Process Function 嵌入到 DataStream API 中。它允许用户可以自由地处理来自一个或多个流数据的事件,并使用一致性、容错的状态。除此之外,用户可以注册事件时间和处理事件回调,从而使程序可以实现复杂的计算。
- DataStream/DataSet API 是 Flink 提供的核心 API,DataSet 处理有界的数据集,DataStream 处理有界或者无界的数据流。用户可以通过各种方法(map/flatmap/window/keyby/sum/max/min/avg/join 等)将数据进行转换或者计算。
- Table API 是以表为中心的声明式 DSL,其中表可能会动态变化(在表达流数据时)。Table API 提供了例如 select、project、join、group-by、aggregate 等操作,使用起来却更加简洁(代码量更少)。 你可以在表与 DataStream/DataSet 之间无缝切换,也允许程序将 Table API 与 DataStream 以及 DataSet 混合使用。
- Flink 提供的最高层级的抽象是 SQL 。这一层抽象在语法与表达能力上与 Table API 类似,但是是以 SQL查询表达式的形式表现程序。SQL 抽象与 Table API 交互密切,同时 SQL 查询可以直接在 Table API 定义的表上执行。 Flink 除了 DataStream 和 DataSet API,它还支持 Table/SQL API,Flink 也将通过 SQL API 来构建统一的大数据流批处理引擎,因为在公司中通常会有那种每天定时生成报表的需求(批处理的场景,每晚定时跑一遍昨天的数据生成一个结果报表),但是也是会有流处理的场景(比如采用 Flink 来做实时性要求很高的需求),于是慢慢的整个公司的技术选型就变得越来越多了,这样开发人员也就要面临着学习两套不一样的技术框架,运维人员也需要对两种不一样的框架进行环境搭建和作业部署,平时还要维护作业的稳定性。
支持的connector
- 不同版本的 Kafka
- 不同版本的 ElasticSearch
- Redis
- MySQL
- Cassandra
- RabbitMQ
- HBase
- HDFS
- …
处理时间语义
支持Event time、Ingestion Time、Processing Time
灵活的窗口机制
Time Window、Count Window、Session Window,还支持自定义 Window
支持状态存储
Keyed State 和 Operator State,在 Keyed State 中又提供了多种数据结构:
- ValueState
- MapState
- ListState
- ReducingState
- AggregatingState
另外状态存储也支持多种方式: - MemoryStateBackend:存储在内存中
- FsStateBackend:存储在文件中
- RocksDBStateBackend:存储在 RocksDB 中
checkpoint机制
使用 Checkpoint 来提高程序的可靠性,开启了 Checkpoint 之后,Flink 会按照一定的时间间隔对程序的运行状态进行备份,当发生故障时,Flink 会将所有任务的状态恢复至最后一次发生 Checkpoint 中的状态,并从那里开始重新开始执行。
另外 Flink 还支持根据 Savepoint 从已停止作业的运行状态进行恢复,这种方式需要通过命令进行触发。
WaterMark机制
提供了WaterMark来处理延迟数据。
同时对于更迟到的数据还有另外处理机制
内存管理机制
Flink 在 JVM 中提供了自己的内存管理,使其独立于 Java 的默认垃圾收集器。它通过使用散列、索引、缓存和排序有效地进行内存管理
其他机制…
注:准备做一个Flink的系列博客,一方面加深自己学习,一方面给大家分享,博客参阅了Flink官网,再结合自己的理解写成的,本人也是初学者,如果有讲的错误的地方,欢迎大家留言指正。
注:本文只是概要的说下Flink,对于上述的东西后续都会有细说!
来源:CSDN
作者:Hello Guava
链接:https://blog.csdn.net/weixin_42155491/article/details/104878212