1. 学习 flink 的原因
早在 18 年时,我便听说了
Flink这个流式计算引擎,当时阿里选择它作为新一代大数据计算框架,这一消息给我留下了深刻印象。
由于我平时主要从事业务开发,尚未系统学习
Flink,但今年随着数据量的快速增长,我们的架构师提出了通过数据加工和分析,获取更多指标性结果,为用户提供更有价值的业务。
因此,我们规划了如下的系统架构:
可以看出,业务数据库与数据分析系统已被分离,这样可以避免对核心业务的影响。数据分析的结果存储在线下备份库中,这样即使查询大量分析结果,也不会影响到核心业务。
在数据处理方面,我们选择了
Flink作为分布式处理引擎。经过深入调研和学习,从它的描述、性能、接口编程和容错恢复等方面来看,它非常适合我们的场景。接下来,我将分享我的调研结果。
官网虽然有中文版的文档,但翻译并不完全,经常需要跳转到英文博文。这里推荐一个国内网站 https://www./link/7da66e82dc1f8024527341be2df86b9f。
基础语义
基础语义非常重要,高层语法都是基于基础语义构建的,所以需要对它们有所了解。我推荐
ververica中的介绍:
从上图可以看出,数据流分为有界(bounded)和无界(unbounded)两种。有界数据流大小固定,计算最终会完成并结束;无界数据流的数据会随着时间推移持续增加,计算会持续进行且没有结束的状态。
数据流还具有实时和历史记录的属性。实时处理是数据一生成就立即处理;如果时效性要求不高,可以在凌晨统计前一天的完整数据,将数据流持久化到存储系统中,然后进行批处理。
状态是计算过程中保存的数据信息,在容错恢复和
Checkpoint中起到重要作用。流计算本质上是增量处理,因此需要不断查询和维护状态。为了保证
Exactly-once语义,还需要将数据写入到状态中,以确保在故障发生时,通过保存在状态中的数据进行恢复,保证一致性。持久化存储则可以在整个分布式系统运行失败或崩溃的情况下,实现
Exactly-once语义,这是状态的另一个重要价值。
Flink时间分为事件时间(Event Time)、摄入时间(Ingestion Time)和处理时间(Processing Time)。对于无界数据流,时间是判断业务状态是否滞后的重要依据。
事件时间:指事件被处理的时间,由机器的系统时间决定。
处理时间:指事件发生的时间,通常由数据源携带的字段指明。
摄入时间:指数据进入
Flink的时间,在数据源处以操作时间作为时间戳。
三个时间的具体位置如上图所示,后续会详细讲解。
从上到下分为三层:
SQL/Table API、
DataStream API和
ProcessFunction。
API的表达能力和业务抽象能力都很强,但越接近
SQL层,表达能力会逐步减弱,抽象能力会增强(由于这是基础了解,所以没有深入学习
SQL API层,感兴趣的同学可以进一步探索)。
反之,
ProcessFunction层的
API表达能力非常强,可以进行多种灵活操作,但抽象能力相对较低。
通常,我们最常用的是中间层的
DataStream API,后续的学习也将围绕它展开。
架构介绍来源于 https://www./link/45402d4ff8981a182dcfc4813600961f
1. 有界和无界数据流
Flink具备统一处理有界和无界数据流的能力(流处理是无界的,批处理是有界的,给无界的流处理加上窗口
Window相当于有界的批处理,由于
API一致,算子可以复用)。
Flink底层支持多种资源调度器,包括
Yarn、
Kubernetes等。
Flink自带的
Standalone调度器在部署上也非常灵活(
Standalone也是本地开发常用的模式)。
对于分布式系统来说,可伸缩性非常重要。资源不足时可以动态添加节点,分担压力;资源充足时可以撤下服务器,减少资源浪费。阿里巴巴双 11 大屏使用
Flink处理海量数据,测得峰值可达 17 亿/秒。
Flink相较于
Storm的最大特点是将状态语义完全抽象到框架中,支持本地状态读取,避免了大量网络
IO,大大提升了状态存储的性能。
以上是对
Flink的定义和架构介绍,下面是更具体的信息。官网从【架构】、【应用】和【运维】三个方面进行了介绍。
这里不会深入分析,主要简单介绍它的特性和优点,提供一个大致的了解,逐步深入,在后续文章中进一步学习。
处理流程
Flink程序的基本构建块是流和转换。(请注意,
Flink的
DataSet API中使用的
DataSet也是内部流)从概念上讲,流是数据记录流(可能永无止境),而转换是将一个或多个流作为一个操作的操作。一个输入可以产生一个(例如
map)或多个输出流(例如
flatMap)。
上图是数据处理流程,可以看到几个核心组件:
自带的
API中,可以读取以下数据:集合数据(fromCollection)、文件数据(readFile)、网络套接字(socket)以及更多扩展来源(addSource)。更多扩展中可以通过自定义
RichSourceFunction实现读取更多来源的数据。
图中获取的数据源是
Kafka,与其他中间件整合中,也封装了许多方便的方法,调用它们可以更方便地获取数据源的数据。
进行数据的转化,对应于文档中的算子
Operator。常见的数据操作有以下:
map、
flatMap、
filter、
keyBy、
reduce、
fold(在 1.9 中被标注为
deprecated)、
aggregate、
Window等常用操作。
从上图也可以看出,转换的操作可以不止一次,多个算子可以形成
chain链式调用,然后发挥作用。
进行数据的存储或发送,对应于文档中的
connector(既可以连接数据源,也能发送到某个地方存储起来)。
常用的存储
sink有
Kafka、
Apache Cassandra、
Elasticsearch、
RabbitMQ、
Hadoop等。与前面一样,可以通过扩展
RichSinkFunction进行自定义存储的逻辑。
性能比较
例如与
Hadoop、
Storm或
Spark进行比较,对比性能的高低。如果选择使用
Flink,必须比以前的开发更方便且性能更好。
由于之前没有使用过这些大数据框架,所以测评数据可以参考以下两篇文章:
Flink实时计算性能分析 https://www./link/9ce60c64ac4510df68537de96631261f Flink 与 Storm 的性能对比 https://www./link/87e942236933558e0ea7cd7dee76e9db:
上图的数据源是
Kafka Source,蓝色是
Storm,橙色是
Flink。在一个分区
partition情况下,
Flink的吞吐量约为
Storm的 3.2 倍;而在 8 个分区情况下,性能提高到 4.6 倍。
上图采用
outTime-eventTime作为延迟,可以看出,
Flink的延迟还是比
Storm的要低。
管理方式 JobManager、TaskWorker
上面是官方示意图,阐述了
Flink提交作业的流程,应用程序
Flink Program、
JobManager和
TaskManager之间的关系。
上面是我对它的理解,我个人认为
zhisheng大佬写的更加详细,可以参考这篇文章:https://www./link/c3a05fe072d3d4f009eccce97c41ca71
高可用 HA、状态恢复
High Availability是个老生常谈的话题了,服务难免会遇到无法预测的意外,如何在出现异常情况下快速恢复,继续处理之前的数据,保证一致性,这是个考量服务稳定性的标准。
Flink提供了丰富的状态访问(例如有
List、
map、
aggregate等数据类型),以及高效的容错机制,通过存储状态
State,然后通过存储了状态的
Checkpoint和
Savepoint来帮助应用进行快速恢复。
详细请参考这两篇:
Apache Flink 零基础入门(七):状态管理及容错机制 https://www./link/a1280bb57e980da66d54eb0f20cbb95e Flink状态管理和容错机制介绍 https://www./link/c72741e55
0f08085fefee77a99d9ccb3
真的是非常敬仰发明优秀框架的团队,也非常敬佩每一个为技术做贡献的参与者,所以每次找到相关的资料都跟发现宝藏一样。
下面罗列一下目前找到的资料:
Flink官网:https://www./link/c323092e3dc96ec44049c28c7dd27089
国内牛人的分享:https://ververica.cnGithub 项目
可以关注一下提的问题和阿里分支Blink
:https://github.com/apache/flinkzhisheng
个人学习的流程是跟着他的文章走了一遍,然后遇到不懂的继续深入学习和了解:http://www.54tianzhisheng.cn/tags/Flink/wuchong
这位大佬是从 16 年就开始研究Flink
,写的文章很有深度,想要详细了解Flink
,一定要看他的文章!:http://wuchong.me/categories/Flink/从上面的资料可以看出,Flink` 的社区慢慢从小众走向大众,越来越多人参与。
基础知识点
运行环境如下:
上图是我在学习过程中整理的一些知识点,之后将会根据罗列的知识点慢慢进行梳理和记录。
从调研的结果中可以看出,无论从性能、接口编程和容错上,
Flink都是一个不错的计算引擎。
github上拥有 1 万多个
star,这么多人支持以及阿里巴巴的大力推广,还有在 2019.09 参加的云栖大会,演讲嘉宾对
Flink的展望:
Apache Flink 已经是非常优秀和成熟的流计算引擎
Apache Flink 已经成为优秀的批处理引擎的挑战者
继续挖掘 Apache Flink 在 OLAP 数据分析领域的潜力,使其成为优秀的数据分析引擎
直觉相信,
Flink的发展前景不错,希望接下来与大家分享和更好的去学习它。
参考资料
Flink 从 0 到 1 学习 —— Apache Flink 介绍
Apache Flink 是什么?
Apache Flink 零基础入门(一&二):基础概念解析
为什么说流处理即未来?
Apache Flink 零基础入门(七):状态管理及容错机制
Apache Flink状态管理和容错机制介绍
# apache
# git
# go
# github
# 大数据
# ai
# win
# 阿里巴巴
# 持久化存储
# 为什么
# red
# gate
# asic
# sql
# rabbitmq
# 架构
# 分布式
# 中间件
# yarn
# kafka
# 数据类型
# 封装
# Filter
# 接口
# operator
# Event
# map
# 事件
# table
# hadoop
# storm
# spark
# elasticsearch
# flink
# 数据库
# kubernetes
# 数据分析
# http
# https
# 系统架构
# 可以看出
# 多个
# 上图
# 无界
# 批处理
# 官网
# 大佬
# 指事
# 的是
# 都是
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11怎么设置ipv4地址_Windows 11固定静态IP地址配置教程【详解】
Linux如何使用Curl发送请求_Linux下API接口测试与文件下载技巧【步骤】
c++ std::atomic如何保证原子性 c++ CAS操作原理【底层】
Python对象比较排序规则_集合使用说明【指导】
如何在 Python 中将 ISO 8601 时间戳转换为日期并计算日期差值
Win11任务栏怎么固定应用 Win11将软件图标固定到底部【步骤】
Win11如何更新显卡驱动 Win11检查和安装设备驱动程序【方法】
Python与MongoDB NoSQL开发实战_文档模型与索引优化
Win11如何开启telnet服务 Win11启用Telnet客户端【步骤】
如何在Golang中捕获HTTP服务器错误_GolangHTTP Handler中error处理
Win11怎么关闭触控板_Win11笔记本禁用触摸板快捷键
如何使用Golang包导出规则_控制函数和变量可见性
Win11怎么清理C盘系统日志_Win11清理系统日志文件【步骤】
c++ nullptr与NULL区别_c++11空指针规范
Win11色盲模式怎么开_Win11屏幕颜色滤镜设置【关怀】
c++的位运算怎么用 与、或、异或、移位操作详解【底层知识】
PythonWeb前后端整合项目教程_FastAPIReact完整实例
Mac如何设置动态壁纸?(让桌面动起来)
Win10怎么卸载迅雷_Win10彻底卸载迅雷方法【步骤】
Mac怎么给文件夹加密_Mac创建加密磁盘映像教程【安全】
Python装饰器设计思路_功能增强机制说明【指导】
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
php怎么捕获异常_trycatch结构处理运行时错误的技巧【方法】
如何在 Windows 11 中使用 AlomWare 工具箱
c# 在高并发场景下,委托和接口调用的性能对比
Win10闹钟铃声怎么自定义 Win10闹钟自定义铃声教程【方法】
Python函数接口稳定性_版本演进解析【指导】
如何使用Golang benchmark测量函数延迟_统计执行耗时
如何外贸网站设计-能留住客户提升用户体验!
Windows10电脑怎么设置电源按钮_Win10按电源键关机或休眠
Win11无法安装软件怎么办_Win11解除应用安装限制设置【修复】
MySQL 中使用 IF 和 CASE 实现查询字段的条件转换
php查询数据怎么导出csv_查询结果转csv文件保存【操作】
Windows执行文件被SmartScreen拦截原因_安全提示与绕过方式
php下载安装后memory_limit怎么设置_内存限制调整【技巧】
Win10怎样清理C盘阿里旺旺缓存_Win10清理阿里旺旺缓存步骤【步骤】
Windows资源管理器总是卡顿或重启怎么办?(修复方法)
Python抽象类与接口设计_规范说明【指导】
PhpStorm怎么调试PHP代码_PhpStorm断点设置与调试启动步骤【指南】
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
Win11怎么关闭应用权限_Windows11相机麦克风隐私管理
Windows10系统怎么查看显卡型号_Win10 dxdiag显示选项卡
c++怎么用jemalloc c++替换默认内存分配器【性能】
c++ std::future和std::promise c++线程间通信【教程】
Win11怎么关闭自动调节屏幕亮度_Windows11禁用内容自适应亮度控制
如何使用Golang指针与接口结合_实现方法调用和动态类型
Win10怎样安装Excel数据分析工具_Win10安装分析工具包步骤【教程】
PHP的FastAdmin架构适合二次开发吗_特点分析【介绍】
如何使用Golang实现RPC序列化与反序列化_Golang RPC数据编码与解码方法
Win11如何设置计划任务 Win11定时执行程序教程【详解】
2025-09-23
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。