知识卡片
语义注解向优化器声明字段流向
内容
Flink的优化器无法直接读懂一个自定义函数内部到底对字段做了什么处理,语义注解就是开发者主动向优化器”报备”这些信息的手段:ForwardedFields声明某个输入字段原封不动地被转发到输出的哪个位置,NonForwardedFields声明哪些字段不会被转发(即输出中不再包含它们),ReadFields声明哪些字段的值被读取参与了计算判断但没有被修改。拿到这些信息后,优化器就可以判断某些原本以为需要的数据重分区、排序等操作其实可以省略,从而生成更高效的执行计划。这本质上是一种”开发者用少量显式声明换取编译器/优化器更激进优化空间”的设计,代价是声明必须准确——一旦标注和函数实际行为不一致,优化器会基于错误信息做出错误优化,反而让程序结果不正确或变慢。
参考来源
《Flink入门与实战》第6章《DataStream API和DataSet API》