目录
***5. Kubernetes容器部署(Kubernetes Mode)
什么是Flink
Flink当然是一只可爱的小松鼠啦~(抖机灵)。
Apache Flink 诞生于柏林工业大学的一个研究性项目,原名 StratoSphere 。2014 年,由 StratoSphere 项目孵化出一只可爱的 Flink小松鼠,并于同年捐赠 Apache,之后成为 Apache 的顶级项目。
简单来说,Flink是一个批处理和流处理结合的统一计算框架,其核心是一个提供了数据分发以及并行化计算的流数据处理引擎它能够对有界和无界的数据流进行高效的处理。Flink 的核心是流处理,当然它也能支持批处理,Flink 将批处理看成是流处理的一种特殊情况(即数据是bounded的)。
Flink的特点
统一处理模型:
Flink 同时支持流处理和批处理,通过统一的API简化了不同数据处理场景下的编程复杂性。
高性能:基于内存的计算引擎和优化的状态管理,Flink 能够提供高吞吐量和低延迟的数据处理能力,满足实时分析需求。
精确一次语义:
通过强大的状态管理和容错机制,Flink 能够确保数据处理的精确一次(Exactly-once)语义,保障数据处理的一致性和正确性。
分层API:
提供DataStream API、Table API和SQL API等多层次API,满足不同开发者和不同使用场景的需求,从底层操作到高级声明式查询均可覆盖。
高可用性和容错性:
支持高可用配置和保存点(Savepoint)机制,确保在故障发生时能够迅速恢复作业,保障数据处理的连续性和安全性。
灵活的部署选项:
支持多样化的部署方式,包括本地、远程集群以及云端环境,便于用户根据具体需求和环境进行选择和部署。
可扩展架构:
采用横向扩展架构,支持根据业务需求动态调整资源,实现弹性扩容,满足大数据处理的高并发需求。
活跃的社区和完善的生态:
拥有活跃的开发者社区和完善的生态系统,提供丰富的连接器和集成方案,方便用户与其他大数据和机器学习工具进行集成和扩展。
维度 | SparkStreaming | Flink |
设计理念和核心 | 建立在Spark之上的流式计算框架,通过Spark提供的API和基于内存的高速计算引擎,使用批处理进行micro-batch流式计算。 | 面向分布式数据流处理和批量数据处理的开源计算框架,以流为核心,批处理是流处理的一个特例。 |
时间机制 | 主要支持处理时间(Processing Time),即数据被处理时系统的时间。最新的Structured Streaming则支持处理时间和事件时间(Event Time),并可以使用watermark机制处理滞后数据。 | 支持三种时间机制:事件时间(Event Time)、摄入时间(Ingestion Time)和处理时间(Processing Time)。通过watermark机制处理滞后数据,保证事件时间下的时序性。 |
执行模型 | 采用微批处理(Micro-Batch)模型,将连续的数据流划分为一系列小的批次,然后对每个批次进行批量处理。 | 基于事件时间的连续处理模型,实现了精确的状态管理和事件处理,适用于对数据实时性要求较高的场景。 |
容错机制 | 基于RDD(弹性分布式数据集)的容错机制,默认情况下只能实现至少一次语义(At-Least-Once Semantics)。在发生故障时,可能会丢失微批数据之间的状态,并在重新计算时产生重复的结果。 | 提供了基于检查点(Checkpoints)的精确一次语义(Exactly-Once Semantics)的容错机制。通过周期性地生成检查点来持久化流处理应用程序的状态,并在发生故障时能够精确地从检查点恢复状态,确保数据处理的准确性和一致性。 |
窗口操作 | 支持滚动窗口(Tumbling Windows)和滑动窗口(Sliding Windows),但窗口操作是基于微批数据的,无法实现像Flink那样的精确事件时间处理。 | 提供了丰富的窗口操作支持,包括滚动窗口、滑动窗口、会话窗口等多种类型的窗口。还支持动态窗口和自定义窗口函数,能够灵活地应对不同的业务需求。 |
状态管理 | 状态管理相对复杂,需要外部解决方案来管理状态。 | 内置状态管理,简化了状态管理的复杂性,并提供了强大的状态一致性保证 |
延迟 | 由于采用微批处理模型,因此具有一定的处理延迟。每个批次的处理时间通常在几秒到几十秒之间。 | 具有低延迟处理的能力,可以实现毫秒级的延迟。通过灵活的事件时间处理和流水线执行模型来实现高效的数据处理。 |
扩展性和部署 | 依赖于Spark集群进行扩展,支持本地模式和集群模式。资源管理相对简单,依赖于Spark集群管理器来管理计算资源。 | 提供了多种部署模式,包括本地模式、集群模式和云服务模式。支持灵活的资源管理和动态扩缩容,能够根据业务需求选择合适的部署方式。 |
编程模型 | 基于Spark RDD模型,用户需要熟悉Spark的编程模型。 | 拥有自己的流式处理API,用户可以使用更简洁和直观的API来编写流处理应用。(在文章后续我会详细讲解Flink的API层次) |
Flink核心的层次架构
由上而下分别是 API & Libraries 层、Runtime 核心层以及 deploy(物理部署)层:
API & Libraries 层
这一层主要提供了编程 API 和 顶层类库:
编程 API : 用于进行流处理的 DataStream API 和用于进行批处理的 DataSet API;
顶层类库:包括用于复杂事件处理的 CEP 库;用于结构化数据查询的 SQL & Table 库,以及基于批处理的机器学习库 FlinkML 和 图形处理库 Gelly。
Runtime 核心层
这一层是 Flink 分布式计算框架的核心实现层,包括作业转换,任务调度,资源分配,任务执行等功能,基于这一层的实现,可以在流式引擎下同时运行流处理程序和批处理程序。
物理部署层
Flink 的物理部署层,用于支持在不同平台上部署运行 Flink 应用。
根据部署的模式可以分为:
1. 本地部署(Local Mode)
在本地启动基于单个JVM的Flink实例,用于开发和测试阶段。
特点:简单快捷,无需配置集群环境,适合小规模的数据处理或测试。
2. 集群部署(Standalone Cluster)
自主管理资源,无需依赖外部资源管理器。
易于配置和管理,适合小规模到中等规模的数据处理任务。
3. YARN部署(YARN Mode)
利用YARN的资源管理功能,实现资源的动态分配和回收。
支持大规模的数据处理任务,提高资源利用率。
YARN的容错机制可以保证Flink作业的可靠性。
4. 云部署(Cloud Deployment)
利用云平台的弹性伸缩能力,根据数据处理需求动态调整资源。
简化部署和运维流程,降低运维成本。
云平台提供的安全性和稳定性保障,确保Flink作业的稳定运行。
***5. Kubernetes容器部署(Kubernetes Mode)
利用Kubernetes的容器编排能力,实现Flink作业的自动化部署、扩展和容错。
支持更细粒度的资源管理和隔离,提高资源利用率。
易于与其他基于Kubernetes的微服务架构集成。
Flink的分层API
![](https://i-blog.csdnimg.cn/direct/ac63676e4a574ab1b9cd12388d5d9012.png)
API 的一致性由下至上依次递增👆,接口的表现能力由下至上依次递减👇,各层的核心功能如下:
SQL & Table API
SQL & Table API 同时适用于批处理和流处理,这意味着你可以对有界数据流和无界数据流以相同的语义进行查询,并产生相同的结果。除了基本查询外, 它还支持自定义的标量函数,聚合函数以及表值函数,可以满足多样化的查询需求。
√DataStream & DataSet API
DataStream & DataSet API 是 Flink 数据处理的核心 API,支持使用 Java 或 Scala 进行调用,提供了数据读取,数据转换和数据输出等一系列常用操作的封装。
Stateful Stream Processing
Stateful Stream Processing 是最低级别的抽象,它通过 Process Function 函数内嵌到 DataStream API 中。 Process Function 是 Flink 提供的最底层 API,具有最大的灵活性,允许开发者对于时间和状态进行细粒度的控制。
Flink集群的架构
任务管理器(JobManager):
Flink集群的协调者,负责接收Flink作业(Job),调度任务(Task),收集作业状态,并管理TaskManager。每个JobManager管理一个具体的Job,并通过其内部的Scheduler组件来调度执行该Job的DAG(有向无环图)中的所有Task。
工作节点(TaskManager):
执行实际计算任务的节点。每个TaskManager包含一个或多个TaskSlot,用于执行作业中的Task。TaskManager与JobManager通信,以获取任务和资源,并报告任务执行状态和结果。
ResourceManager:
负责整个Flink集群的资源调度和管理,包括资源的申请、回收和状态管理。
Dispatcher:
提供REST接口来接收客户端的作业提交,启动JobManager,并运行Web UI。
WebMonitorEndpoint:
作为Web UI的后端,接收并处理来自客户端的HTTP请求,提供作业和集群的监控信息。
下图为Flink核心组件的工作流程图