阿里云实时计算Flink版是阿里云基于Apache Flink构建的企业级、高性能实时大数据处理系统。具备一站式开发运维管理平台,支持作业开发、数据调试、运行与监控、自动调优、智能诊断等全生命周期能力。本期将对Flink的使用进行总结。
阿里云实时计算Flink版是阿里云基于Apache Flink构建的企业级、高性能实时大数据处理系统。具备一站式开发运维管理平台,支持作业开发、数据调试、运行与监控、自动调优、智能诊断等全生命周期能力。100%兼容Apache Flink。
Server ID 唯一标识一个Flink作业的执行环境。每个Server ID对应一个独立的Flink作业执行环境,它包含了资源配置、状态存储、作业管理等信息。
Server ID的作用:
Server ID参数取值范围为 5400~6400。
推荐在开启增量读取模式多并发读取数据时,设置该参数为ID范围,因为这样可以使得每个并发使用不同的ID。
注意:Server ID数少于并发数、多作业共用同ServerID,都会导致任务读取数据异常。
CDC是Change Data Capture(变更数据获取)的简称。主要是监测并捕获数据库的变动(包括数据或数据表的插入、更新以及删除等),将这些变更按发生的顺序完整记录下来,写入到消息中间件中以供其他服务进行订阅及消费。
MySQL CDC 实现原理(断点续传):
同步任务启动时,将表按主键分为多个分片(chunk),记录此时binlog点位。使用增量快照算法通过select,逐个读取每个分片的数据。记录下已完成的分片。当发生Failover时,只需要继续读取未完成的分片。
常规作业推荐SQL开发,涉及复杂逻辑或算法可使用 Python
前提:确保工作空间中已注册目标端的元数据Catalog
通过CTAS(CREATE TABLE AS)语句实现了多库多表的合并同步,另外还能实时将上游表结构(Schema)的变更同步到下游表,提高在目标数据库中创建表和维护源表结构变更的效率。
具体什么是CTAS语法,请看代码:
如果使用Insert Into方式同步,代码如下:
可以看到Insert Into方式使用连接器进行同步,不仅作业配置复杂,且数据库连接信息完全裸露。
新增同步表:将新增表的同步代码加入到作业中,重新部署作业
CDAS(CREATE DATABASE AS)是CTAS语法的一个语法糖,用于实现整库同步、多表同步的功能。
如何新增同步表?
Flink作业还支持使用STATEMENT SET语法将多个CDAS和CTAS语句作为一个作业一起提交,并支持对源表节点的合并复用,降低对数据源的压力。
同步方式 |
主要功能 |
适用场景 |
CTAS |
分库分表合并同步 |
适用互动业务多数场景(方便维护) |
CDAS |
整库同步、多表同步 |
使用 STATEMENT SET 语法,优势在于可以使用一个Source节点读取多业务表的数据,降低源端的压力:
BEGIN STATEMENT SET;
CREATE DATABASE IF NOT EXISTS `holo`.`bigdata`
AS DATABASE `mysql-fuyao-1`.`bigdata` INCLUDING ALL TABLES
/*+ OPTIONS('server-id' = '5400') */;
CREATE DATABASE IF NOT EXISTS `holo`.`componentuserlogdb`
AS DATABASE `mysql-fuyao-1`.`componentuserlogdb` INCLUDING ALL TABLES
/*+ OPTIONS('server-id' = '5400') */;
END;
推荐CTAS方式,使用 STATEMENT SET ,方便维护与管理,但需在后续需求开发中,定义表归类标准。
启动方式介绍
数据验证 |
||
启动方式 |
验证方式 |
验证结果 |
无状态启动-全量 |
|
目标表1000条数据 |
无状态启动-指定点位 (只有SLS/kafka可用) |
|
结果:最早的一条数据时间为 2023-10-18 12:59:59 |
从最新状态恢复-增量 |
|
结果:任务启动时刻开始数据采集 |
从指定状态恢复-快照 |
|
结果:FLink同步了第4点中插入的2000条数据,并且自增id是连续的。 |
经过运维进行网络配置,验证了Flink具备通过公网、内网方式同步非本账号下的RDS、SLS数据的能力。
涉及实时同步链路:Mysql -> Holo、SLS -> Holo、Holo -> Mysql、SLS -> Holo、SLS -> Maxcomputer、Holo -> Maxomputer
以下针对互动云有可能涉及的同步链路进行测试,测试结果:同步链路全部通畅。作业代码如下:
源端 |
目标端 |
验证验证 |
MySQL |
Holo |
|
SLS |
Holo |
|
Holo |
MySQL |
注:需建表时开启Binlog |
Mysql |
MaxComputer |
|
Holo |
MaxComputer |
|
SLS |
MaxComputer |
|
生产环境运行中的同步任务,业务侧会存在对表 Schema 变更场景,可能会导致生产同步任务报错。典型场景为新增或变更字段字段。
测试过程:根据生产环境中的同步任务A任务进行了测试,为源端MySQL表增加ext10字段,查看目标 Holo 表也自动增加了。
注:DDL语句不会单独同步,必须有DML语句产生才会一起同步至目标端。
测试方法 准备测试表 flink_test_source_table,往表中分两批灌数据(1000W/批),查询同步的数据条数。
第一批:
第二批:
结论 同步过程无数据丢失情况产生。
类型 |
功能 |
同步 |
全增量一体化:全量和增量数据一体化读取,全增量自动切换,无需维护两条链路 |
并发读取:全量阶段支持多并发读取,水平扩展读取性能 |
|
无锁读取:基于无锁一致性算法,无需数据库加锁,不影响在线业务 |
|
断点续传:全量和增量阶段均支持Checkpoint,作业快速恢复,稳定性高 |
|
ETL:无缝集成Flink SQL,支持对数据库数据做灵活强大的 Streaming ETL加工 |
|
轻量化:无需部署额外的 Kafka、Canal 等服务,链路短、成本低、易维护 |
|
分库分表合并:支持分库分表合并入仓入湖 |
|
表结构变更同步:源表schema变更(加列等)自动同步到目标表 |
|
整库同步:支持整库读取,一行 SQL 完成整库同步作业开发 |
|
千表入仓:单作业支撑上千张规模的不同业务表实时写入数据仓库 |
|
元数据:内置统一元敛据管理,自动发现外部元数据(MySQL等),无需手写DDL |
|
数据限流:提供限定同步速率的能力,避免给源端数据库造成太大压力,影响在线业务。 |
|
脏数据收集:脏数据自动收集到 OSS/Kafka/SLS,不影响同步链路稳定性,提供脏数据事后处理能力。 |
|
数据质量校验:提供数据同步的目标数据与原始数据的一致性校验服务。 |
流作业:Python、JAR、SQL方式
批作业:Python、JAR方式
Flink全托管支持智能调优和定时调优两种调优模式。
适用场景
某作业使用资源30 CU,上线平稳运行一段后,发现在Source无延迟、无反压的情况下,作业的CPU和内存使用率有时会很低。
此时如果您不想人工调节资源,需要系统自动完成资源调节,可以使用智能调优模式。系统将在资源使用率比较低时,自动降低资源配置,在资源使用率提高到一定阈值时,再自动提高资源配置。
智能调优策略(举例)
定时调优计划:描述了资源和时间点的对应关系,一个定时调优计划中可以包含多组资源和时间点的关系。
可以根据高峰、低峰在每个时间段配置想对应的资源调整策略。前提是必须明确知道各时间段的资源使用情况。
在使用定时调优计划时,您需要明确知道各个时间段的资源使用情况,根据业务时间区间特征,设置对应的资源。
资源分配模式分为两种模式:基础模式(粗粒度) 和 专家模式。
Flink作业资源的调整需要根据具体作业的需求和集群资源来进行。不同的作业可能需要不同的资源配置,以获得最佳的性能和可伸缩性。同时,监控作业的运行情况也是关键,以便根据实际情况进行必要的调整。
指标 |
含义 |
职责 |
场景 |
并发度 |
控制作业并行程度(并行执行的任务数量) |
它控制了作业的并行程度,决定了作业在集群中的资源使用情况。 |
适用于需要高吞吐量和低延迟的场景。增加并发度可以提高作业的整体性能。 |
JobManager CPU |
管理作业的整体协调和调度 |
JobManager负责协调作业的执行、状态管理和故障恢复。 |
管理作业和调度的计算需求,通常不需要过多的CPU资源。 |
JobManager Memory |
管理作业的元数据和状态信息 |
需要大规模状态管理的作业,以及需要长期保存状态信息的情况。 |
|
TaskManager CPU |
执行作业中的任务。 |
TaskManager负责执行作业的任务,包括数据处理和计算。 |
适用于计算密集型的任务,需要大量CPU计算资源。 |
TaskManager Memory |
存储任务数据和状态信息,包括中间结果、缓存数据等。 |
适用于需要大规模数据存储和中间结果缓存的作业。 |
|
每个TaskManager Slot数 |
每个TaskManager上可并行执行的任务数。 |
限制了TaskManager上同时执行任务的数量。 |
适用于控制每个TaskManager的并行度,以避免资源竞争。 |
根据Flink最佳实践:
注:JobManager和TaskManager的默认配置为 1C、1G,经过测试无法支撑单表的全量同步,观察日志内存打满。
作业状态集管理_实时计算Flink版-阿里云帮助中心
系统检查点 Checkpoint
系统检查点生命周期完全由Flink系统管理,用户无法进行手动创建和删除,只能查看其生成情况。
作业快照
生命周期完全由用户管理,用户可在作业运行中或结束时触发,也可以配置定时保存快照。
先看下数据流,Flink从SLS采集数据到Holo,其中涉及到几个时间字段:
任务运维-数据曲线
指标 |
指标逻辑 |
(含义/场景)解释 |
可能原因 |
重启次数 Num of Restarts |
每个作业重启次数总数 |
|
|
业务延时 currentEmitEventTimeLag |
数据离开 Source 的时刻(EmitTime)- 数据事件时间(EventTime) |
该延时较大时,说明作业可能在拉取数据或者处理数据上存在延时。 |
|
传输延时currentFetchEventTimeLag |
数据被 Source 读取的时刻(FetchTime)- 数据事件时间(EventTime) |
度量数据从数据源到Flink作业的传输延时,识别数据获取和传输过程中的性能瓶颈。 结合 业务延时指标可以分析Source处理能力 |
|
输入记录总数 numRecordsIn |
每个 operator(source 端和中间 operator)输入的数据总数 |
反映了每个operator的输入数据规模,用于监控数据流入作业的速率和分布。 |
----- |
输出记录总数 numRecordsOut |
每个operator(source 端和中间 operator)输出的数据总数 |
监控每个operator的输出数据规模,帮助你了解数据流出作业的速率和分布。 |
----- |
Source 端输入记录总数 numRecordsInOfSource |
每个 operator(source 端排除中间 operator)输入的数据总数 |
用于监控Source端的输入数据规模,有助于了解数据源的性能和数据输入速率。 |
----- |
Sink 端输出记录总数 numRecordsOutOfSink |
sink 端(排除中间 operator )输出的数据总数 |
用于监控Sink端的输出数据规模,帮助你了解数据写入目标的性能和数据输出速率。 |
----- |
每秒输入记录数numRecordsInPerSecond |
每秒输入记录数 |
用于监控每秒输入数据的速率,帮助你了解数据输入的速度。 |
----- |
每秒输出记录数 numRecordsOutPerSecond |
每秒输出记录数 |
用于监控每秒输出数据的速率,帮助你了解数据输出的速度。 |
----- |
Source 端每秒输入记录 numRecordsInOfSourcePerSecond(IN RPS) |
每个 operator(source 端排除中间 operator)输入记录总数/时间(秒) |
用于监控Source端每秒的输入速率,有助于了解数据源的性能和数据输入速率。 |
----- |
Sink 端每秒输出记录数 numRecordsOutOfSinkPerSecond (OUT RPS) |
每个 operator(sink 端排除中间 operator)输出记录总数/时间(秒) |
用于监控Sink端每秒的输出速率,帮助你了解数据写入目标的性能和数据输出速率 |
----- |
源端未读取数据条数pendingRecords |
获取时刻位点数据与该时刻上游写入位点数据条数的差值 |
数据积压,数据处理速度无法赶上数据 |
----- |
源端未处理数据时间sourceIdleTime |
当前时间 - 最后一次处理数据的时间 |
用来评估源端操作符的活动性,帮助你了解源端的工作状态和空闲时间。 |
----- |
发生延迟如何分析?
sourceIdleTime:该指标反映Source是否有闲置,如果该指标较大,说明您的数据在外部系统中的产生速率较低。
currentFetchEventTimeLag和currentEmitEventTimeLag:均反映了Flink当前处理的延迟,您可以通过两个指标的差值(即数据在 Source中停留的时间)分析Source当前的处理能力。
Flink数据延迟通常有以下三个主要原因:处理超大数据集、作业复杂度高、以及资源不足。在不同情境下,可以采用不同的解决方法:
告警可自定义时间段、监控频率,可采用多种方式将告警通知到人(钉钉、邮件、短信、电话)
告警规则:
告警指标 |
含义 |
Restart Count in 1 Minute |
1分钟内Job Manager重启次数。 |
Checkpoint Count in 5 Minutes |
5分钟内Checkpoint成功次数。 |
Emit Delay |
业务延时,即数据发生时间与数据离开Source算子的时间差值,单位为秒。 |
IN RPS |
每秒输入记录数 |
OUT RPS |
每秒输出记录数 |
Source IdIe Time |
源端未处理数据的时间 |
Job Failed |
作业失败 |
告警配置流程 |
|
|
|
|
|
|
告警信息展示:
代码逻辑/参数配置错误:常见于新上线的任务,此时任务会不断进行重试。可以将对应任务停止,修复错误后启动。
其它错误: 停止任务,修复对应错误后,重启任务,从快照或最新状态(Checkpoint)恢复。
仅在包年包月模式下,才支持资源变配,在按量付费模式下是不支持资源变配的。
影响:扩缩容均不对生产作业产生影响。
试用事项分类 |
具体事项 |
试用结论 |
数据同步 |
1、Flink同步作业启动方式 |
支持全量、增量及系统检查点启动 |
2、Flink跨账号数据同步 |
支持跨账号同步
|
|
2、Flink同步数据源支持 |
Flink多数据源、多账号所涉及的同步链路全部支持 |
|
3、Flink同步DDL验证 |
支持 |
|
4、 Flink数据同步准确性 |
准确 |
|
作业运维 |
1、Flink作业资源分配 |
基础模式 和 专家模式。 基础模式对绝大多数作业满足需求。 |
2、Flink作业状态存储 |
|
|
3、Flink作业延迟处理与失败恢复 |
不同场景对应不同处理方式。简单描述: 2.减少窗口内数据量 3.增加作业资源配置 |
|
4、Flink作业调优模式 |
|
|
5、Flink作业告警配置 |
提供多种指标监控,支持多种通知方式 |
|
集群/项目空间管理 |
1、Flink集群扩缩容/恢复 |
按量付费不支持变配。 包年包月资源变配不影响线上作业 |
1、Flink项目代码管理、任务发布 |
-- 讨论点 |