Flink 生产环境调优案例:从 5000TPS 到 50000TPS 的实战之路
一、生产环境背景
1.1 业务场景
实时数据 pipeline(2023 年双 11 大促):
数据源:Kafka(用户行为日志)
├── Topic:user_behavior_log
├── 分区数:100
├── 峰值 TPS:50,000+
└── 数据量:日增 500GB
处理逻辑:
├── 数据清洗(过滤、格式化)
├── 实时聚合(UV/PV/GMV)
├── 实时 Join(用户信息 + 行为)
└── 结果输出(Kafka + StarRocks)
SLA 要求:
├── 延迟:< 5 秒(P99)
├── 准确性:Exactly Once
└── 可用性:99.99%
1.2 初期问题(调优前)
性能问题:
├── 吞吐量:仅 5000 TPS(目标 50000)
├── 延迟:P99 = 30 秒(目标<5 秒)
├── 反压:频繁出现,作业停滞
└── 资源:CPU 利用率 90%+,内存吃紧
稳定性问题:
├── Checkpoint 失败:日均 3-5 次
├── 作业重启:日均 1-2 次
├── 数据丢失:偶发(未定位原因)
└── OOM:每周 1-2 次
典型故障:
2023 年 11 月 10 日(双 11 前夜),流量峰值到来,作业吞吐量卡在 8000 TPS,延迟飙升至 120 秒,紧急扩容 3 倍资源才勉强撑过。
二、Flink 执行内核解析
2.1 Flink 作业执行流程
用户代码 (DataStream API)
│
▼
┌─────────────────┐
│ Transformation │ ← 算子转换(DAG)
└─────────────────┘
│
▼ (Optimizer)
┌─────────────────┐
│ ExecutionPlan │ ← 优化后执行计划
└─────────────────┘
│
▼ (JobGraph)
┌─────────────────┐
│ JobGraph │ ← 作业图(序列化)
└─────────────────┘
│
▼ (JobManager)
┌─────────────────┐
│ TaskDeployment │ ← 任务分发
└─────────────────┘
│
▼ (TaskManager)
┌─────────────────┐
│ Task 执行 │ ← 算子链执行
└─────────────────┘
│
▼
┌─────────────────┐
│ Checkpoint │ ← 状态快照
└─────────────────┘
2.2 关键组件源码分析
2.2.1 算子链(Operator Chain)
源码位置: org.apache.flink.streaming.runtime.tasks.StreamTask
java
// StreamTask.java - 算子链执行核心
public abstract class StreamTask<OUT, OP extends StreamOperator<OUT>>
implements TaskInvokable {
@Override
public void invoke() throws Exception {
// 1. 初始化算子
operator.open();
// 2. 处理输入(核心循环)
while (running) {
// 从输入缓冲区读取
StreamRecord<?> record = input.read();
if (record != null) {
// 3. 调用算子处理(内联执行)
operator.processElement(record);
// 4. 输出到下游(可能是链式算子)
output.collect(record);
}
// 5. 处理水位线
if (watermark != null) {
operator.processWatermark(watermark);
}
}
// 6. 关闭算子
operator.close();
}
}
算子链优化原理:
未链式化:
├── Source → Network → Map → Network → Sink
└── 每次传输:序列化 + 网络开销
链式化后:
├── Source → Map → Sink(同一线程)
└── 无网络传输,直接方法调用
性能提升:3-5 倍
链式化规则:
java
// StreamChainBuilder.java
public class StreamChainBuilder {
// 可以链式的条件
public boolean canChain(StreamOperator<?> upstream, StreamOperator<?> downstream) {
// 1. 同一 TaskSlot
if (upstream.getSlot() != downstream.getSlot()) return false;
// 2. 连接策略允许
if (downstream.getChainingStrategy() == ChainingStrategy.ALWAYS) {
return true;
}
// 3. 非关键边界(Checkpoint 对齐点)
if (downstream.isCheckpointBoundary()) return false;
// 4. 资源充足(CPU/内存)
if (!hasEnoughResources(upstream, downstream)) return false;
return true;
}
}
调优参数:
properties
# 启用算子链(默认开启)
execution.chain.enabled=true
# 链式化策略
# ALWAYS: 总是链式
# HEAD: 作为链头
# NEVER: 不链式
operator.chaining.strategy=ALWAYS
# 最大链长度(避免过长导致 GC 压力)
execution.chain.max-length=10
2.2.2 反压机制
源码位置: org.apache.flink.runtime.io.network.buffer.LocalBufferPool
java
// LocalBufferPool.java - 反压检测
public class LocalBufferPool {
public Buffer requestBuffer() throws Exception {
// 1. 尝试获取缓冲区
Buffer buffer = buffers.poll();
if (buffer == null) {
// 2. 缓冲区耗尽,触发反压
notifyBackpressure();
// 3. 阻塞等待(或失败)
buffer = buffers.take(); // 阻塞
}
return buffer;
}
// 反压传播
private void notifyBackpressure() {
// 向上游发送反压信号
upstream.notifyBackpressure();
// 记录反压事件
metrics.recordBackpressure();
}
}
反压传播机制:
Sink 反压
│
▼
Map(阻塞 output.collect())
│
▼
Source(阻塞 emit())
│
▼
Kafka(停止拉取)
反压定位方法:
bash
# 1. Flink Web UI 查看反压
http://jobmanager:8081/#/job/<jobid>/operators
# 2. 查看背压级别
# Idle: 正常
# Low: 轻微反压
# High: 严重反压(需优化)
# 3. 火焰图分析热点
jstack <taskmanager_pid> > thread_dump.txt
2.3 状态管理内核
2.3.1 RocksDB 状态后端
源码位置: org.apache.flink.contrib.streaming.state.RocksDBStateBackend
java
// RocksDBStateBackend.java - 状态存储
public class RocksDBStateBackend implements AbstractStateBackend {
@Override
public <K, N, V> RocksDBKeyedStateBackend<K> createKeyedStateBackend(
TaskKvStateRegistry kvStateRegistry,
Environment env,
String operatorIdentifier,
TypeSerializer<K> keySerializer,
int numberOfKeyGroups,
KeyGroupRange keyGroupRange) {
// 1. 创建 RocksDB 实例
Options options = new Options();
options.setBlockCacheSize(256 * 1024 * 1024); // 256MB 块缓存
options.setWriteBufferSize(64 * 1024 * 1024); // 64MB 写缓冲
// 2. 配置合并策略
options.setCompactionStyle(CompactionStyle.LEVEL);
options.setMergeOperator(new StringAppendOperator());
// 3. 创建 RocksDB 实例
RocksDB db = RocksDB.open(options, dbPath);
return new RocksDBKeyedStateBackend<>(db, ...);
}
}
RocksDB 调优参数:
properties
# 内存配置
state.backend.rocksdb.memory.fixed-per-slot=256mb # 每 Slot 固定内存
state.backend.rocksdb.memory.managed=true # 托管内存
# 写缓冲
state.backend.rocksdb.write-buffer-size=64mb # 写缓冲大小
state.backend.rocksdb.max-write-buffer-number=3 # 最大写缓冲数
# 块缓存
state.backend.rocksdb.block-cache-size=256mb # 块缓存大小
state.backend.rocksdb.block-cache-type=LRU # LRU 缓存
# 压缩
state.backend.rocksdb.compression.type=SNAPPY # 压缩算法
state.backend.rocksdb.compaction.style=LEVEL # 合并风格
# 预写日志
state.backend.rocksdb.wal.enabled=false # 关闭 WAL(Checkpoint 替代)
2.3.2 Checkpoint 机制
源码位置: org.apache.flink.runtime.checkpoint.CheckpointCoordinator
java
// CheckpointCoordinator.java - Checkpoint 协调
public class CheckpointCoordinator {
public CompletableFuture<Acknowledge> triggerCheckpoint(
long checkpointId,
long timestamp,
CheckpointOptions options) {
// 1. 发送 Barrier 到所有 Source
for (SourceVertex source : sources) {
source.sendBarrier(checkpointId);
}
// 2. 等待所有 Task 确认
List<CompletableFuture<Acknowledge>> ackFutures = new ArrayList<>();
for (Task task : tasks) {
ackFutures.add(task.acknowledgeCheckpoint(checkpointId));
}
// 3. 等待所有确认完成
return CompletableFuture.allOf(ackFutures.toArray(...));
}
}
Checkpoint 调优参数:
properties
# 基础配置
execution.checkpointing.interval=60000 # 1 分钟间隔
execution.checkpointing.timeout=300000 # 5 分钟超时
execution.checkpointing.min-pause=30000 # 最小暂停 30 秒
execution.checkpointing.max-concurrent-checkpoints=1 # 最大并发 1 个
# Checkpoint 模式
execution.checkpointing.mode=EXACTLY_ONCE # 精确一次
execution.checkpointing.externalized-checkpoint-retention=RETAIN_ON_CANCELLATION
# 对齐优化(1.14+)
execution.checkpointing.unaligned.enabled=true # 非对齐 Checkpoint
execution.checkpointing.unaligned.allow-for-source=false # Source 禁用(Kafka 不支持)
# 增量 Checkpoint(RocksDB)
state.backend.incremental=true # 启用增量
三、生产环境调优实战
3.1 调优方法论
调优步骤:
1. 建立基准(Baseline)
└── 记录当前性能指标
2. 定位瓶颈(Profiling)
└── CPU/内存/网络/IO/反压
3. 假设验证(Hypothesis)
└── 提出优化假设,小范围验证
4. 实施优化(Implementation)
└── 应用优化,观察效果
5. 回归测试(Regression)
└── 验证无副作用
3.2 案例 1:吞吐量优化(5000 → 50000 TPS)
问题现象:
作业配置:
├── 并行度:50
├── Source:Kafka(100 分区)
├── 算子:Map → Filter → Aggregate → Sink
└── 吞吐量:5000 TPS(期望 50000)
资源使用:
├── CPU:90%+(瓶颈)
├── 内存:60%
└── 网络:30%
瓶颈定位:
bash
# 1. 火焰图分析
jstack <taskmanager_pid> | grep -A 20 "RUNNABLE"
# 发现热点:
# - 序列化占用 40% CPU
# - 用户代码逻辑占用 30%
# - 网络传输占用 20%
优化措施:
java
// 优化 1:启用高效序列化
// Flink 默认使用 Kryo,但需要注册类
env.getConfig().registerTypeWithKryoSerializer(MyEvent.class, MySerializer.class);
// 或使用 POJO 序列化(更快)
public class MyEvent implements Serializable {
public long userId; // 公共字段,POJO 序列化
public String action;
}
// 优化 2:算子链优化
// 默认自动链式化,但可手动控制
DataStream<Event> stream = env.addSource(kafkaSource);
stream.map(new MyMap())
.setChainingStrategy(ChainingStrategy.ALWAYS) // 强制链式
.filter(new MyFilter())
.setChainingStrategy(ChainingStrategy.ALWAYS);
// 优化 3:批量处理(减少网络传输)
stream.map(new MyMap())
.setBufferTimeout(100); // 100ms 批量发送
// 优化 4:并行度优化
// Source 并行度 = Kafka 分区数
kafkaSource.setParallelism(100);
// 计算算子并行度 = CPU 核数 × 2
mapOperator.setParallelism(100);
配置调优:
properties
# TaskManager 配置
taskmanager.numberOfTaskSlots=10 # 每 TM 10 Slot
taskmanager.memory.process.size=4096m # 每 TM 4GB
# 网络缓冲(关键!)
taskmanager.memory.network.fraction=0.2 # 网络内存占比 20%
taskmanager.memory.network.min=512mb # 最小 512MB
# 并行度
parallelism.default=100
# 重启策略
restart-strategy.fixed-delay.attempts=3
restart-strategy.fixed-delay.delay=10s
优化效果:
优化前:5000 TPS
优化后:52000 TPS(10.4 倍提升)
瓶颈转移:CPU 90% → CPU 70%(仍有优化空间)
3.3 案例 2:延迟优化(P99 30 秒 → 2 秒)
问题现象:
延迟分布:
├── P50: 5 秒
├── P90: 15 秒
├── P99: 30 秒(超标)
└── Max: 120 秒
Checkpoint 耗时:
├── 平均:2 分钟
├── 最大:8 分钟
└── 失败率:5%
瓶颈定位:
sql
-- Flink SQL 查看算子延迟
SELECT
operator_name,
avg(process_time) as avg_time,
percentile(process_time, 0.99) as p99_time
FROM flink_metrics
GROUP BY operator_name
ORDER BY p99_time DESC;
-- 发现:Aggregate 算子 P99 = 25 秒
根因分析:
1. 状态过大:单个 Key 状态 100MB+
2. Checkpoint 阻塞:对齐等待时间长
3. 反压传播:下游 Sink 慢
优化措施:
java
// 优化 1:状态 TTL(过期清理)
StateTtlConfig ttlConfig = StateTtlConfig
.newBuilder(Time.days(7)) // 7 天过期
.setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite)
.setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired)
.build();
ValueStateDescriptor<Long> descriptor = new ValueStateDescriptor<>("count", Long.class);
descriptor.setStateTtlConfig(ttlConfig);
// 优化 2:启用非对齐 Checkpoint
env.enableCheckpointing(60000);
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
env.getCheckpointConfig().enableUnalignedCheckpoints(); // 关键!
// 优化 3:LocalKeyedState(减少网络)
// Flink 1.13+ 支持
env.getConfig().setLocalRecoveryEnabled(true);
// 优化 4:异步 Sink(避免阻塞)
stream.addSink(new AsyncSink<>(
new MyAsyncSinkWriter(),
AsyncSinkConfig.builder()
.setInflightMaxBytes(10 * 1024 * 1024) // 10MB
.setInflightMaxRequests(100)
.build()
));
配置调优:
properties
# Checkpoint 优化
execution.checkpointing.interval=30000 # 30 秒(更频繁)
execution.checkpointing.timeout=120000 # 2 分钟超时
execution.checkpointing.min-pause=10000 # 10 秒最小暂停
execution.checkpointing.unaligned.enabled=true # 非对齐
# RocksDB 增量 Checkpoint
state.backend.rocksdb.incremental.checkpoint=true
state.backend.incremental=true
# 反压优化
taskmanager.network.memory.floating-buffers-per-gate=8192 # 浮动缓冲
优化效果:
延迟对比:
├── P50: 5 秒 → 1 秒(5 倍)
├── P90: 15 秒 → 1.5 秒(10 倍)
├── P99: 30 秒 → 2 秒(15 倍)
└── Max: 120 秒 → 10 秒(12 倍)
Checkpoint 耗时:
├── 平均:2 分钟 → 15 秒
└── 最大:8 分钟 → 45 秒
3.4 案例 3:内存优化(OOM 治理)
问题现象:
OOM 频率:每周 1-2 次
堆内存使用:峰值 95%
GC 时间:占比 30%
根因分析:
bash
# 堆转储分析
jmap -dump:format=b,file=heap.hprof <taskmanager_pid>
# MAT 分析发现:
# - 大对象:100MB+ 状态对象 50 个
# - 内存泄漏:未清理的 Timer
# - 序列化缓冲:累积未释放
优化措施:
java
// 优化 1:状态序列化优化
// 避免存储大对象
public class MyState {
// 错误:存储整个对象
// private UserInfo userInfo; // 100KB+
// 正确:只存储 ID,需要时查询
private long userId;
}
// 优化 2:Timer 清理
@Override
public void onTimer(long timestamp, OnTimerContext ctx) throws Exception {
// 清理过期 Timer
timerService.deleteEventTimeTimer(timestamp);
// 清理状态
myState.clear();
}
// 优化 3:内存管理
// 使用托管内存,而非堆内存
ValueStateDescriptor<Long> descriptor = new ValueStateDescriptor<>(
"count",
LongSerializer.INSTANCE
);
descriptor.setManagedSerializer(true); // 托管内存
配置调优:
properties
# 堆内存配置
taskmanager.memory.process.size=4096m
taskmanager.memory.heap.size=2048m # 堆内存 2GB
taskmanager.memory.managed.size=1024m # 托管内存 1GB
# 网络内存
taskmanager.memory.network.fraction=0.2
taskmanager.memory.network.max=2048mb
# RocksDB 内存
state.backend.rocksdb.memory.fixed-per-slot=256mb
state.backend.rocksdb.memory.managed=true
# GC 优化
env.java.opts.all: -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=16m
优化效果:
内存使用:
├── 峰值:95% → 65%
├── GC 时间:30% → 8%
└── OOM 频率:每周 1-2 次 → 0 次(3 个月)
3.5 案例 4:Exactly Once 保障
问题场景:
业务要求:数据准确性 100%
当前问题:偶发数据丢失(日均 1-2 条)
根因分析:
数据丢失场景:
1. Checkpoint 期间作业失败
2. Sink 端重复提交
3. Source 端 Offset 提交过早
解决方案:
java
// 方案 1:两阶段提交 Sink(2PC)
public class MyTwoPhaseCommitSink extends TwoPhaseCommitSinkFunction<Event> {
@Override
protected void beginTransaction() throws Exception {
// 开启事务
transactionId = uuid.randomUUID().toString();
}
@Override
protected void preCommit(Transaction transaction) throws Exception {
// 预提交(数据可见但未确认)
sink.preCommit(transaction);
}
@Override
protected void commit(Transaction transaction) {
// 正式提交(Checkpoint 成功后调用)
sink.commit(transaction);
}
@Override
protected void abort(Transaction transaction) {
// 回滚(失败时调用)
sink.rollback(transaction);
}
}
// 使用
stream.addSink(new MyTwoPhaseCommitSink<>(...));
// 方案 2:幂等 Sink(推荐)
public class IdempotentSink implements SinkFunction<Event> {
@Override
public void invoke(Event event, Context context) {
// 使用唯一键去重
String uniqueKey = event.getUserId() + "_" + event.getEventId();
// 数据库端去重(INSERT IGNORE / UPSERT)
db.execute(
"INSERT INTO result_table (unique_key, ...) VALUES (?, ...) " +
"ON DUPLICATE KEY UPDATE ..."
);
}
}
// 方案 3:Kafka Sink 精确一次
FlinkKafkaProducer<Event> sink = new FlinkKafkaProducer<>(
"result_topic",
new EventSerializationSchema(),
props,
FlinkKafkaProducer.Semantic.EXACTLY_ONCE // 关键!
);
配置调优:
properties
# Checkpoint 精确一次
execution.checkpointing.mode=EXACTLY_ONCE
# Kafka Source 精确一次
source.setCommitOffsetsOnCheckpoints(true)
# Kafka Sink 精确一次
sink.setSemantic(FlinkKafkaProducer.Semantic.EXACTLY_ONCE)
sink.setTransactionTimeout(3600000) # 1 小时超时
验证方法:
sql
-- 数据对账(Source vs Sink)
SELECT
'source' as type,
COUNT(*) as count
FROM kafka_source
WHERE event_date = '2024-04-08'
UNION ALL
SELECT
'sink' as type,
COUNT(*) as count
FROM starrocks_sink
WHERE event_date = '2024-04-08';
-- 结果应该一致
四、监控与告警
4.1 关键监控指标
yaml
# Prometheus 监控配置
metrics:
# 性能指标
- flink_taskmanager_job_task_operator_process_time
- flink_taskmanager_job_task_operator_latency_p99
- flink_taskmanager_job_task_numRecordsInPerSecond
# 资源指标
- flink_taskmanager_status_jvm_memory_used
- flink_taskmanager_status_jvm_gc_time
- flink_taskmanager_network_buffers_used
# Checkpoint 指标
- flink_jobmanager_job_last_checkpoint_duration
- flink_jobmanager_job_last_checkpoint_size
- flink_jobmanager_job_number_of_failed_checkpoints
# 反压指标
- flink_taskmanager_job_task_backpressured_time
4.2 告警规则
yaml
# alerting.yaml
groups:
- name: flink-production
rules:
- alert: HighLatency
expr: flink_taskmanager_job_task_operator_latency_p99 > 5000
for: 5m
labels:
severity: warning
annotations:
summary: "Flink 延迟过高:{{ $labels.operator_name }} P99={{ $value }}ms"
- alert: CheckpointFailure
expr: flink_jobmanager_job_number_of_failed_checkpoints > 0
for: 1m
labels:
severity: critical
annotations:
summary: "Flink Checkpoint 失败:{{ $labels.job_name }}"
- alert: HighBackpressure
expr: flink_taskmanager_job_task_backpressured_time > 10000
for: 5m
labels:
severity: warning
annotations:
summary: "Flink 反压:{{ $labels.operator_name }}"
- alert: OOMRisk
expr: flink_taskmanager_status_jvm_memory_used > 0.9
for: 5m
labels:
severity: critical
annotations:
summary: "Flink 内存告急:{{ $labels.taskmanager }} 使用率={{ $value }}"
五、踩坑记录
5.1 坑 1:非对齐 Checkpoint 导致数据重复
现象: 启用非对齐 Checkpoint 后,数据重复率 5%
原因: 非对齐 Checkpoint 包含 in-flight 数据,恢复时重复处理
解决方案:
java
// Sink 端去重(幂等)
public class IdempotentSink extends RichSinkFunction<Event> {
private transient ValueState<Set<String>> processedIds;
@Override
public void open(Configuration parameters) {
ValueStateDescriptor<Set<String>> descriptor = new ValueStateDescriptor<>(
"processed_ids",
TypeInformation.of(new TypeHint<Set<String>>() {})
);
processedIds = getRuntimeContext().getState(descriptor);
}
@Override
public void invoke(Event event, Context ctx) {
Set<String> ids = processedIds.value();
if (ids == null) ids = new HashSet<>();
if (ids.contains(event.getId())) {
return; // 已处理,跳过
}
ids.add(event.getId());
processedIds.update(ids);
// 实际写入
write(event);
}
}
5.2 坑 2:RocksDB 状态恢复慢
现象: 作业重启后状态恢复 30 分钟+
原因: RocksDB 全量恢复,数据量 500GB+
解决方案:
properties
# 启用增量 Checkpoint
state.backend.incremental=true
# 配置预取
state.backend.rocksdb.preload=true
# 使用 SSD 加速
state.backend.rocksdb.dir=/mnt/ssd/rocksdb
5.3 坑 3:Kafka Offset 提交过早
现象: 作业失败后重启,数据丢失
原因: Kafka Source 在 Checkpoint 前提交 Offset
解决方案:
java
// 配置 Checkpoint 后提交
KafkaSource<String> source = KafkaSource.<String>builder()
.setGroupId("flink-consumer-group")
.setTopics("user_behavior")
.setStartingOffsets(OffsetsInitializer.committedOffsets(OffsetResetPolicy.LATEST))
.setProperty("enable.auto.commit", "false") // 禁用自动提交
.build();
// Flink 管理 Offset 提交
env.enableCheckpointing(60000);
source.setCommitOffsetsOnCheckpoints(true); // Checkpoint 成功后提交
5.4 坑 4:Timer 内存泄漏
现象: 作业运行几天后 OOM
原因: Timer 注册后未清理,累积过多
解决方案:
java
@Override
public void onTimer(long timestamp, OnTimerContext ctx) throws Exception {
// 处理 Timer 逻辑
// 关键:清理 Timer
ctx.timerService().deleteEventTimeTimer(timestamp);
ctx.timerService().deleteProcessingTimeTimer(timestamp);
// 清理相关状态
myState.clear();
}
六、最佳实践总结
6.1 性能调优
- 算子链最大化(减少网络传输)
- 并行度匹配资源(CPU 核数×2)
- 网络缓冲充足(20% 内存)
- 启用高效序列化(POJO/Kryo 注册)
6.2 延迟优化
- 非对齐 Checkpoint(1.14+)
- 状态 TTL(定期清理)
- 异步 Sink(避免阻塞)
- LocalKeyedState(减少网络)
6.3 内存管理
- 托管内存优先(非堆内存)
- 状态序列化优化(避免大对象)
- Timer 及时清理
- GC 参数调优(G1)
6.4 Exactly Once
- Checkpoint 精确一次模式
- 两阶段提交 Sink / 幂等 Sink
- Kafka Offset Checkpoint 后提交
- 定期数据对账
七、总结
7.1 核心收获
经过 3 个月的调优:
| 指标 | 调优前 | 调优后 | 提升 |
|---|---|---|---|
| 吞吐量 | 5000 TPS | 50000 TPS | 10 倍 |
| P99 延迟 | 30 秒 | 2 秒 | 15 倍 |
| Checkpoint 耗时 | 2 分钟 | 15 秒 | 8 倍 |
| OOM 频率 | 每周 1-2 次 | 0 次 | - |
| 数据丢失 | 日均 1-2 条 | 0 条 | - |
7.2 调优原则
- 先监控后优化:没有监控的优化是盲目的
- 先定位后动手:找到瓶颈再优化
- 先小范围后全量:灰度验证
- 先性能后准确:准确性优先
7.3 后续方向
- Flink 1.17+ 新特性:Unaligned Checkpoint 2.0
- 云原生部署:K8s 弹性伸缩
- AI 辅助调优:自动参数推荐
作者: 大数据开发团队
版本: v1.0
最后更新: 2024-04-08
适用场景: Flink 生产环境性能调优