[Flink] Flink 基础概念篇
0 序
1 Flink 基础概念
基础概念类
作业(Job)
类似于MaxCompute或Hadoop Job,一个实时计算的作业描述了一个完整的流式数据处理业务逻辑,是流式计算的基础业务单元。
JobManager
TaskManager
Flink API
Flink SQL
- 不同于诸多开源的提供非常底层的、编程API的流式数据处理系统,实时计算 Flink提供更加高层、更加面向业务化的Flink SQL(标准SQL语法上提供了关于流式处理的语法扩展)。
- Flink SQL能够方便数据开发人员使用标准化的SQL,完成流式数据计算加工的业务流程。
- 因此,实时计算 Flink适合更大众的数据分析人员快速、方便地完成一个流式数据处理业务。
UDF (User Define Function)
- 实时计算 Flink支持UDF函数。类似于Hive UDF函数,Flink SQL提供了标准化的流式数据处理能力同时,对于部分业务特殊自定义处理逻辑,建议您使用UDF函数表达。
- 目前实时计算 Flink仅支持Java的UDF函数扩展。
资源 (Resource)
当前UDF函数仅支持使用Java语言表达,对于您上传的每个JAR,实时计算定义为一个Resource。
数据采集 (Data Collection)
- 广义的数据采集指,将数据从数据产生方收集并传输进入到大数据处理引擎的过程。
- 在实时计算 Flink,数据采集原则上遵循上述定义,但更加聚焦为将流式数据从数据产生方收集并传输进入数据总线的过程。
数据存储 (Data Storage)
- 实时计算 Flink定义为一种轻量级计算引擎,本身不带有任何业务数据存储系统。
- 实时计算 Flink均是使用外部数据存储作为数据来源和数据目的端进行使用。
- 实时计算将数据存储均定义为外部的数据存储。
例如,将您RDS作为结果表,那么RDS即是实时计算的一类DataStore。
- 支持流式输入表类型包括
- 大数据总线(DataHub)
- 日志服务(LogService)
- 消息服务(MQ)
- 支持静态输入表类型包括
- 表格存储(TableStore)
- 云数据库(RDS)
- 支持输出表类型包括
- 大数据总线(DataHub)
- 日志服务(LogService)
- 表格存储(TableStore)
- 云数据库(RDS)
- 消息服务(MQ)
数据加工 (Data Development)
- 流式计算的开发过程(编写Flink SQL Job、Flink API Job的过程)定义为数据加工。
- 实时计算 Flink可提供一整套包括开发、调试的在线IDE,服务流式数据加工过程。
数据运维 (Data Operation)
- 实时计算作业的在线运维定义为数据运维。
- 实时计算 Flink可提供一整套管控平台,方便您进行流式数据的运维管控。
资源估算类
Compute Unit/CU/实时计算单元 := 1 CPU / 4GB
- Flink工作空间的基本计量单位为Compute Unit(CU)
- 即: 计算资源,1 CU=1核CPU+4 GiB内存+20
- 华为云(DLI)、阿里云(实时计算Flink版),对1CU的定义,均是 1Cpu 、4GB
- 在实时计算 Flink中,作业的实时计算单元为CU。一个CU描述了一个实时计算作业最小运行能力,即在限定的CPU、内存、I/O情况下对于事件流处理的能力。一个实时计算作业可以指定在一个或者多个CU上运行。
当前实时计算定义,1CU的处理能力大概为 1000条数据 / 秒。 (阿里云)
- GB本地存储(放置日志、系统检查点等信息),CU对应实时计算底层系统的CPU计算能力。
1个实时计算作业(Job)的CU使用量取决于此Job输入数据流的QPS、计算复杂程度,以及具体的输入数据分布情况。
您可以根据业务规模以及实时计算的计算能力,估算所需购买的资源数量。
实时计算1 CU的处理能力如下表所示。
处理场景 | 处理能力 |
---|---|
简单的流式压测处理 例如,过滤、清洗等操作。 |
1 CU每秒可以处理40000~55000条数据。 |
复杂的流式压测处理 例如,聚合操作、复杂UDF计算等。 |
1 CU每秒可以处理5000~10000条数据。 |
- 计算能力的特别说明
- 上述计算能力估值仅限于实时计算内部处理能力,不包括对外数据读取和写入部分。
- 外部数据的读写效率会影响您对实时计算能力的评估。
例如:如果实时计算需要从日志服务(LogService)读取数据,但LogService对于请求调用配额(Quota)存在一定限制,则:实时计算整体的计算能力将被限制在LogService允许的范围内。
- 如果实时计算引用的RDS数据存储存在连接数或者TPS限制,则:实时计算Job的吞吐能力将受限于RDS本身的流控限制。
- 如果作业中使用窗口函数,CU的使用量会比简单作业高,建议至少购买 4 CU。
Slot/任务槽
taskslot
是静态概念 , 是指 单 TaskManager 具有的并发执行能力- 可以通过参数
taskmanager.numberOfTaskSlots
进行配置
并行度/parallelism
-
并行度是动态概念,也就是 TaskManager 运行程序时实际使用的并发能力,可以通过参数 parallelism.default 进行配置
-
如果并行度 <= 集群中可用 slot 的总数,则:Flink Job 可正常执行
因为 slot 不一定要全部占用,有十分力气可以只用八分;
- 而如果并行度 > 可用 集群中 slot 的总数,则: 导致超出了并行能力上限————心有余力不足,Flink Job 就只好等待资源管理器分配更多的资源了。
最佳实践:华为云 DLI Flink Job 资源估算的核心概念
- 【单TM所占CU数】假定值
n
= 1
华为云DLI给Flink Job实际分配CPU时,会虚拟CPU给 Flink Job 的 Task Manager。
这个虚拟的比例是2n + 1
真实的资源根据DLI Job配置界面中配置的【单TM Slot数】的资源来计算
假定【单TM所占CU数】为1,则:Flink Web UI中 Task Manager 的 CPU 数会显示为 3
- 【CU数量】 = 作业占用资源总CU数,需配置与实际占用资源一致,作业实际占用资源根据算子并行数按需申请。
CU数量 = 管理单元 + (算子总并行数 / 单TM Slot数) * 单TM所占CU数
即: TaskManager 数量 = 算子总并行数 / 单TM Slot数TaskManager 数量,是按需的、动态变化的
-
【实际CU数量】= 弹性资源池当前分配的CU
-
【管理单元】 = Job Manager
-
【并行数】
算子默认最大并行数,优先级比代码中低。
并行数为作业每个算子的并行数,适度增加并行数会提高作业整体算力,但也须考虑线程增多带来的切换开销,其上限是计算单元CU数的4倍;
最佳实践为计算单元CU数的1-2倍。
注意:该并行数设置优先级低于代码中并行数设置。
==============
Slot(任务槽)是Flink中用于执行任务的资源单位,每个TaskManager可以提供多个Slot,每个Slot可以运行一个并行任务。
并行度(parallelism)是指作业执行的并行程度,即:作业中所有并行子任务的总数。
Slot和并行度的关系:
需 TaskManager 的Slot数 * TaskManager 的数量 >= 作业的并行度;否则,作业无法充分利用所有资源。
若 作业的并行度 > 集群中所有TaskManager提供的Slot总数,则:作业将无法启动更多的并行任务,即使资源足够。
X 参考文献
关于 CU 的说明
关于 CU 的说明
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!