一、编译链路对比二、多维度对比维度DataStream APIFlink SQL抽象层次命令式HOW告诉引擎怎么做声明式WHAT告诉引擎做什么优化空间用户手动优化逻辑优化器自动选择最优策略前端编译无直接构建 Transformation完整的 SQL 编译流水线Parse → Validate → Optimize → Physical Plan算子可控性完全可控自定义 ProcessFunction 等受限于 SQL 语义通过 UDF 扩展状态管理手动管理状态State API框架自动管理状态Aggregate State 等侧输出Side OutputOutputTag不支持需用 UNION ALL Filter 模拟自定义窗口 Trigger任意 Trigger 逻辑仅支持标准窗口语义复杂事件处理CEPCEP LibraryMATCH_RECOGNIZESQL 标准 CEP类型系统Java/Scala 类型系统SQL 类型系统与 Java 类型有映射关系Schema 演化手动处理依赖 Catalog有一定自动支持适用场景复杂事件处理、精细化控制、自定义状态逻辑ETL、聚合分析、多表 Join、标准化 pipeline三、运行时行为差异特性DataStreamFlink SQL代码生成无部分算子使用 CodeGen如 Calc 节点中的表达式计算编译为字节码状态结构用户自定义框架规定的内部状态格式如 MapState 存储聚合中间结果序列化TypeSerializer 由用户类型决定内部使用 BinaryRowData 等紧凑行式格式Watermark用户指定 WatermarkStrategy通过 DDL 中 WATERMARK FOR 子句声明uid 管理用户手动设置完全可控框架自动生成基于查询结构的确定性 hash拓扑变更恢复只要 uid 一致即可恢复SQL 语句任何修改包括列顺序可能导致 uid 变化无法恢复四、何时选择 DataStream API场景原因复杂事件处理CEP 自定义模式需要精细控制状态和触发逻辑自定义窗口逻辑如 Session Gap 动态计算SQL 窗口语义固定难以扩展异步 IO 调用外部服务SQL 无直接对应能力精细化状态管理如 BroadcastState 模式SQL 状态由框架管理不可自定义结构需要 Side Output 分流SQL 不支持多路输出到不同类型的 Sink与非结构化数据交互SQL 要求强 Schema低延迟要求逐条处理不能攒批SQL 的 Mini-batch 等优化可能引入延迟五、何时选择 Flink SQL场景原因标准 ETL过滤、映射、聚合SQL 表达简洁优化器自动优化多表 Join优化器自动选择 Join 策略和顺序维表关联Lookup JoinSQL 内置支持无需手写异步逻辑快速原型验证声明式表达开发效率高团队 SQL 技能强于 Java 技能降低上手门槛需要统一批流逻辑同一 SQL 可在两种模式下运行频繁变更业务逻辑SQL 变更无需重新编译部署 Jar六、混用架构模式SQL 与 DataStream 混用在实际生产中我们常常会将Flink SQL与DataStream API 搭配使用SQL 做主体 UDF 补充DataStream 为骨架 SQL 做聚合分析// Table → DataStream Table resultTable tableEnv.sqlQuery(SELECT * FROM orders WHERE amount 100); DataStreamRow resultStream tableEnv.toDataStream(resultTable); // DataStream → Table DataStreamOrder orderStream env.addSource(...); Table orderTable tableEnv.fromDataStream(orderStream, Schema.newBuilder() .column(orderId, DataTypes.STRING()) .column(amount, DataTypes.DECIMAL(10, 2)) .columnByExpression(proc_time, PROCTIME()) .watermark(event_time, event_time - INTERVAL 5 SECOND) .build()); tableEnv.createTemporaryView(orders, orderTable);混用时的注意事项toDataStream() 时 SQL 层的优化边界在此截断后续 DataStream 操作不再享受 SQL 优化器的优化fromDataStream() 时需要明确定义 Schema 映射特别是时间属性和水位线混用时 uid 管理变得复杂SQL 自动生成的 uid 在拓扑变更时可能不稳定