在 AWS EKS 上使用 Apache Flink 的旅程
Source: Dev.to
介绍
在构建流式管道时,最大挑战之一不仅是处理数据——更是要在数据持续流动的情况下保持作业可靠运行。Apache Flink 有效地解决了这一挑战。
Apache Flink 概述
Apache Flink 是一个分布式流处理框架,专为有状态的实时数据处理而构建。不同于以批处理为主的框架,Flink 将流视为核心抽象,批处理仅是其特例。
关键优势
- 精确一次处理保证
- 针对长期运行作业的原生状态管理
- 基于水印的事件时间处理
- 检查点机制,使故障可恢复
这些特性使得 Flink 更像是一个面向持续运行系统的平台,而不仅仅是一个工具。
基于检查点的执行模型
流式管道会随时间演进:逻辑会变化,模式会扩展,性能调优也变得必要。Flink 的基于检查点的执行模型使我们能够:
- 在不破坏下游系统的情况下重新启动作业
- 安全地推出逻辑或配置更改
- 将流式作业视为持续运行的系统,而不是一次性部署
它将有状态处理、一次性语义和安全演进相结合,使 Flink 成为生产管道的明确选择。
在 AWS EKS 上运行 Flink
一旦我们决定使用 Flink,就需要一个可靠的运行时。AWS EKS 提供:
- 托管的 Kubernetes 控制平面
- 与 AWS 服务的原生集成
- 在开发、测试和生产环境中的一致性
为了让 Flink 真正实现 Kubernetes 原生化,我们采用了 Flink Kubernetes Operator。
Source: …
Flink Kubernetes Operator
在通过 Helm 安装运算符后,它会引入一个 FlinkDeployment 自定义资源定义(CRD)。部署变得完全声明式:我们在 YAML 中定义期望的状态,运算符会持续进行调和。
运算符职责
- 启动 JobManager Pod(承载 Flink UI)
- 根据需要扩缩 TaskManager
- 配置网络、卷和服务账户
- 管理作业的重启、升级和恢复
这大幅降低了运维负担,使 Flink 成为云原生且可投入生产的系统。
部署模型
我们将集群管理与作业管理分离:
- FlinkDeployment – 定义会话集群(镜像、资源、Flink 配置、EFS 挂载)
- FlinkSessionJob – 定义实际的流式作业(入口、参数、并行度、升级模式)
大多数部署通过 Terraform 完成,渲染 YAML 模板并使用 kubernetes_manifest 应用。
FlinkSessionJob 的简化示例
apiVersion: flink.apache.org/v1beta1
kind: FlinkSessionJob
metadata:
name: my-streaming-job
spec:
job:
jarURI: s3://my-bucket/jars/my-job.jar
parallelism: 4
args:
- "--input"
- "s3://my-bucket/input/"
- "--output"
- "s3://my-bucket/output/"
upgradeMode: last-state # 💡 提示:要从最近的检查点重新运行作业,请将 upgradeMode 设置为 `last-state`。
安全运行作业
对于首次运行,我们通常以无状态方式启动作业。对于重启、回填或升级,我们依赖使用 upgradeMode: last-state 的基于检查点的恢复。这可确保:
- 作业从最新的成功检查点恢复
- 下游系统保持稳定
- 即使是 CDC 源,也能将间隙或重复降至最低
安全变更流程
- 更新作业或集群规格。
- 通过 Terraform 或
kubectl应用更改。 - 操作员会自动恢复状态。
业务逻辑变更(Python、SQL、JAR)
- 将更新后的代码推送到 S3。
- 通过 AWS DataSync 同步至 EFS。
- 在 Flink 容器中验证文件。
- 执行滚动的有状态升级。
此流程可安全地对关键流式管道进行迭代。
独立 Flink 部署(备用)
虽然 Operator 是我们的默认选择,但它在配置上有一定限制。针对特殊情况,我们使用 Terraform 维护一个独立的 Flink 部署:
- 为 JobManager 和 TaskManagers 分别部署。
- 通过 Service 和 Ingress 暴露 Flink UI。
权衡
| 方法 | 优点 | 缺点 |
|---|---|---|
| Operator | 更安全、简洁、自动化 | 配置灵活性受限 |
| 独立部署 | 完全控制 Pod 与设置 | 运维开销更高 |
大多数工作负载都能完美适配 Operator,但拥有备用方案可以在边缘案例中提供灵活性。
Conclusion
从选择 Flink 作为其有状态流模型,到在 AWS EKS 上运行它,再到使用 Flink Kubernetes Operator 安全地操作作业,这段旅程塑造了我们构建和维护流式管道的方式。Flink 不仅仅是一个处理引擎——它是一个用于演进、长期运行的数据管道平台。在 AWS 上以 Kubernetes 原生方式运行它,使我们能够在运营安全、可扩展性和灵活性之间取得平衡。
我们很高兴继续与 AWS Community Builders 以及更广泛的流媒体社区分享我们的学习成果。